openvibers/openvibe.media Commits
Align version pins and declare shield, lineage and paste-route env vars (#13)
Changes
@@@ -29,6 +29,9 @@ MEDIA_DATA_DIR=./dataVOD_PATH=./data/vodsCLIPS_PATH=./data/clipsPASTES_PATH=./data/pastes++# Where pastes live now (2026-09-22): /p/:slug and /p/:slug/raw 301 there when set. Stored screenshot++# bytes under PASTES_PATH/screenshots are still served; every write to the paste API answers 410.++#PASTES_MOVED_TO=https://openvibe.communityTHUMBNAILS_PATH=./data/thumbnailsFILES_PATH=./data/files@@@ -47,6 +50,11 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000MEDIA_OWNER_SUBJECT_SYNC=MEDIA_OWNER_SUBJECT_INTERVAL_MIN=10++# OpenVibe.Live lineage (server/lineage-client.js): channel owners are resolved through Live's canonical++# resolver with Media's service token (OV_OAUTH_CLIENT_ID / OV_OAUTH_CLIENT_SECRET, audience++# openvibe.live, OV_LIVE_INTERNAL_URL) instead of a local username mapping. MEDIA_LINEAGE=off disables it.++MEDIA_LINEAGE=++# ── Tenant (app) seeding ─────────────────────────────────────# JSON array, upserted into the `apps` table on every boot (api_key is hashed,# never stored in plaintext). allowed_origins guards browser (user-JWT) calls.@@@ -87,6 +95,13 @@ MEDIA_R2_SECRET_ACCESS_KEY=# removes a provider from every class whose requirements its last completed probe failed. Enforce only after the# production results were read: S3-compatible APIs differ, and If-Range especially.MEDIA_CAPABILITY_GATE=report++# Media shield (server/placement/shield.js): hand eligible public reads to the nginx edge cache++# (X-Accel-Redirect) instead of streaming them from this process, for the comma-separated providers++# listed. It answers only on MEDIA_SHIELD_HOST (a DNS-only edge name, never through Cloudflare's proxy);++# MEDIA_SHIELD_REFRESH_URL is the loopback purge listener used to refresh cached slices.++#MEDIA_SHIELD=b2++#MEDIA_SHIELD_HOST=edge.openvibe.media++#MEDIA_SHIELD_REFRESH_URL=http://127.0.0.1:8479# ── Recording knobs (defaults match the inherited recorder) ──# VOD_STOP_GRACE_MS=60000@@@ -44,8 +44,8 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pgexport and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay andthe account and revocation subscriptions)- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host--- `openvibe-contracts` v0.76.0, `openvibe-sdk` v0.21.2 (tokens, events outbox, per-actor limits),-- `openvibe-shared` v1.28.0, pinned by release tarball++- `openvibe-contracts` v0.79.0, `openvibe-sdk` v0.21.2 (tokens, events outbox, per-actor limits),++ `openvibe-shared` v2.3.1, pinned by release tarball## Capabilities@@@ -111,7 +111,7 @@ server/vod.duration.reconcile (stored vs measured durations, local and B2/R2),storage.orphans.scan (monthly storage orphan report, service-wide, report only)client-ip.js trust proxy = loopback; req.ip is the only client address--(openvibe-shared v1.25.0, openvibe-contracts v0.71.0, openvibe-sdk v0.12.0: pinned release tarballs, installed by npm)++(openvibe-shared v2.3.1, openvibe-contracts v0.79.0, openvibe-sdk v0.21.2: pinned release tarballs, installed by npm)scripts/smoke-test.sh end-to-end smoke test (boots a temp instance)scripts/reconcile-objects.js / object-invariant.js / object-drift-report.js / no-good-copy-report.js object-model operator toolsscripts/media-jobs.js list jobs, run the size-invariant scan (dry run by default), approve/cancel proposals@@@ -6,7 +6,7 @@"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg","port": 4100,"domain": "openvibe.media",-- "contracts": "openvibe-contracts v0.76.0",++ "contracts": "openvibe-contracts v0.79.0","capabilities": ["media.object.upload","media.object.read",
@@ -29,6 +29,9 @@ MEDIA_DATA_DIR=./data
@@ -29,6 +29,9 @@ MEDIA_DATA_DIR=./data
VOD_PATH=./data/vods
VOD_PATH=./data/vods
CLIPS_PATH=./data/clips
CLIPS_PATH=./data/clips
PASTES_PATH=./data/pastes
PASTES_PATH=./data/pastes
+# Where pastes live now (2026-09-22): /p/:slug and /p/:slug/raw 301 there when set. Stored screenshot
+# bytes under PASTES_PATH/screenshots are still served; every write to the paste API answers 410.
+#PASTES_MOVED_TO=https://openvibe.community
THUMBNAILS_PATH=./data/thumbnails
THUMBNAILS_PATH=./data/thumbnails
FILES_PATH=./data/files
FILES_PATH=./data/files
@@ -47,6 +50,11 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000
@@ -47,6 +50,11 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000
MEDIA_OWNER_SUBJECT_SYNC=
MEDIA_OWNER_SUBJECT_SYNC=
MEDIA_OWNER_SUBJECT_INTERVAL_MIN=10
MEDIA_OWNER_SUBJECT_INTERVAL_MIN=10
+# OpenVibe.Live lineage (server/lineage-client.js): channel owners are resolved through Live's canonical
+# resolver with Media's service token (OV_OAUTH_CLIENT_ID / OV_OAUTH_CLIENT_SECRET, audience
+# openvibe.live, OV_LIVE_INTERNAL_URL) instead of a local username mapping. MEDIA_LINEAGE=off disables it.
+MEDIA_LINEAGE=
+
# ── Tenant (app) seeding ─────────────────────────────────────
# ── Tenant (app) seeding ─────────────────────────────────────
# JSON array, upserted into the `apps` table on every boot (api_key is hashed,
# JSON array, upserted into the `apps` table on every boot (api_key is hashed,
# never stored in plaintext). allowed_origins guards browser (user-JWT) calls.
# never stored in plaintext). allowed_origins guards browser (user-JWT) calls.
@@ -87,6 +95,13 @@ MEDIA_R2_SECRET_ACCESS_KEY=
@@ -87,6 +95,13 @@ MEDIA_R2_SECRET_ACCESS_KEY=
# removes a provider from every class whose requirements its last completed probe failed. Enforce only after the
# removes a provider from every class whose requirements its last completed probe failed. Enforce only after the
# production results were read: S3-compatible APIs differ, and If-Range especially.
# production results were read: S3-compatible APIs differ, and If-Range especially.
MEDIA_CAPABILITY_GATE=report
MEDIA_CAPABILITY_GATE=report
+# Media shield (server/placement/shield.js): hand eligible public reads to the nginx edge cache
+# (X-Accel-Redirect) instead of streaming them from this process, for the comma-separated providers
+# listed. It answers only on MEDIA_SHIELD_HOST (a DNS-only edge name, never through Cloudflare's proxy);
+# MEDIA_SHIELD_REFRESH_URL is the loopback purge listener used to refresh cached slices.
+#MEDIA_SHIELD=b2
+#MEDIA_SHIELD_HOST=edge.openvibe.media
+#MEDIA_SHIELD_REFRESH_URL=http://127.0.0.1:8479
# ── Recording knobs (defaults match the inherited recorder) ──
# ── Recording knobs (defaults match the inherited recorder) ──
# VOD_STOP_GRACE_MS=60000
# VOD_STOP_GRACE_MS=60000
@@ -44,8 +44,8 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pg
@@ -44,8 +44,8 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pg
export and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay and
export and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay and
the account and revocation subscriptions)
the account and revocation subscriptions)
- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host
- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host
-- `openvibe-contracts` v0.76.0, `openvibe-sdk` v0.21.2 (tokens, events outbox, per-actor limits),
- `openvibe-shared` v1.28.0, pinned by release tarball
+- `openvibe-contracts` v0.79.0, `openvibe-sdk` v0.21.2 (tokens, events outbox, per-actor limits),
+ `openvibe-shared` v2.3.1, pinned by release tarball
## Capabilities
## Capabilities
@@ -111,7 +111,7 @@ server/
@@ -111,7 +111,7 @@ server/
vod.duration.reconcile (stored vs measured durations, local and B2/R2),
vod.duration.reconcile (stored vs measured durations, local and B2/R2),
storage.orphans.scan (monthly storage orphan report, service-wide, report only)
storage.orphans.scan (monthly storage orphan report, service-wide, report only)
client-ip.js trust proxy = loopback; req.ip is the only client address
client-ip.js trust proxy = loopback; req.ip is the only client address
-(openvibe-shared v1.25.0, openvibe-contracts v0.71.0, openvibe-sdk v0.12.0: pinned release tarballs, installed by npm)
+(openvibe-shared v2.3.1, openvibe-contracts v0.79.0, openvibe-sdk v0.21.2: pinned release tarballs, installed by npm)
scripts/smoke-test.sh end-to-end smoke test (boots a temp instance)
scripts/smoke-test.sh end-to-end smoke test (boots a temp instance)
scripts/reconcile-objects.js / object-invariant.js / object-drift-report.js / no-good-copy-report.js object-model operator tools
scripts/reconcile-objects.js / object-invariant.js / object-drift-report.js / no-good-copy-report.js object-model operator tools
scripts/media-jobs.js list jobs, run the size-invariant scan (dry run by default), approve/cancel proposals
scripts/media-jobs.js list jobs, run the size-invariant scan (dry run by default), approve/cancel proposals
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg",
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg",
"port": 4100,
"port": 4100,
"domain": "openvibe.media",
"domain": "openvibe.media",
- "contracts": "openvibe-contracts v0.76.0",
+ "contracts": "openvibe-contracts v0.79.0",
"capabilities": [
"capabilities": [
"media.object.upload",
"media.object.upload",
"media.object.read",
"media.object.read",