# ═══════════════════════════════════════════════════════════════ # openvibe.blog — environment configuration (names only; never commit values) # Copy to .env for development. Production: /etc/openvibe/blog.env (0600). # ═══════════════════════════════════════════════════════════════ # Server PORT=4810 HOST=127.0.0.1 NODE_ENV=development # Public origin: canonical URLs, feeds, sitemaps and JSON-LD are built from it BASE_URL=http://localhost:4810 # Proxy hops that set X-Forwarded-For (Cloudflare → nginx → Node = 2) TRUST_PROXY=2 # Per-actor limits (server/http/actor-limits.js): API reads one caller (a person, a service or app # acting as itself, else an address) may make per minute and per hour; past them 429 rate_limited with # Retry-After. Writes have their own numbers (README). The per-address limits stay. #BLOG_LIMITS_MINUTE=120 #BLOG_LIMITS_HOUR=3000 # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh blog: 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 (BLOG_PGLITE_DIR overrides it). DATABASE_URL= DATABASE_DIRECT_URL= VALKEY_URL= VALKEY_PREFIX= # OpenVibe.Network — SSO (OAuth2), JWKS, client-credentials tokens OV_NETWORK_URL=https://openvibe.network OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 # OAuth client `blog` (redirect https://openvibe.blog/auth/callback). The same client is Blog's # service principal svc:blog for client-credentials grants (see README, "Grants"). OV_OAUTH_CLIENT_ID=blog OV_OAUTH_CLIENT_SECRET= # Production: https://openvibe.blog/auth/callback (default: BASE_URL + /auth/callback) #OV_OAUTH_REDIRECT_URI= # Cookies: Secure by default in production; set false for plain-http local development #COOKIE_SECURE=false # Signs the editor/comment form tokens (CSRF). Unset: random per process. #BLOG_FORM_SECRET= # The official blog (served at /): owners are Network subjects (usr_…), comma-separated BLOG_OFFICIAL_OWNERS= #BLOG_OFFICIAL_TITLE=The OpenVibe blog #BLOG_OFFICIAL_DESCRIPTION=News and release notes from the OpenVibe network. # OpenVibe.Media — attachments are Media object ids; bytes are served by Media OV_MEDIA_URL=https://openvibe.media OV_MEDIA_INTERNAL_URL=http://127.0.0.1:4100 # Media tenant/namespace for Blog's objects (media.object.read is granted for it) # optional: defaults to 'blog' # BLOG_MEDIA_APP=blog #BLOG_MEDIA_VERIFY_INTERVAL_MS=600000 # OpenVibe.Community — comment threads (referenced, never copied) # optional: defaults to https://openvibe.community # OV_COMMUNITY_URL=https://openvibe.community OV_COMMUNITY_INTERNAL_URL=http://127.0.0.1:4200 # OpenVibe.Events — the outbox relay runs only when EVENTS_URL and OV_OAUTH_CLIENT_SECRET are set #EVENTS_URL=http://127.0.0.1:4300 # OpenVibe.Events → Blog (ADR-033 account export and deletion): signs a delivery to POST /internal/events # (comma-separated for rotation, 32+ characters each). Unset: the route answers 503 and no subscription is created. #BLOG_EVENTS_SECRET= #EVENTS_RELAY_INTERVAL_MS=2000 # Scheduled publication worker (in-process); off: BLOG_WORKER=off #BLOG_WORKER=on #BLOG_SCHEDULE_INTERVAL_MS=15000 #BLOG_WORKER_ID= # Members-only posts: 'vip' (default when OV_OAUTH_CLIENT_SECRET is set) asks OpenVibe.VIP # (grant vip.resource.policy.evaluate on openvibe.vip); 'none' admits only the blog's members and # staff. Every doubt (VIP down, no grant, no owner) is a refusal. #BLOG_ENTITLEMENTS_PROVIDER=vip #OV_VIP_INTERNAL_URL=http://127.0.0.1:4620 #OV_VIP_URL=https://openvibe.vip #BLOG_VIP_TIMEOUT_MS=2000 # A cached "yes" lives at most this long (the convergence bound after VIP stops granting) #BLOG_VIP_CACHE_TTL_MS=30000 #BLOG_VIP_CACHE_DENY_TTL_MS=10000 #BLOG_VIP_CACHE_UNAVAILABLE_TTL_MS=2000 # Browser origins that may call /api/v1 with a Bearer Network JWT #API_CORS_ORIGINS=https://openvibe.network,https://openvibe.live,https://openvibe.community,https://openvibe.media # IndexNow (openvibe-shared/indexnow): with a key, search engines are told the moment a public page # appears, changes or leaves the index (the key file is served at /.txt). Unset: off. #INDEXNOW_KEY= # release.json (openvibe-shared/release): the deployed commit when git is not available #RELEASE_COMMIT= #MIN_CLIENT_RELEASE=