# OpenVibe.VIP — environment (development: .env; production: /etc/openvibe/vip.env). # Names only here; never commit a value. # ── Runtime ────────────────────────────────────────────── NODE_ENV=development PORT=4620 HOST=127.0.0.1 BASE_URL=http://localhost:4620 # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh vip: the runtime role through PgBouncer, # the owner on a direct connection (migrations), and Valkey (shared limit counters). # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite. DATABASE_URL= DATABASE_DIRECT_URL= VALKEY_URL= VALKEY_PREFIX= # TRUST_PROXY=1 # ── OpenVibe.Network (identity) ────────────────────────── OV_NETWORK_URL=https://openvibe.network OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 # OV_NETWORK_ISSUER=https://openvibe.network # OV_NETWORK_PUBLIC_KEY= # optional; otherwise fetched from /api/.well-known/jwks # VIP_AUDIENCE=openvibe.vip # Client `vip`: service tokens (Billing, Events, Network) and browser sign-in OV_OAUTH_CLIENT_ID=vip OV_OAUTH_CLIENT_SECRET= # OV_OAUTH_REDIRECT_URI=https://openvibe.vip/auth/callback # Signs the pages' anti-forgery tokens (required in production): openssl rand -hex 32 VIP_FORM_SECRET= # Staff who manage network plans and see any creator's members hold staff.site.configure in the # contracts staff map (Network admins); VIP_STAFF_ROLES is gone. # ── OpenVibe.Billing (entitlement truth, checkout, cancel) ── BILLING_URL=http://127.0.0.1:4600 # OpenVibe.Media: the image on a members-only post (the bytes live in Media, under the VIP_MEDIA_APP tenant). OV_MEDIA_URL=https://openvibe.media OV_MEDIA_INTERNAL_URL=http://127.0.0.1:4100 VIP_MEDIA_APP=vip # BILLING_AUDIENCE=openvibe.billing # VIP_BILLING_TIMEOUT_MS=5000 # Providers offered on plan pages (must be enabled on Billing); `credit` pays from Vibes credit. # Leave EMPTY until Billing is authoritative (Wave 8 cutover): checkout is then closed. # optional: unset = 'powerchat,credit'; set but empty = no checkout (before launch) # VIP_CHECKOUT_PROVIDERS= # Turns Billing's PowerChat checkout_ref into a link: {ref} and {cents} # optional: empty = no PowerChat link # VIP_POWERCHAT_LINK_TEMPLATE= # VIP_BILLING_RATES_TTL_MS=300000 # ── Entitlement projection ─────────────────────────────── # A projection answer is trusted at most this long after VIP last heard from Billing (and never # past the paid period's end); within the grace a projection-only check still answers (stale), # after it VIP answers "unknown" until Billing confirms. # optional: defaults to 900000 # VIP_PROJECTION_MAX_AGE_MS=900000 # optional: defaults to 60000 # VIP_PROJECTION_GRACE_MS=60000 # ── OpenVibe.Events ────────────────────────────────────── # Outbox relay (vip.plan.published, vip.membership.changed); off when empty EVENTS_URL= # EVENTS_RELAY_INTERVAL_MS=2000 # Signing secret of VIP's Billing-event subscriptions (scripts/subscribe.js); comma-separate to rotate VIP_EVENTS_SECRET= # ── Jobs ───────────────────────────────────────────────── # VIP_JOBS=off # VIP_REFRESH_INTERVAL_MS=60000 # ── Public card, badge and widget (/embed) ─────────────── # The widget's CSP frame-ancestors: any site by default (it is meant to be embedded); e.g. # "https://openvibe.live https://*.openvibe.network" to restrict it. The rest of VIP stays 'self'. # VIP_WIDGET_FRAME_ANCESTORS=* # How long a creator's member count (from Billing) is reused # VIP_MEMBER_COUNT_TTL_MS=300000 # ── IndexNow (openvibe-shared/indexnow) ────────────────── # With a key (8-128 hex or alphanumeric characters, what IndexNow's own tools generate), search # engines are told the moment a published plan appears, changes or is archived (the key file is served # at /.txt). Unset: off — nothing is mounted and nothing is sent. #INDEXNOW_KEY= # ── Per-actor limits (server/api/actor-limits.js) ─────── # Reads one caller (a service principal, a person, else an address) may make to /api/v1 per minute # and per hour; past them 429 rate_limited with Retry-After. Entitlement checks, policy evaluation, # checkout and catalog changes have their own numbers (README). # optional: defaults to 120 # VIP_LIMITS_MINUTE=120 # optional: defaults to 3000 # VIP_LIMITS_HOUR=3000