diff --git a/.env.production b/.env.production index 0bc4570..78d6f0b 100644 --- a/.env.production +++ b/.env.production @@ -1,4 +1,3 @@ PUBLIC_RELAY_URL="https://relay.quic.video" # Generate with: cargo run --bin moq-token -- --key root.jwk sign --root "demo" --subscribe "" -#PUBLIC_RELAY_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsInB1YiI6bnVsbCwic3ViIjoiIiwiZXhwIjpudWxsLCJpYXQiOm51bGx9.igFi_TB6UndjY7o2H5OipJKeN-jxue9EQUgVSVHM0NA" -PUBLIC_RELAY_TOKEN="" +PUBLIC_RELAY_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsInB1YiI6bnVsbCwic3ViIjoiIiwiZXhwIjpudWxsLCJpYXQiOm51bGx9.w6NCqef736qNYCC1KAovUbTaJb8bvHnY-QwXZ_p3vTw" diff --git a/infra/input.tf b/infra/input.tf index 019fb2c..1c941b8 100644 --- a/infra/input.tf +++ b/infra/input.tf @@ -25,12 +25,12 @@ variable "domain" { variable "docker_relay" { description = "Docker image for moq-relay" - default = "docker.io/kixelated/moq-relay:0.8.0" + default = "docker.io/kixelated/moq-relay:0.8.5" } variable "docker_hang" { description = "Docker image for hang" - default = "docker.io/kixelated/hang:0.2.0" + default = "docker.io/kixelated/hang:0.2.3" } # Too complicated to specify via flags, so do it here. diff --git a/infra/pub.tf b/infra/pub.tf index e11b507..9f03415 100644 --- a/infra/pub.tf +++ b/infra/pub.tf @@ -32,8 +32,8 @@ resource "google_compute_instance" "pub" { region = local.pub.region # A token used to publish demo/bbb.hang - # cargo run --bin moq-token -- --key root.jwk sign --root "demo" --publish "" > demo.jwt - demo_token = trimspace(file("demo.jwt")) + # cargo run --bin moq-token -- --key root.jwk sign --root "demo" --publish "" > demo-pub.jwt + demo_token = trimspace(file("demo-pub.jwt")) }) } diff --git a/infra/pub.yml.tpl b/infra/pub.yml.tpl index fe5a028..55e8bed 100644 --- a/infra/pub.yml.tpl +++ b/infra/pub.yml.tpl @@ -1,26 +1,66 @@ #cloud-config write_files: - - path: /etc/systemd/system/hang-bbb.service + - path: /etc/systemd/system/hang-bbb-prepare.service permissions: 0644 owner: root content: | [Unit] - Description=Run hang-bbb via docker + Description=Prepare video for hang-bbb Requires=docker.service After=docker.service + Before=hang-bbb.service + + [Service] + Type=oneshot + RemainAfterExit=yes + WorkingDirectory=/tmp + ExecStart=/bin/bash -c '\ + # Download the video \ + docker run --rm -v /tmp:/tmp alpine:latest \ + wget -nv "$${URL:-http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4}" \ + -O /tmp/tmp.mp4 && \ + # Fragment the video \ + docker run --rm -v /tmp:/tmp linuxserver/ffmpeg:latest \ + -y -loglevel error -i /tmp/tmp.mp4 \ + -c copy \ + -f mp4 -movflags cmaf+separate_moof+delay_moov+skip_trailer+frag_every_frame \ + /tmp/fragmented.mp4 && \ + rm -f /tmp/tmp.mp4' + + - path: /etc/systemd/system/hang-bbb.service + permissions: 0644 + owner: root + content: | + [Unit] + Description=Run hang-bbb via docker + Requires=docker.service hang-bbb-prepare.service + After=docker.service hang-bbb-prepare.service [Service] - ExecStart=docker run --rm \ - --name hang-bbb \ - --network="host" \ - --pull=always \ - --cap-add=SYS_PTRACE \ - -e RUST_LOG=debug -e RUST_BACKTRACE=1 \ - -e REGION=${region} \ - --entrypoint hang-bbb \ - ${docker_image} \ - publish --url "https://relay.quic.video/anon" --name "bbb" + ExecStart=/bin/bash -c '\ + docker run --rm -v /tmp:/tmp:ro linuxserver/ffmpeg:latest \ + -stream_loop -1 \ + -hide_banner \ + -v quiet \ + -re \ + -i /tmp/fragmented.mp4 \ + -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:text='${region}: %%{gmtime: %%H\\:%%M\\:%%S.%%3N}':x=(W-tw)-24:y=24:fontsize=48:fontcolor=white:box=1:boxcolor=black@0.5" \ + -an \ + -b:v 3M \ + -preset ultrafast \ + -tune zerolatency \ + -f mp4 \ + -movflags cmaf+separate_moof+delay_moov+skip_trailer+frag_every_frame \ + - | \ + docker run --rm -i \ + --name hang-bbb \ + --network="host" \ + --pull=always \ + --cap-add=SYS_PTRACE \ + -e RUST_LOG=debug -e RUST_BACKTRACE=1 \ + ${docker_image} \ + hang publish --url "https://relay.quic.video/anon" --name "bbb"' ExecStop=docker stop hang-bbb @@ -51,4 +91,5 @@ write_files: runcmd: - systemctl daemon-reload - systemctl restart docker + - systemctl start hang-bbb-prepare - systemctl start hang-bbb diff --git a/package.json b/package.json index 149fbd8..8513b66 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@astrojs/rss": "^4.0.12", "@astrojs/solid-js": "5.1.0", "@astrojs/tailwind": "6.0.2", - "@kixelated/hang": "^0.3.0", + "@kixelated/hang": "^0.3.2", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/typography": "^0.5.16", "astro": "^5.8.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7f58bd..13ca4a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: 6.0.2 version: 6.0.2(astro@5.8.2(@types/node@22.15.29)(jiti@1.21.7)(rollup@4.41.1)(typescript@5.8.3)(yaml@2.8.0))(tailwindcss@3.4.17) '@kixelated/hang': - specifier: ^0.3.0 - version: 0.3.0(@types/react@19.1.8)(solid-js@1.9.7) + specifier: ^0.3.2 + version: 0.3.2(@types/react@19.1.8)(solid-js@1.9.7) '@tailwindcss/forms': specifier: ^0.5.10 version: 0.5.10(tailwindcss@3.4.17) @@ -525,13 +525,13 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@kixelated/hang@0.3.0': - resolution: {integrity: sha512-FFdiiKYgV4Og4IE5n6PgKGBTpHgzNAd41UQ2u4Ega9RS/pyoO7dLmW2MS5bFPvoGuaRWduK35to3G4VYHNbSDQ==} + '@kixelated/hang@0.3.2': + resolution: {integrity: sha512-pWtxsKXBMqSDqj3ZGCvKg5XlLQikk3nGvEEafqKVRUD/ZDmLNzqlZ9DC7Y0aV/VISa5GDCwP1cfLR3vjBACAyA==} peerDependencies: solid-js: ^1.9.7 - '@kixelated/moq@0.7.0': - resolution: {integrity: sha512-y0S/M4lKjz5UwcNlX1bRlAoNgGDL+AMq2YJPQ2uHAPlLHqODYx8ihqBWf76/JHbJSdyaP/UwE+xAnT5ujIOrTQ==} + '@kixelated/moq@0.7.1': + resolution: {integrity: sha512-y1WT8Uq7/jX1lQd12BPh3D9LmN5bPDGJS2PrM3PTx+yhDTNC7gUTUFnVE/KSZx5dHE45fBtNqUi8vtaoWyIPPg==} '@kixelated/signals@0.3.1': resolution: {integrity: sha512-ZtCps9UwqVi94nVGydzxP4FAwGKvDV3YSZvDaXCXyuCvthy04LOpxmLo1nT3TS1IcSTOqv5v6ZbiPSdYtkv9Ew==} @@ -2400,8 +2400,8 @@ packages: zod@3.25.51: resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.0.5: + resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2857,18 +2857,18 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@kixelated/hang@0.3.0(@types/react@19.1.8)(solid-js@1.9.7)': + '@kixelated/hang@0.3.2(@types/react@19.1.8)(solid-js@1.9.7)': dependencies: - '@kixelated/moq': 0.7.0 + '@kixelated/moq': 0.7.1 '@kixelated/signals': 0.3.1(@types/react@19.1.8)(solid-js@1.9.7) buffer: 6.0.3 solid-js: 1.9.7 - zod: 3.25.76 + zod: 4.0.5 transitivePeerDependencies: - '@types/react' - react - '@kixelated/moq@0.7.0': {} + '@kixelated/moq@0.7.1': {} '@kixelated/signals@0.3.1(@types/react@19.1.8)(solid-js@1.9.7)': dependencies: @@ -5217,6 +5217,6 @@ snapshots: zod@3.25.51: {} - zod@3.25.76: {} + zod@4.0.5: {} zwitch@2.0.4: {}