openvibers/openvibe.exchange .env.example
.env.example
| 1 | # OpenVibe.Exchange — environment (production: /etc/openvibe/exchange.env). Names only; never commit values. |
| 2 | |
| 3 | NODE_ENV=production |
| 4 | PORT=5150 |
| 5 | HOST=127.0.0.1 |
| 6 | BASE_URL=https://openvibe.exchange |
| 7 | TRUST_PROXY=2 |
| 8 | # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh: the runtime role through PgBouncer, |
| 9 | # the owner on a direct connection (migrations), and Valkey (shared limit counters). |
| 10 | # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite. |
| 11 | DATABASE_URL= |
| 12 | DATABASE_DIRECT_URL= |
| 13 | VALKEY_URL= |
| 14 | VALKEY_PREFIX=ov:exchange: |
| 15 | # Per-address limits (server/app.js) and the chat's per-person limit on top. |
| 16 | #EXCHANGE_RATE_LIMIT_PER_MIN=300 |
| 17 | #EXCHANGE_CHAT_PER_DAY=40 |
| 18 | #EXCHANGE_CHAT_MODELS=3 |
| 19 | #EXCHANGE_CHAT_MAX_CHARS=8000 |
| 20 | |
| 21 | # OpenVibe.Network: SSO (OAuth client `exchange`, PKCE S256) and its JWKS; the client-credentials token for |
| 22 | # OpenVibe.AI is made from the same client secret (Network grants it ai.run.create, ns ai.complete). |
| 23 | OV_NETWORK_URL=https://openvibe.network |
| 24 | OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 |
| 25 | # OV_NETWORK_ISSUER=https://openvibe.network |
| 26 | OV_OAUTH_CLIENT_ID=exchange |
| 27 | OV_OAUTH_CLIENT_SECRET= |
| 28 | # OV_OAUTH_REDIRECT_URI=https://openvibe.exchange/auth/callback |
| 29 | # EXCHANGE_AUDIENCE=openvibe.exchange |
| 30 | # OV_SESSION_AUDIENCE=openvibe.network |
| 31 | # EXCHANGE_PGLITE_DIR=./data/pglite |
| 32 | |
| 33 | # OpenVibe.AI: the public catalog and usage reads, and the ai.complete runs a chat or a Try it makes on the |
| 34 | # person's behalf. The reads are public; the runs carry this service's token (OV_OAUTH_CLIENT_SECRET). |
| 35 | #OV_AI_URL=https://ai.openvibe.services |
| 36 | #OV_AI_AUDIENCE=openvibe.ai |
| 37 | #OV_AI_SCOPE=ai.run.create |
| 38 | # OpenVibe.Sources: the github source's repository rankings and its live GitHub search (category code). |
| 39 | # Exchange's own client-credentials grant (sources.item.read) reads it over loopback; nothing here calls GitHub. |
| 40 | #OV_SOURCES_URL=http://127.0.0.1:4720 |
| 41 | #OV_SOURCES_AUDIENCE=openvibe.sources |
| 42 | #OV_SOURCES_SCOPE=sources.item.read |
| 43 | #EXCHANGE_CODE_REPOS_CACHE_MS=60000 |
| 44 | #EXCHANGE_CODE_SEARCH_CACHE_MS=600000 |
| 45 | #EXCHANGE_CODE_SEARCH_PER_MIN=20 |
| 46 | |
| 47 | # The owner console uses this Exchange service grant to read/write AI's admin JSON API. |
| 48 | # Network grants these capabilities to the existing `exchange` client; keep this scope to the needed AI capabilities. |
| 49 | #OV_AI_CONSOLE_SCOPE=ai.usage.read ai.workflow.manage ai.provider.manage |
| 50 | #EXCHANGE_AI_TIMEOUT_MS=30000 |
| 51 | #EXCHANGE_AI_WAIT_MS=25000 |
| 52 | |
| 53 | # OpenVibe.Report: the public AI performance rows behind a model's Measured panel, and a signed-in person's own |
| 54 | # AI usage (their Network session token is forwarded; no service token is involved). A public row floor of 20 |
| 55 | # calls in 30 days; the performance rows are cached for five minutes. |
| 56 | #OV_REPORT_URL=https://openvibe.report |
| 57 | #EXCHANGE_REPORT_TIMEOUT_MS=2000 |
| 58 | #EXCHANGE_REPORT_CACHE_MS=300000 |
| 59 | |
| 60 | # /openapi.json reads the API host's document and keeps it for ten minutes. |
| 61 | #OV_EXCHANGE_API_URL=https://api.openvibe.exchange |
| 62 | #OV_EXCHANGE_OPENAPI_URL=https://api.openvibe.exchange/openapi.json |
| 63 | #EXCHANGE_OPENAPI_CACHE_MS=600000 |
| 64 | #EXCHANGE_OPENAPI_TIMEOUT_MS=15000 |
| 65 | |
| 66 | # OpenVibe.Events: account export/deletion deliveries to POST /internal/events. The secret signs a delivery |
| 67 | # (comma-separated for rotation, 32+ characters each; unset makes the route answer 503). |
| 68 | EXCHANGE_EVENTS_SECRET= |
| 69 | EXCHANGE_EVENTS_URL= |
| 70 | #EXCHANGE_EVENTS_ENDPOINT=http://127.0.0.1:5150/internal/events |
| 71 | #EXCHANGE_EVENTS_INTERVAL_MS=5000 |
| 72 | |
| 73 | # A restore drill starts no subscriptions and creates no Events subscription. |
| 74 | # EXCHANGE_DRILL=0 |
| 75 | |
| 76 | # OpenVibe.Chat: the companions' answers are read aloud in each character's own voice. The call carries |
| 77 | # the person's own Network token, so the read-aloud is on their own allowance and on Chat's per-person rate |
| 78 | # limit. The site's own voices only; a cloned voice is never asked for here. |
| 79 | #OV_CHAT_URL=https://openvibe.chat |
| 80 | #EXCHANGE_TTS_TIMEOUT_MS=20000 |
| 81 | |
| 82 | # The companions' images (step 6 of the design): OFF until an image provider is configured. While the switch is |
| 83 | # off no provider is ever called and the route refuses with the reason. |
| 84 | #EXCHANGE_COMPANIONS_IMAGES_ENABLED=false |
| 85 | #EXCHANGE_COMPANIONS_IMAGES_PROVIDER= |
| 86 | |
| 87 | # optional: defaults to true in production |
| 88 | # COOKIE_SECURE=true |
| 89 | |
| 90 | # openvibe.compare: the comparison site is served by this same service behind its own name (its vhost |
| 91 | # deploy/nginx/openvibe.compare.conf proxies to this process). The host makes a request the compare site's. |
| 92 | #COMPARE_HOST=openvibe.compare |
| 93 | #COMPARE_BASE_URL=https://openvibe.compare |
| 94 | |
| 95 | # IndexNow (openvibe-shared/indexnow): a key lets a new page or a changed sitemap be submitted for recrawl. |
| 96 | # Unset → off; nothing is mounted and nothing is sent. The key file is served at /<key>.txt. |
| 97 | #INDEXNOW_KEY= |
| 98 |