openvibers/openvibe.services .env.example
.env.example
| 1 | # ═══════════════════════════════════════════════════════════════ |
| 2 | # openvibe.services — Environment Configuration |
| 3 | # Copy to .env for development. In production this lives at /etc/openvibe/services.env (0600). |
| 4 | # Names only here; never commit a value. |
| 5 | # ═══════════════════════════════════════════════════════════════ |
| 6 | |
| 7 | # Server |
| 8 | PORT=4930 |
| 9 | HOST=127.0.0.1 |
| 10 | NODE_ENV=development |
| 11 | BASE_URL=http://localhost:4930 |
| 12 | # Cloudflare and nginx sit in front in production. |
| 13 | TRUST_PROXY=2 |
| 14 | |
| 15 | # ── Data: PostgreSQL (ADR-035) ────────────────────────────── |
| 16 | # Host's roles/add-service.sh writes both in production. Unset in development: an embedded PGlite |
| 17 | # database in data/pglite (one process). Tests need neither. |
| 18 | DATABASE_URL= |
| 19 | DATABASE_DIRECT_URL= |
| 20 | |
| 21 | # ── Identity: OpenVibe.Network ────────────────────────────── |
| 22 | OV_NETWORK_URL=https://openvibe.network |
| 23 | # The origin Services asks about project membership (GET /api/v1/projects/:project, with the caller's |
| 24 | # own user token) and reads the signing key from (GET /api/.well-known/jwks). |
| 25 | OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 |
| 26 | #OV_NETWORK_ISSUER=https://openvibe.network |
| 27 | # Audience Services answers for: incoming service tokens must carry it. |
| 28 | SERVICES_AUDIENCE=openvibe.services |
| 29 | # Services' own Network client `services`: sign-in (authorization code + PKCE, redirect |
| 30 | # BASE_URL/auth/callback), the events relay, and one client-credentials token per authority audience |
| 31 | # (openvibe.network, openvibe.media, …) for the index. Unset in development: nobody can sign in, events wait |
| 32 | # in the outbox, and every authority that requires a token is reported partial (ADR-046 section 6). |
| 33 | OV_OAUTH_CLIENT_ID=services |
| 34 | OV_OAUTH_CLIENT_SECRET= |
| 35 | #OV_OAUTH_REDIRECT_URI=https://openvibe.services/auth/callback |
| 36 | COOKIE_SECURE=false |
| 37 | # Signs the per-person form token (CSRF). Required in production; unset in development: a random key per process. |
| 38 | SERVICES_FORM_SECRET= |
| 39 | # Staff who set trust tiers (besides Network admins holding staff.site.configure): usr_ subjects, comma-separated. |
| 40 | SERVICES_STAFF_SUBJECTS= |
| 41 | |
| 42 | # ── Valkey (ADR-035): per-actor limit counters; optional ──── |
| 43 | VALKEY_URL= |
| 44 | VALKEY_PREFIX=ov:services: |
| 45 | #SERVICES_LIMITS_MINUTE=120 |
| 46 | #SERVICES_LIMITS_HOUR=3000 |
| 47 | |
| 48 | # ── Playgrounds and the project archive ───────────────────── |
| 49 | # Playgrounds call Events and Media with the APP's own token; the defaults are the public origins in the |
| 50 | # pinned contracts. The archive reads Media and Events on loopback with Network's read-only export tokens. |
| 51 | #SERVICES_PLAYGROUND_EVENTS_URL=https://openvibe.events |
| 52 | #SERVICES_PLAYGROUND_MEDIA_URL=https://openvibe.media |
| 53 | #SERVICES_PLAYGROUND_MAX_UPLOAD_BYTES=1048576 |
| 54 | #SERVICES_PLAYGROUND_RUNS_PER_HOUR=60 |
| 55 | #SERVICES_EXPORT_MEDIA_URL=http://127.0.0.1:4100 |
| 56 | #SERVICES_EXPORT_EVENTS_URL=http://127.0.0.1:4300 |
| 57 | #SERVICES_REGISTRY_TTL_MS=30000 |
| 58 | |
| 59 | # ── Search engines ────────────────────────────────────────── |
| 60 | # IndexNow: with a key, public release changes ping the engines and /<key>.txt is served. Unset: off. |
| 61 | INDEXNOW_KEY= |
| 62 | |
| 63 | # ── The authorities (plan T13 step 6) ─────────────────────── |
| 64 | # An authority is a service whose pinned openvibe-contracts manifest lists <id>.resource.read as |
| 65 | # active; its loopback origin comes from that manifest. SERVICES_<ID>_URL overrides one for the |
| 66 | # operator (the id uppercased, '-' -> '_'): |
| 67 | #SERVICES_NETWORK_URL=http://127.0.0.1:4000 |
| 68 | #SERVICES_MEDIA_URL=http://127.0.0.1:4100 |
| 69 | #SERVICES_EVENTS_URL=http://127.0.0.1:4300 |
| 70 | #SERVICES_HOST_URL=http://127.0.0.1:4910 |
| 71 | |
| 72 | # ── The resource index ────────────────────────────────────── |
| 73 | # The per-authority page size the fan-out asks for, how many authorities are read at once, and how long |
| 74 | # one authority may take before its rows are omitted and it is named in X-OpenVibe-Partial-Authorities. |
| 75 | SERVICES_INDEX_PAGE_SIZE=100 |
| 76 | SERVICES_INDEX_CONCURRENCY=4 |
| 77 | SERVICES_INDEX_TIMEOUT_MS=5000 |
| 78 | # The caller-facing page size: default and ceiling. |
| 79 | SERVICES_INDEX_DEFAULT_LIMIT=100 |
| 80 | SERVICES_INDEX_MAX_LIMIT=1000 |
| 81 | # How long the membership question to Network may take before the person-facing path answers 503. |
| 82 | SERVICES_NETWORK_TIMEOUT_MS=5000 |
| 83 | |
| 84 | # ── OpenVibe.Events ───────────────────────────────────────── |
| 85 | # The outbox relay publishes services.app.published|deprecated|revoked and services.moderation.action with |
| 86 | # Services' own service token. Without EVENTS_URL (or the OAuth secret) events wait in services_events_outbox. |
| 87 | EVENTS_URL= |
| 88 | #SERVICES_EVENTS_ENABLED=1 |
| 89 | #EVENTS_RELAY_INTERVAL_MS=2000 |
| 90 | # OpenVibe.Events → Services (ADR-033 account export and deletion): signs a delivery to POST /internal/events |
| 91 | # (comma-separated for rotation, 32+ characters each). Unset: the route answers 503 and no subscription is created. |
| 92 | #SERVICES_EVENTS_SECRET= |
| 93 |