chore: initialize backlog with completed tasks and testing follow-ups

TASK-1 through TASK-6: completed work (project setup, deployment, domain,
R2 bucket, rSpace footer, UFW port).
TASK-7 through TASK-10: testing tasks (OBS streaming, archive pipeline,
FFmpeg streaming, video library).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-15 14:12:45 -07:00
parent e9efc991eb
commit f8ab3916eb
11 changed files with 234 additions and 0 deletions

16
backlog/config.yml Normal file
View File

@ -0,0 +1,16 @@
project_name: "rTube Online"
default_status: "To Do"
statuses: ["To Do", "In Progress", "Done"]
labels: []
milestones: []
date_format: yyyy-mm-dd
max_column_width: 20
default_editor: "nvim"
auto_open_browser: true
default_port: 6420
remote_operations: true
auto_commit: false
bypass_git_hooks: false
check_active_branches: true
active_branch_days: 30
task_prefix: "task"

View File

@ -0,0 +1,16 @@
---
id: TASK-1
title: Set up rtube-online Next.js project
status: Done
assignee: []
created_date: '2026-02-15 21:11'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Create Next.js 14 landing page with r*stack pattern: hero, how-it-works, features, ecosystem footer. Video library demo page ported from video-player Flask app. Live streaming viewer with HLS.js. API routes for R2 video listing and proxying with range requests.
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,30 @@
---
id: TASK-10
title: Test video library with uploaded content
status: To Do
assignee: []
created_date: '2026-02-15 21:12'
labels: []
dependencies: []
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Test the video library page with manually uploaded content:
1. Upload a test video directly to R2: rclone copy test.mp4 r2:rtube-videos/
2. Visit rtube.online/demo
3. Verify the video appears in the sidebar list
4. Click to play — verify video playback with seeking (range requests)
5. Test search/filter functionality
6. Test download and copy link buttons
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Uploaded video appears in /api/videos response
- [ ] #2 Video plays in the demo page player with seeking support
- [ ] #3 Download button works
- [ ] #4 Copy link button copies correct URL
<!-- AC:END -->

View File

@ -0,0 +1,16 @@
---
id: TASK-2
title: Deploy rtube-online to Netcup
status: Done
assignee: []
created_date: '2026-02-15 21:11'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Docker Compose with 3 services: rtube (Next.js), nginx-rtmp (RTMP ingest + HLS), archive-worker (stream→R2). Security hardened (cap_drop ALL, no-new-privileges, read_only). Traefik labels for rtube.online. Deployed at /opt/apps/rtube-online/ on Netcup.
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,16 @@
---
id: TASK-3
title: Onboard rtube.online domain
status: Done
assignee: []
created_date: '2026-02-15 21:11'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Purchased on Porkbun, nameservers pointed to Cloudflare (stan/tessa). Zone ID: ce8c3c5abe7aa7791841b87457a259bf. CNAME records for @ and www pointing to Cloudflare tunnel. Tunnel config updated via API to route rtube.online and www.rtube.online to Traefik.
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,16 @@
---
id: TASK-4
title: Create rtube-videos R2 bucket and configure credentials
status: Done
assignee: []
created_date: '2026-02-15 21:11'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Created rtube-videos R2 bucket in Cloudflare (EU region). Generated scoped R2 API token (Object Read & Write). Configured .env at /opt/apps/rtube-online/.env with R2_ENDPOINT, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY. Configured rclone r2 remote on Netcup for archive worker. Endpoint: https://0e7b3338d5278ed1b148e6456b940913.eu.r2.cloudflarestorage.com
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,16 @@
---
id: TASK-5
title: Update rSpace.online ecosystem footer
status: Done
assignee: []
created_date: '2026-02-15 21:11'
labels: []
dependencies: []
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Added rCal (rcal.jeffemmett.com) and rTube (rtube.online) links to the r* ecosystem footer in /home/jeffe/Github/rSpace-website/components/footer.tsx. Also stripped Vercel remnants from README and package.json. Committed and pushed to GitHub (auto-mirrors to Gitea).
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,16 @@
---
id: TASK-6
title: Open UFW port 1936 for RTMP ingest
status: Done
assignee: []
created_date: '2026-02-15 21:12'
labels: []
dependencies: []
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Opened TCP port 1936 on Netcup UFW firewall for RTMP ingest. nginx-rtmp maps host 1936 to container 1935. OBS streams to rtmp://rtube.online:1936/live.
<!-- SECTION:DESCRIPTION:END -->

View File

@ -0,0 +1,32 @@
---
id: TASK-7
title: Test OBS → rTube live streaming
status: To Do
assignee: []
created_date: '2026-02-15 21:12'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
End-to-end test of RTMP streaming workflow:
1. Open OBS Studio, set Service to Custom
2. Server: rtmp://rtube.online:1936/live
3. Stream Key: test-stream
4. Start streaming from OBS
5. Open rtube.online/live in browser, enter key "test-stream"
6. Verify HLS playback works with low latency
7. Verify LIVE indicator shows on the page
8. Stop stream and verify clean disconnect
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 OBS connects to rtmp://rtube.online:1936/live without error
- [ ] #2 HLS player at /live loads and plays the stream
- [ ] #3 Stream playback has acceptable latency (<10s)
- [ ] #4 Stopping stream shows appropriate error/ended message in viewer
<!-- AC:END -->

View File

@ -0,0 +1,33 @@
---
id: TASK-8
title: Test stream auto-archive to R2
status: To Do
assignee: []
created_date: '2026-02-15 21:12'
labels: []
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Verify the archive worker pipeline works end-to-end:
1. Stream via OBS or FFmpeg to rtmp://rtube.online:1936/live/test-archive
2. Stream for at least 30 seconds, then stop
3. Check archive-worker logs: docker logs rtube-archive
4. Verify FLV→MP4 conversion completed
5. Verify MP4 uploaded to r2:rtube-videos/streams/
6. Verify local FLV and MP4 cleaned up from /recordings volume
7. Check rtube.online/demo — archived video should appear in the library
8. Play the archived video from the demo page
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Archive worker receives on_publish_done callback from nginx-rtmp
- [ ] #2 FLV recording is converted to MP4 via ffmpeg
- [ ] #3 MP4 is uploaded to rtube-videos R2 bucket under streams/ prefix
- [ ] #4 Archived video appears in /api/videos listing
- [ ] #5 Video plays back correctly from /demo page
<!-- AC:END -->

View File

@ -0,0 +1,27 @@
---
id: TASK-9
title: Test FFmpeg → rTube streaming
status: To Do
assignee: []
created_date: '2026-02-15 21:12'
labels: []
dependencies: []
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Test RTMP ingest using FFmpeg (alternative to OBS):
1. From any machine with ffmpeg:
ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://rtube.online:1936/live/ffmpeg-test
2. Verify stream appears in nginx-rtmp stats: curl http://rtube-rtmp:8080/stat
3. Watch from rtube.online/live with key "ffmpeg-test"
4. Verify playback works
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 FFmpeg successfully connects and streams to RTMP endpoint
- [ ] #2 Stream is viewable via HLS at /live page
<!-- AC:END -->