Add deployment README for darkness.services setup
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
# SafeTwitch Deployment Notes (darkness.services)
|
||||
|
||||
This document describes the practical changes made in this repo to stabilize and run SafeTwitch reliably on `safetwitch.darkness.services` and `api.safetwitch.darkness.services`.
|
||||
|
||||
## Goals
|
||||
|
||||
- Keep the stack self-hostable with Docker Compose.
|
||||
- Improve live playback reliability (especially around ads and quality switches).
|
||||
- Restore useful search behavior even when backend search responses are empty.
|
||||
- Keep clearnet and onion routes available.
|
||||
|
||||
## Infrastructure and Build Changes
|
||||
|
||||
### 1. Frontend image is built locally
|
||||
|
||||
Files:
|
||||
- `docker/Dockerfile`
|
||||
- `docker/docker-compose.yml`
|
||||
|
||||
Changes:
|
||||
- Node build stage moved to `node:22`.
|
||||
- Frontend build command changed to `npm run build-only` for consistent container builds.
|
||||
- Frontend services in compose now use local image build (`safetwitch-local:latest`).
|
||||
|
||||
Why:
|
||||
- Ensures source-level fixes are actually deployed, instead of being masked by a prebuilt image.
|
||||
|
||||
### 2. Frontend reverse proxy behavior fixed
|
||||
|
||||
File:
|
||||
- `docker/nginx.conf`
|
||||
|
||||
Changes:
|
||||
- Added explicit forwarding for:
|
||||
- `/api/` -> backend API
|
||||
- `/proxy/` -> backend proxy
|
||||
|
||||
Why:
|
||||
- Some playlists and media URLs are emitted as frontend-host paths (`/proxy/...`).
|
||||
- Without these proxy routes, users see missing images/icons and stalled stream playback.
|
||||
|
||||
### 3. Compose routing and service layout
|
||||
|
||||
File:
|
||||
- `docker/docker-compose.yml`
|
||||
|
||||
Changes:
|
||||
- Clearnet and tor frontend/backend services retained.
|
||||
- Traefik labels and host routing aligned for:
|
||||
- `safetwitch.darkness.services`
|
||||
- `api.safetwitch.darkness.services`
|
||||
- onion equivalents
|
||||
|
||||
## Playback and UX Reliability Changes
|
||||
|
||||
### 4. Player recovery logic for stuck live streams
|
||||
|
||||
File:
|
||||
- `src/components/VideoPlayer.vue`
|
||||
|
||||
Changes:
|
||||
- Added auto-recovery handlers for media stall scenarios:
|
||||
- `waiting`, `stalled`, `error`, and live `ended` transitions.
|
||||
- Added watchdog loop for live streams:
|
||||
- if time does not advance for several seconds, attempt recovery.
|
||||
- Recovery strategy:
|
||||
- soft resume with `play()`
|
||||
- hard resume by reloading source, then seeking appropriately and resuming.
|
||||
|
||||
Why:
|
||||
- Prevents cases where ad transitions or stream discontinuities leave the player hanging until manual restart.
|
||||
|
||||
### 5. Quality selector stability and defaults
|
||||
|
||||
Files:
|
||||
- `src/assets/qualitySelector.ts`
|
||||
- `src/settingsManager.ts`
|
||||
- `src/locales/en.json`
|
||||
|
||||
Changes:
|
||||
- Added explicit `Auto` quality option.
|
||||
- Default quality changed to `Auto` for new settings.
|
||||
- Quality selection now behaves as an adaptive cap (selected quality and below), not a brittle single-rendition lock.
|
||||
- Added safer startup fallback when chosen quality is unavailable.
|
||||
- Ensure playback resumes after quality changes.
|
||||
|
||||
Why:
|
||||
- Reduces buffering and prevents quality-switch dead-ends.
|
||||
|
||||
### 6. Live status fallback for stale backend `api/users`
|
||||
|
||||
Files:
|
||||
- `src/views/UserView.vue`
|
||||
- `src/components/StreamPreview.vue`
|
||||
|
||||
Changes:
|
||||
- If `api/users` reports offline or missing stream, fallback to `api/users/isLive/bulk`.
|
||||
- For confirmed live users without stream metadata, synthesize minimal stream data to avoid UI breakage.
|
||||
|
||||
Why:
|
||||
- Handles backend variants where user detail endpoints can be stale while bulk live status is still accurate.
|
||||
|
||||
## Search Fixes
|
||||
|
||||
### 7. Frontend search page hardening
|
||||
|
||||
File:
|
||||
- `src/views/SearchPageView.vue`
|
||||
|
||||
Changes:
|
||||
- Search now re-runs when query changes (route watcher).
|
||||
- Added fallback behavior when backend search returns empty:
|
||||
- user lookup
|
||||
- category matching from discover data
|
||||
|
||||
Why:
|
||||
- Avoids blank pages from route update edge cases or empty backend responses.
|
||||
|
||||
### 8. Backend-level search fallback service
|
||||
|
||||
Files:
|
||||
- `docker/search-fallback/server.mjs`
|
||||
- `docker/docker-compose.yml`
|
||||
|
||||
Changes:
|
||||
- Added `safetwitch-search-fallback` service.
|
||||
- Traefik routes `/api/search` requests to this service (clearnet + tor API hosts).
|
||||
- Fallback service behavior:
|
||||
- use backend search first
|
||||
- if empty, perform targeted fallback lookups
|
||||
- includes numeral normalization (`4` <-> `IV`) for queries like `diablo 4` and `Diablo IV`.
|
||||
|
||||
Why:
|
||||
- Provides a backend-level mitigation without replacing the rest of the API stack.
|
||||
|
||||
## Operational Notes
|
||||
|
||||
- If the UI appears stale after deployment, do a hard refresh (`Ctrl+Shift+R`).
|
||||
- For HLS diagnostics, use real `GET` checks. `HEAD` may be misleading for some playlist endpoints.
|
||||
- Existing users may keep old local settings until changed in Settings.
|
||||
|
||||
## Validation Checklist
|
||||
|
||||
- `https://safetwitch.darkness.services` loads.
|
||||
- `https://safetwitch.darkness.services/api/discover` returns JSON.
|
||||
- Live playback resumes after quality change.
|
||||
- Live playback recovers after ad transition/stall.
|
||||
- `https://api.safetwitch.darkness.services/api/search/?query=diablo+4` returns category data.
|
||||
- Onion routes remain available for frontend/backend tor services.
|
||||
Reference in New Issue
Block a user