# OpenVibe.MediaHub — environment (production: /etc/openvibe/media-hub.env). Names only; never commit values. NODE_ENV=production PORT=4990 HOST=127.0.0.1 BASE_URL=https://openvibe.download TRUST_PROXY=2 # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh media-hub: 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=ov:media-hub: # Per-caller limits (server/http/caller-limits.js): requests one caller may make to the API per minute and per hour. #MEDIAHUB_LIMITS_MINUTE=120 #MEDIAHUB_LIMITS_HOUR=3000 # OpenVibe.Network: SSO (OAuth client `media-hub`, PKCE S256) and its JWKS; app tokens for audience openvibe.download. OV_NETWORK_URL=https://openvibe.network OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 OV_OAUTH_CLIENT_ID=media-hub OV_OAUTH_CLIENT_SECRET= # OV_OAUTH_REDIRECT_URI=https://openvibe.download/auth/callback # MEDIAHUB_AUDIENCE=openvibe.download # OpenVibe.Events: the ADR-033 account export/deletion deliveries (POST /internal/events, v2 signature, loopback # only). Without it the route answers 503 and Events retries. MEDIAHUB_EVENTS_SECRET= # Where the two account export/deletion subscriptions are created at boot (OpenVibe.Events, loopback on the host). MEDIAHUB_EVENTS_URL= # ── OpenVibe.Media: where the bytes live ──────────────────── # The host-internal address of the Media object API. MediaHub calls it with its Network service token. # Grant [media-hub, media.object.upload, openvibe.media] and [media-hub, media.object.read, openvibe.media] # on namespace media-hub. Media's `media-hub` tenant holds the bytes. MEDIAHUB_MEDIA_URL=http://127.0.0.1:4100 # The public origin Media's /t/ cover URLs are made absolute on. MEDIAHUB_MEDIA_PUBLIC_URL=https://openvibe.media MEDIAHUB_MEDIA_APP=media-hub #MEDIAHUB_MEDIA_TIMEOUT_MS=30000 # ── Per person (Media's quotas are per tenant, so these are enforced here) ── #MEDIAHUB_QUOTA_BYTES=26843545600 #MEDIAHUB_MAX_FILE_BYTES=2147483648 #MEDIAHUB_UPLOADS_PER_DAY=50 #MEDIAHUB_MAX_SHARES=20 # The most a plain form may post in one request; keep it in step with client_max_body_size for # `location = /files/upload` in deploy/nginx/openvibe.download.conf. Larger files go up in parts. #MEDIAHUB_SINGLE_UPLOAD_BYTES=268435456 # One part of a chunked upload. Media requires at least 5 MB and at most 256 MB; MediaHub clamps to that range. #MEDIAHUB_PART_BYTES=8388608 # How long an unfinished chunked upload may be resumed. #MEDIAHUB_UPLOAD_TTL_SECONDS=21600 # Where a no-JavaScript upload is spooled before it goes to Media (default: the system temp directory). #MEDIAHUB_TMP_DIR= # optional: defaults to true in production # COOKIE_SECURE=true # ── OpenVibe.Video: public watch pages for OpenVibe.Live's recordings and clips ── # Served by Host header on openvibe.video; Live is called server-side, signed out. liveUrl and chatUrl # are the host-internal addresses (production sets them to the loopback address); links people click # use livePublicUrl. MEDIAHUB_VIDEO_URL=https://openvibe.video # Where "Edit in Studio" goes for a finished upload (the hand-off route). MEDIAHUB_STUDIO_URL=https://openvibe.studio # On by default. Set off to hide the Edit in Studio action while leaving the hand-off API. # MEDIAHUB_STUDIO_VIDEO_EDIT=off # The AI cut of an upload (server/video/cut.js): edited copies made here with ffmpeg, one at a time under nice. #VIDEO_CUTS=off #VIDEO_CUTS_PER_DAY=5 #VIDEO_CUTS_MAX_SOURCE_SECONDS=10800 #VIDEO_CUTS_SILENCE_DB=40 #VIDEO_CUTS_THREADS=2 MEDIAHUB_LIVE_URL=https://openvibe.live MEDIAHUB_LIVE_PUBLIC_URL=https://openvibe.live MEDIAHUB_CHAT_URL=https://openvibe.live # IndexNow for openvibe.video (8–128 letters and digits): new watch pages are sent to search engines. Unset: off. #INDEXNOW_KEY= # ── OpenVibe.Pics (openvibe.pics, server/pics) ── # Served by Host header on openvibe.pics. Pictures are private Media objects served through this process. MEDIAHUB_PICS_URL=https://openvibe.pics #MEDIAHUB_PICS_MAX_IMAGE_BYTES=20971520 #MEDIAHUB_PICS_MAX_PIXELS=100000000 #MEDIAHUB_PICS_QUOTA_BYTES=5368709120 #MEDIAHUB_PICS_IMAGES_PER_DAY=200 #MEDIAHUB_PICS_ALBUMS_MAX=200 #MEDIAHUB_PICS_ALBUM_IMAGES_MAX=500 #MEDIAHUB_PICS_REPORTS_TO_HIDE=3 # Alt text drafted by OpenVibe.AI when the uploader asks (needs OV_AI_INTERNAL_URL): off with off; a daily cap. #MEDIAHUB_PICS_AI=off #MEDIAHUB_PICS_AI_PER_DAY=300 # Signed-out uploads stay off (unset) until the DMCA designated agent and the CSAM hash-matching account exist. #MEDIAHUB_PICS_ANONYMOUS=1 #MEDIAHUB_PICS_ANONYMOUS_MAX_IMAGE_BYTES=10485760 #MEDIAHUB_PICS_ANONYMOUS_PER_DAY=20 #MEDIAHUB_PICS_ANONYMOUS_IDLE_DAYS=30