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).
Install itsweber-play on Unraid in a few clicks.
Find itsweber-play in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
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