All apps · 0 apps
itsweber-play
Docker app from grtgbln's Repository
Overview
Readme
View on GitHub
ITSWEBER Play
Eigene, maximal anpassbare Video-Plattform als Single-Container-Docker-Stack. Greenfield-Alternative zu PeerTube/MediaCMS — mit 6-Ebenen-Theming-System, First-Run-Setup-Wizard und Multi-Creator-Backend.
Produkt: ITSWEBER Play · https://play.itsweber.net Hersteller: ITSWEBER · Benjamin Weber Lizenz: AGPL-3.0 — Nutzung und Weitergabe erlaubt, Urheber-Attribution ist Pflicht.
© 2026 Benjamin Weber · ITSWEBER
Features
- Next.js 15 (App Router, RSC) · Fastify + tRPC · BullMQ + FFmpeg + yt-dlp · PostgreSQL 16 · Redis 7 · MinIO
- Multi-Creator (Default-Rolle
CREATOR), eigene Channels, Playlists, Shorts - Video-Pipeline: Transcoding, Thumbnails, Captions (whisper.cpp)
- 6-Ebenen-Theming über
packages/theme/tokens.json— Live-Editor im Admin - First-Run-Setup-Wizard (
/setup) mit Admin, Branding, SMTP, Legal, Theme - Sichtbarkeits-Enum
public | unlisted | private | logged_in
Quickstart (Prod — All-in-One-Container)
Ein einziger Container bündelt Postgres, Redis, MinIO, Web, API, Worker
hinter s6-overlay. Nur Port 3000 exposed, alle Daten unter /data.
docker run -d \
--name itsweber-play \
-p 3000:3000 \
-v play-data:/data \
--env-file .env.all-in-one \
ghcr.io/itsweber-official/itsweber-play:latest
Beim ersten Aufruf http://<host>:3000 startet automatisch der Setup-Wizard
unter /setup — Admin anlegen, Branding + SMTP + Legal konfigurieren, fertig.
Details zu Unraid-Deploy: docs/02-deployment-unraid.md
Quickstart (Dev)
cp .env.example .env # Secrets eintragen
docker compose -f docker-compose.dev.yml up -d --build
# oder: make dev
Web-UI: http://localhost:3000 · API: http://localhost:4000 · MinIO: http://localhost:9001
Architektur
NPM (Reverse Proxy)
│
▼ play.itsweber.net → :3000
┌───────────────────────────────────────────┐
│ Single Container (s6-overlay) │
│ ├─ Nginx :3000 (Reverse-Proxy) │
│ ├─ Web :3100 (Next.js 15) │
│ ├─ API :4000 (Fastify + tRPC) │
│ ├─ Worker (BullMQ + FFmpeg) │
│ ├─ Postgres :5432 │
│ ├─ Redis :6379 │
│ └─ MinIO :9000 │
└───────────────────────────────────────────┘
│
▼ /data (Postgres + Redis + MinIO)
Vollständig: docs/01-architecture.md
Feature-Stand
Siehe docs/07-features-matrix.md und docs/09-roadmap.md.
Contributing · Security
- CONTRIBUTING.md — Entwicklungsflow, Commit-Style, Tests
- SECURITY.md — Sicherheitslücken melden
Lizenz
GNU AGPL-3.0 — Wenn du diese Software auf einem Server betreibst und Nutzern darüber Dienste anbietest, musst du deinen Quellcode den Nutzern zur Verfügung stellen (Affero-Klausel).
Related apps
Explore more like this
Explore allDetails
ghcr.io/itsweber-official/itsweber-play:mainRuntime arguments
- Web UI
http://[IP]:[PORT:3000]- Network
bridge- Shell
bash- Privileged
- false
Template configuration
Einziger exponierter Port. Nginx multiplext intern zu Web/API/S3.
- Target
- 3000
- Default
- 3000
- Value
- 3000
Postgres, Redis, MinIO, Logs, Whisper-Modelle — alles unter /data. Regelmäßig sichern.
- Target
- /data
- Default
- /mnt/user/appdata/itsweber-play/data
- Value
- /mnt/user/appdata/itsweber-play/data
Die externe HTTPS-URL (ohne Trailing-Slash). Wird für Auth-Cookies, OG-Tags und Uploads gebraucht. Muss auf den Reverse-Proxy vor diesem Container zeigen.
- Target
- PUBLIC_URL
- Default
- https://play.example.com
- Value
- https://play.example.com
Identisch zu Public URL — landet ins JS-Bundle.
- Target
- NEXT_PUBLIC_SITE_URL
- Default
- https://play.example.com
- Value
- https://play.example.com
Relativ lassen (/api), wenn ein Reverse-Proxy alles auf Port 3000 schickt. Nur ändern bei separatem API-Subdomain.
- Target
- NEXT_PUBLIC_API_URL
- Default
- /api
- Value
- /api
Relativ lassen (/s3). Wird für Thumbnails + HLS-Playlists verwendet.
- Target
- NEXT_PUBLIC_S3_PUBLIC_URL
- Default
- /s3
- Value
- /s3
MUSS identisch zu S3 URL (public) sein.
- Target
- S3_PUBLIC_URL
- Default
- /s3
- Value
- /s3
Erzeugen mit: openssl rand -hex 32 — Pflicht, sonst startet Better-Auth nicht.
- Target
- AUTH_SECRET
Erzeugen mit: openssl rand -hex 24 — wird auch als Part von DATABASE_URL gebraucht.
- Target
- POSTGRES_PASSWORD
Erzeugen mit: openssl rand -hex 24 — wird als S3-Secret für die API verwendet.
- Target
- MINIO_ROOT_PASSWORD
Der erste User mit dieser Email wird beim Sign-up automatisch auf ADMIN gesetzt.
- Target
- INITIAL_ADMIN_EMAIL
- Default
- admin@example.com
- Value
- admin@example.com
Handle (Benutzername ohne @) des Admin-Accounts.
- Target
- INITIAL_ADMIN_HANDLE
- Default
- admin
- Value
- admin
Anzeige-Name des Admin-Accounts.
- Target
- INITIAL_ADMIN_NAME
- Default
- Admin
- Value
- Admin
Starkes Passwort. Kann nach dem ersten Login über den Profil-Reset-Flow geändert werden.
- Target
- INITIAL_ADMIN_PASSWORD
Leer lassen für Single-Domain. Für SSO über Subdomains: .deine-domain.tld (mit führendem Punkt).
- Target
- AUTH_COOKIE_DOMAIN
Sichtbarer Name im Header / Meta-Tags. Leer lassen = "Play".
- Target
- NEXT_PUBLIC_APP_NAME
- Default
- Play
- Value
- Play
Dein Firmen-/Creator-Name (optional, im Footer). Leer lassen für generisch.
- Target
- NEXT_PUBLIC_VENDOR_NAME
Link auf deine Firmen-/Creator-Homepage (optional).
- Target
- NEXT_PUBLIC_VENDOR_URL
Für HTML-Meta-Tag (optional).
- Target
- NEXT_PUBLIC_AUTHOR_NAME
Für HTML-Meta-Tag (optional).
- Target
- NEXT_PUBLIC_AUTHOR_URL
Externe Landing-Page (optional).
- Target
- NEXT_PUBLIC_PRODUCT_HOMEPAGE
- Default
- production
- Value
- production
TZ-Database-Name, z. B. Europe/Berlin, UTC.
- Target
- TZ
- Default
- Europe/Berlin
- Value
- Europe/Berlin
All-in-One: Postgres läuft im selben Container.
- Target
- POSTGRES_HOST
- Default
- 127.0.0.1
- Value
- 127.0.0.1
- Target
- POSTGRES_PORT
- Default
- 5432
- Value
- 5432
- Target
- POSTGRES_DB
- Default
- itsweber_play
- Value
- itsweber_play
- Target
- POSTGRES_USER
- Default
- play
- Value
- play
Muss dasselbe Passwort enthalten wie POSTGRES_PASSWORD oben. Bei Änderung beides anpassen.
- Target
- DATABASE_URL
- Default
- postgresql://play:REPLACE_WITH_POSTGRES_PASSWORD@127.0.0.1:5432/itsweber_play
- Value
- postgresql://play:REPLACE_WITH_POSTGRES_PASSWORD@127.0.0.1:5432/itsweber_play
- Target
- REDIS_HOST
- Default
- 127.0.0.1
- Value
- 127.0.0.1
- Target
- REDIS_PORT
- Default
- 6379
- Value
- 6379
- Target
- MINIO_ROOT_USER
- Default
- play-admin
- Value
- play-admin
All-in-One: MinIO im selben Container.
- Target
- S3_ENDPOINT
- Default
- http://127.0.0.1:9000
- Value
- http://127.0.0.1:9000
- Target
- S3_REGION
- Default
- us-east-1
- Value
- us-east-1
Identisch zu MinIO Root User.
- Target
- S3_ACCESS_KEY
- Default
- play-admin
- Value
- play-admin
Identisch zu MinIO Root Password (oben).
- Target
- S3_SECRET_KEY
- Target
- S3_BUCKET_VIDEOS
- Default
- play-videos
- Value
- play-videos
- Target
- S3_BUCKET_THUMBS
- Default
- play-thumbs
- Value
- play-thumbs
- Target
- S3_BUCKET_RAW
- Default
- play-raw
- Value
- play-raw
- Target
- S3_BUCKET_ASSETS
- Default
- play-assets
- Value
- play-assets
Muss ≤ `client_max_body_size` im Reverse-Proxy sein. 8192 = 8 GB.
- Target
- MAX_UPLOAD_SIZE_MB
- Default
- 8192
- Value
- 8192
Komma-getrennt. Weglassen = weniger Qualitätsstufen = schnellerer Transcode.
- Target
- TRANSCODE_QUALITIES
- Default
- 1080p,720p,480p
- Value
- 1080p,720p,480p
Gleichzeitig verarbeitete Videos. Höher = CPU-intensiver.
- Target
- TRANSCODE_CONCURRENCY
- Default
- 2
- Value
- 2
Gleichzeitige yt-dlp-Imports.
- Target
- IMPORT_CONCURRENCY
- Default
- 2
- Value
- 2
1 = automatische Untertitel via Whisper.cpp generieren. Braucht Whisper-Modell im /data-Volume.
- Target
- AUTO_CAPTIONS_ENABLED
- Default
- 0
- Value
- 0
Requests pro Fenster auf sensible Endpoints.
- Target
- RATE_LIMIT_MAX
- Default
- 120
- Value
- 120
Zeitfenster in Millisekunden. 60000 = 1 Minute.
- Target
- RATE_LIMIT_WINDOW_MS
- Default
- 60000
- Value
- 60000