openvibers/openvibe.network .env.example
.env.example
| 1 | # ═══════════════════════════════════════════════════════════════ |
| 2 | # openvibe.network — Environment Configuration |
| 3 | # Copy to .env and fill in values. No secrets belong in this file. |
| 4 | # Production env lives at /etc/openvibe/network.env (mode 0600). |
| 5 | # ═══════════════════════════════════════════════════════════════ |
| 6 | |
| 7 | # Server |
| 8 | PORT=4000 |
| 9 | HOST=0.0.0.0 |
| 10 | NODE_ENV=development |
| 11 | BASE_URL=http://localhost:4000 |
| 12 | OV_NETWORK_URL=http://localhost:4000 |
| 13 | OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 |
| 14 | OV_NETWORK_LOGIN_URL=http://localhost:4000 |
| 15 | |
| 16 | # IndexNow (openvibe-shared/indexnow): 8–128 letters or digits. Set, the key file answers at |
| 17 | # /<key>.txt; unset, it is off and nothing is served. The key goes in /etc/openvibe/network.env only. |
| 18 | INDEXNOW_KEY= |
| 19 | |
| 20 | # Per-actor limits on API writes by a person's session (server/auth/actor-limits.js, roadmap WS-R task 4), |
| 21 | # per minute and per hour; account, project, theme, avatar, follow and block writes have tighter numbers of their own. |
| 22 | #NETWORK_LIMITS_MINUTE=120 |
| 23 | #NETWORK_LIMITS_HOUR=3000 |
| 24 | |
| 25 | # Sign in on another device (server/auth/qr-signin.js): a QR on one device, a scan on another and a two-digit match. |
| 26 | # Off unless this is explicitly on; off means /auth/qr/* and /q are not mounted. |
| 27 | # NETWORK_QR_SIGNIN=1 |
| 28 | |
| 29 | # Security — CHANGE THESE IN PRODUCTION |
| 30 | # /internal/* takes capability-scoped service tokens; the shared internal key is retired (plan T2). |
| 31 | SETUP_TOKEN=change-me-to-a-second-random-secret |
| 32 | BOOTSTRAP_PROFILE=local-dev |
| 33 | |
| 34 | # Project secrets (ADR-056, server/developer/secrets.js): 32 random bytes, base64 or hex (openssl rand -base64 32). |
| 35 | # Unset = project secrets are off (503 secrets.unavailable). Changing it makes every stored secret unreadable. |
| 36 | # NETWORK_SECRETS_KEY= |
| 37 | |
| 38 | # Developer projects (docs/developer-projects.md) |
| 39 | # Audiences that accept sandbox app tokens, comma-separated. Leave it UNSET for the code default |
| 40 | # (openvibe.media,openvibe.events,openvibe.tools); set it to an empty value to accept none. |
| 41 | # DEV_SANDBOX_AUDIENCES=openvibe.media,openvibe.events,openvibe.tools,openvibe.services,openvibe.ai,openvibe.quest,openvibe.play |
| 42 | # Public capabilities every project's SANDBOX apps may hold without staff, comma-separated. Leave it |
| 43 | # UNSET for the code default (media.object.upload/read, events.app.publish/read/subscribe, |
| 44 | # tools.job.create/read/cancel; ids the installed contracts do not define are skipped); empty = none. |
| 45 | # Production apps only ever use the staff-set project allowance. |
| 46 | # DEV_SANDBOX_ALLOWANCE=media.object.upload,media.object.read,events.app.publish,events.app.read,events.app.subscribe,tools.job.create,tools.job.read,tools.job.cancel |
| 47 | # Seconds a rotated client secret keeps working (0..604800; default 86400) |
| 48 | DEV_CREDENTIAL_OVERLAP_S=86400 |
| 49 | # Public capabilities every new project's allowance starts with, comma-separated. Empty = staff grant each one. |
| 50 | DEV_DEFAULT_ALLOWANCE= |
| 51 | DEV_MAX_PROJECTS_PER_OWNER=10 |
| 52 | DEV_MAX_APPS_PER_PROJECT=20 |
| 53 | # First-party services (OAuth client ids) that may host a project member's agents, comma-separated |
| 54 | # (docs/t2-projects-and-grants.md). Leave it UNSET for the code default (actor); empty = none. |
| 55 | # AGENT_HOST_SERVICES=actor |
| 56 | # OpenVibe.Events base URL for relaying developer-project events (network.app.*, network.credential.*, |
| 57 | # network.grant.changed). Unset = no relay (events stay in dev_audit and are backfilled once it is set). |
| 58 | # OV_EVENTS_INTERNAL_URL=http://127.0.0.1:4300 |
| 59 | |
| 60 | # Admin account auto-created on first run |
| 61 | ADMIN_USERNAME=admin |
| 62 | ADMIN_PASSWORD=change-me |
| 63 | |
| 64 | # Owner account (gates owner-only admin areas: Deploy, SSH, secrets) |
| 65 | OWNER_USERNAME= |
| 66 | |
| 67 | # PostgreSQL (ADR-035, plan T2), written by OpenVibe.Host roles/data/add-service.sh network: the runtime |
| 68 | # role through PgBouncer, the owner on a direct connection (migrations), and Valkey (shared limit counters). |
| 69 | # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite (PGLITE_DIR overrides it); |
| 70 | # production refuses to boot. |
| 71 | DATABASE_URL= |
| 72 | DATABASE_DIRECT_URL= |
| 73 | VALKEY_URL= |
| 74 | #VALKEY_PREFIX=ov:network: |
| 75 | |
| 76 | # Paths (relative to project root) |
| 77 | DATA_DIR=data |
| 78 | AVATAR_PATH=data/avatars |
| 79 | JWT_PRIVATE_KEY=data/keys/private.pem |
| 80 | JWT_PUBLIC_KEY=data/keys/public.pem |
| 81 | |
| 82 | # Public service URLs (defaults shown; override for local dev / white-label) |
| 83 | #OV_LIVE_URL=https://openvibe.live |
| 84 | #OV_TOOLS_URL=https://openvibe.tools |
| 85 | #OV_GAMES_URL=https://openvibe.games |
| 86 | #OV_MEDIA_URL=https://openvibe.media |
| 87 | |
| 88 | # Connected services (internal, not proxied through Cloudflare) |
| 89 | OV_LIVE_INTERNAL_URL=http://127.0.0.1:3000 |
| 90 | OV_TOOLS_INTERNAL_URL=http://127.0.0.1:4001 |
| 91 | OV_GAMES_INTERNAL_URL=http://127.0.0.1:8000 |
| 92 | OV_MEDIA_INTERNAL_URL=http://127.0.0.1:4100 |
| 93 | OV_CHAT_INTERNAL_URL=http://127.0.0.1:4400 |
| 94 | # OpenVibe.Mail: the account home's Receipts card reads the person's own receipt summaries here. |
| 95 | OV_MAIL_INTERNAL_URL=http://127.0.0.1:5250 |
| 96 | # The publication reviewer queue (/admin/review): each product's staff review-queue endpoint. |
| 97 | OV_WIKI_INTERNAL_URL=http://127.0.0.1:4800 |
| 98 | OV_BLOG_INTERNAL_URL=http://127.0.0.1:4810 |
| 99 | OV_NEWS_INTERNAL_URL=http://127.0.0.1:4820 |
| 100 | OV_TRADE_INTERNAL_URL=http://127.0.0.1:4860 |
| 101 | |
| 102 | # Optional: SSH admin-tab context (non-secret display values) |
| 103 | #SSH_SERVER_HOST= |
| 104 | #SSH_PROJECTS_ROOT=/opt/openvibe.network /opt/openvibe.live |
| 105 | |
| 106 | # openvibe.my is Network's own first-party OAuth client 'my' (redirect https://openvibe.my/auth/callback). |
| 107 | # The client row and its secret are seeded in oauth_clients and read from there at boot; nothing needs setting. |
| 108 | # To change the secret, rotate the row (setup/service-principal.js rotate my, WITHOUT --write-env) and restart. |
| 109 | #OV_MY_OAUTH_CLIENT_ID=my |
| 110 | #OV_MY_OAUTH_CLIENT_SECRET= |
| 111 | #OV_MY_URL=https://openvibe.my |
| 112 | |
| 113 | # ═══════════════════════════════════════════════════════════════ |
| 114 | # Provider secrets (server/secrets.js). Each one is read from its variable first; the admin |
| 115 | # panel's database copy is only a fallback, and the panel cannot change one set here. In |
| 116 | # production put them in /etc/openvibe/network.env; scripts/secrets-out-of-db.js then blanks |
| 117 | # the database copies (README "Provider secrets"). |
| 118 | # ═══════════════════════════════════════════════════════════════ |
| 119 | #RESEND_API_KEY= |
| 120 | #RESEND_WEBHOOK_SECRET= |
| 121 | #DISCORD_BOT_TOKEN= |
| 122 | #DISCORD_OAUTH_CLIENT_SECRET= |
| 123 | #VAPID_PRIVATE_KEY= |
| 124 | #VAPID_PUBLIC_KEY= (optional: derived from VAPID_PRIVATE_KEY) |
| 125 | |
| 126 | # ═══════════════════════════════════════════════════════════════ |
| 127 | # Email Notifications (optional) |
| 128 | # |
| 129 | # From-addresses are managed through the admin panel; the Resend API key is RESEND_API_KEY |
| 130 | # above (or, as a fallback, the admin panel). |
| 131 | # ═══════════════════════════════════════════════════════════════ |
| 132 | |
| 133 | # ═══════════════════════════════════════════════════════════════ |
| 134 | # Notifications |
| 135 | # ═══════════════════════════════════════════════════════════════ |
| 136 | # Enable/disable the notification system globally |
| 137 | NOTIFICATIONS_ENABLED=true |
| 138 | # Days to keep old notifications before cleanup (default: 30) |
| 139 | NOTIFICATION_MAX_AGE_DAYS=30 |
| 140 | # Only send emails for CRITICAL priority notifications (recommended) |
| 141 | NOTIFICATION_EMAIL_CRITICAL_ONLY=true |
| 142 | |
| 143 | # ═══════════════════════════════════════════════════════════════ |
| 144 | # RSA Key Generation (run once during setup): |
| 145 | # |
| 146 | # mkdir -p data/keys |
| 147 | # openssl genrsa -out data/keys/private.pem 2048 |
| 148 | # openssl rsa -in data/keys/private.pem -pubout -out data/keys/public.pem |
| 149 | # |
| 150 | # The private key stays on openvibe.network only. Other services verify |
| 151 | # tokens OFFLINE via the JWKS endpoint (/api/.well-known/jwks). |
| 152 | # ═══════════════════════════════════════════════════════════════ |
| 153 | |
| 154 | # ═══════════════════════════════════════════════════════════════ |
| 155 | # OpenVibe Link on Android (server/auth/app-links.js) |
| 156 | # ═══════════════════════════════════════════════════════════════ |
| 157 | # The SHA-256 fingerprints of the certificate that signs the RELEASE build of network.openvibe.link, comma-separated, |
| 158 | # colon-hex (AA:BB:…). They are what /.well-known/assetlinks.json publishes so Android hands the https:// |
| 159 | # openvibe.network/link/auth sign-in return to the app alone; the certificates are public values, not secrets. |
| 160 | # |
| 161 | # Leave it unset until the owner's release key exists. With no fingerprint, Android verifies nothing, /link/auth opens |
| 162 | # this site's page, and OpenVibe Link gets the extension's read-only Dock token instead of a session. |
| 163 | # LINK_ANDROID_CERT_SHA256=AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99 |
| 164 |