openvibers/openvibe.run .env.example
.env.example
| 1 | # ═══════════════════════════════════════════════════════════════ |
| 2 | # openvibe.run — Environment Configuration |
| 3 | # Copy to .env for development. In production this lives at /etc/openvibe/run.env (0600). |
| 4 | # Names only here; never commit a value. |
| 5 | # ═══════════════════════════════════════════════════════════════ |
| 6 | |
| 7 | # Server |
| 8 | PORT=4920 |
| 9 | HOST=127.0.0.1 |
| 10 | NODE_ENV=development |
| 11 | BASE_URL=http://localhost:4920 |
| 12 | TRUST_PROXY=1 |
| 13 | |
| 14 | # ── Data: PostgreSQL + Valkey (ADR-035) ────────────────────── |
| 15 | # In production OpenVibe.Host writes all four (roles/data/add-service.sh run). Unset in development: |
| 16 | # an embedded PGlite database in data/pglite (one process). Tests need neither. |
| 17 | DATABASE_URL= |
| 18 | DATABASE_DIRECT_URL= |
| 19 | VALKEY_URL= |
| 20 | VALKEY_PREFIX=ov:run: |
| 21 | |
| 22 | # ── Identity: OpenVibe.Network ────────────────────────────── |
| 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 | # Optional: pin the Network's RS256 public key (PEM, \n escaped) instead of fetching the JWKS. |
| 27 | #OV_NETWORK_PUBLIC_KEY= |
| 28 | # Audience Run accepts on incoming service tokens; a token must also name a project (project_id). |
| 29 | RUN_AUDIENCE=openvibe.run |
| 30 | OV_OAUTH_CLIENT_ID=run |
| 31 | OV_OAUTH_CLIENT_SECRET= |
| 32 | #COOKIE_SECURE=true |
| 33 | |
| 34 | # ── OpenVibe.Events ───────────────────────────────────────── |
| 35 | # Relay of Run's outbox (run.job.*); off when unset (rows wait in run_events_outbox). |
| 36 | #EVENTS_URL=http://127.0.0.1:4300 |
| 37 | #EVENTS_RELAY_INTERVAL_MS=2000 |
| 38 | |
| 39 | # ── Jobs ──────────────────────────────────────────────────── |
| 40 | # Background jobs: the events relay and the dispatcher's poller. RUN_JOBS=off runs the API alone. |
| 41 | #RUN_JOBS=on |
| 42 | |
| 43 | # ── GitHub checks on shared nodes (server/checks/) ────────── |
| 44 | # RUN_SECRETS_KEY seals the checks App's private key, webhook secret and installation tokens at rest: |
| 45 | # one 32-byte key, base64 (standard or URL-safe) or 64 hex characters. Unset: /admin/checks says so and |
| 46 | # POST /webhooks/github answers 503. RUN_CHECKS_PROJECT is the project a check job belongs to. |
| 47 | #RUN_SECRETS_KEY= |
| 48 | #RUN_CHECKS_PROJECT= |
| 49 | # The repositories/accounts the scheduler accepts (default OpenVibers) and the org the App is registered in. |
| 50 | #RUN_CHECKS_OWNERS=OpenVibers |
| 51 | #RUN_CHECKS_ORG=OpenVibers |
| 52 | # The network owner allowed on /admin/checks: their subject (usr_…), or OWNER_USERNAME (default goosely). |
| 53 | #RUN_CHECKS_OWNER= |
| 54 | #OWNER_USERNAME=goosely |
| 55 | #RUN_CHECKS=off |
| 56 | # The repositories whose checks report live on GitHub (owner/repo, comma-separated, or *). Every other repository is |
| 57 | # in quiet shadow: no queued or in-progress check run, and a finished check that did not succeed shows as neutral |
| 58 | # (the node's own conclusion in its title and in the shadow table), so a shadow check never holds a merge. |
| 59 | #RUN_CHECKS_LIVE= |
| 60 | #RUN_CHECKS_TICK_MS=5000 |
| 61 | #RUN_CHECKS_TIMEOUT_MS=8000 |
| 62 | #RUN_CHECKS_GITHUB_API=https://api.github.com |
| 63 | #RUN_CHECKS_GITHUB_WEB=https://github.com |
| 64 | |
| 65 | # ── Project caps on a job's limits (run.job-create-request@1); over one is 422 run.limits.exceeded ── |
| 66 | #RUN_LIMITS_MAX_WALL_MS=3600000 |
| 67 | #RUN_LIMITS_MAX_CPU_MS=3600000 |
| 68 | #RUN_LIMITS_MAX_MEM_BYTES=4gb |
| 69 | #RUN_LIMITS_MAX_TTL_MS=86400000 |
| 70 | #RUN_LIMITS_MAX_ARGS_BYTES=512kb |
| 71 | |
| 72 | # ── The job stream's ticket (a two-minute single-use RS256 compact JWS Run signs) ── |
| 73 | # A PEM in the environment, or a key file. In production with neither set, stream tickets answer 503 |
| 74 | # (every other route still serves); in development a key is generated in memory at boot. |
| 75 | #RUN_STREAM_PRIVATE_KEY= |
| 76 | #RUN_STREAM_KEY_FILE=data/keys/run-stream.pem |
| 77 | #RUN_STREAM_KEY_ID=run-stream-1 |
| 78 | #RUN_STREAM_TTL_S=120 |
| 79 | #RUN_STREAM_RING_BYTES=1mb |
| 80 | #RUN_STREAM_MAX_PER_JOB=64 |
| 81 | #RUN_STREAM_HEARTBEAT_MS=25000 |
| 82 | |
| 83 | # ── The dispatcher bridge to Bot (plan T14 step 6, R1c) ── |
| 84 | # Bot holds the node link and the meter; Run places each job on a node from the Fabric offers and mirrors |
| 85 | # what Bot answers. Needs OV_OAUTH_CLIENT_SECRET above (Run mints its token for audience openvibe.bot); |
| 86 | # without it nothing is sent and every job stays queued. |
| 87 | #RUN_BOT_URL=http://127.0.0.1:4630 |
| 88 | #RUN_BOT_AUDIENCE=openvibe.bot |
| 89 | #RUN_POLL_MS=1000 |
| 90 | #RUN_DISPATCH_TIMEOUT_MS=8000 |
| 91 | # How long the offers Run places from are cached (one read serves a whole tick). |
| 92 | #RUN_OFFERS_TTL_MS=5000 |
| 93 | # Polls Bot may answer 404 for a job Run sent before that job fails. |
| 94 | #RUN_DISPATCH_UNKNOWN_POLLS=5 |
| 95 | # Jobs one tick places and mirrors; the next tick takes the rest. |
| 96 | #RUN_DISPATCH_MAX_PER_TICK=200 |
| 97 | |
| 98 | # Bot owns the node link and the per-second metering of the jobs it carries (plan T14 L1). |
| 99 | |
| 100 | # ── The managed-browser provider (plan T14 R4a) ── |
| 101 | # Class browser jobs placed on a kind=provider offer named browser-provider go to this API instead of Bot. |
| 102 | # Off while the URL or the key is unset (browser jobs then stay queued). The key lives here only: never in an |
| 103 | # offer, a job or a log. Outside development the URL must be https (or loopback). |
| 104 | #RUN_BROWSER_PROVIDER_URL=https://browser-provider.example/v1 |
| 105 | #RUN_BROWSER_PROVIDER_API_KEY= |
| 106 | #RUN_BROWSER_PROVIDER_TIMEOUT_MS=8000 |
| 107 | |
| 108 | # ── Run's usage relay to Billing (the provider's jobs only; Bot meters its own) ── |
| 109 | # Run mints its own token for audience openvibe.billing (billing.usage.record) from OV_OAUTH_CLIENT_SECRET. |
| 110 | # Unset: the readings wait in run_usage_outbox, nothing is sent, and the jobs still run. |
| 111 | #RUN_BILLING_URL=http://127.0.0.1:4600 |
| 112 | #RUN_BILLING_AUDIENCE=openvibe.billing |
| 113 | #RUN_BILLING_INTERVAL_MS=5000 |
| 114 | #RUN_BILLING_TIMEOUT_MS=8000 |
| 115 | |
| 116 | # ── The Arena's race (compare-arena-ecosystem.md §3) ── |
| 117 | # POST /api/v1/races starts one blind child job per entrant; the judgement is a bench.match@1 recorded on |
| 118 | # Bench (POST /api/v1/matches) with Run's Network client token. That client needs bench.judgement.cast. |
| 119 | # Bench has no matchmaker endpoint yet, so matchmaker: true picks two entrants of different model families |
| 120 | # from this list (comma-separated bench.entrant@1 ids). Unset: matchmaker: true answers 422. |
| 121 | #RUN_RACE_ENTRANTS=model:gpt-5-mini,model:glm-5.3,model:deepseek-flash |
| 122 | # The key for the keyed hash of the person in a judgement (never the person's id). Unset: Run uses its |
| 123 | # Network client secret; set a dedicated key to rotate it without touching the Network client. |
| 124 | #RUN_RACE_HASH_KEY= |
| 125 | #RUN_BENCH_URL=https://bench.openvibe.services |
| 126 | #RUN_BENCH_AUDIENCE=openvibe.bench |
| 127 | #RUN_BENCH_TIMEOUT_MS=8000 |
| 128 | |
| 129 | # ── IndexNow (search engines are told when the public pages change) ── |
| 130 | # 8-128 letters and digits. Unset: nothing is sent and GET /<key>.txt is 404. When set, the key file is served there. |
| 131 | #INDEXNOW_KEY= |
| 132 |