itsweber-play

itsweber-play

Docker app from grtgbln's Repository

Overview

Self-hosted video platform

ITSWEBER Play

ITSWEBER Play

License: AGPL v3 Status Docker

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

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.

Open the Apps tab on your Unraid server Search Community Apps for itsweber-play Review the template variables and paths Click Install

Related apps

Details

Repository
ghcr.io/itsweber-official/itsweber-play:main
Last Updated2026-07-12
First Seen2026-04-24

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Einziger exponierter Port. Nginx multiplext intern zu Web/API/S3.

Target
3000
Default
3000
Value
3000
DataPathrw

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
Public URLVariable

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
Site URL (public)Variable

Identisch zu Public URL — landet ins JS-Bundle.

Target
NEXT_PUBLIC_SITE_URL
Default
https://play.example.com
Value
https://play.example.com
API URL (public)Variable

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
S3 URL (public)Variable

Relativ lassen (/s3). Wird für Thumbnails + HLS-Playlists verwendet.

Target
NEXT_PUBLIC_S3_PUBLIC_URL
Default
/s3
Value
/s3
S3 URL (server-side)Variable

MUSS identisch zu S3 URL (public) sein.

Target
S3_PUBLIC_URL
Default
/s3
Value
/s3
Auth SecretVariable

Erzeugen mit: openssl rand -hex 32 — Pflicht, sonst startet Better-Auth nicht.

Target
AUTH_SECRET
Postgres PasswordVariable

Erzeugen mit: openssl rand -hex 24 — wird auch als Part von DATABASE_URL gebraucht.

Target
POSTGRES_PASSWORD
MinIO Root PasswordVariable

Erzeugen mit: openssl rand -hex 24 — wird als S3-Secret für die API verwendet.

Target
MINIO_ROOT_PASSWORD
Initial Admin EmailVariable

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
Initial Admin HandleVariable

Handle (Benutzername ohne @) des Admin-Accounts.

Target
INITIAL_ADMIN_HANDLE
Default
admin
Value
admin
Initial Admin NameVariable

Anzeige-Name des Admin-Accounts.

Target
INITIAL_ADMIN_NAME
Default
Admin
Value
Admin
Initial Admin PasswordVariable

Starkes Passwort. Kann nach dem ersten Login über den Profil-Reset-Flow geändert werden.

Target
INITIAL_ADMIN_PASSWORD
Auth Cookie DomainVariable

Leer lassen für Single-Domain. Für SSO über Subdomains: .deine-domain.tld (mit führendem Punkt).

Target
AUTH_COOKIE_DOMAIN
App NameVariable

Sichtbarer Name im Header / Meta-Tags. Leer lassen = &quot;Play&quot;.

Target
NEXT_PUBLIC_APP_NAME
Default
Play
Value
Play
Vendor NameVariable

Dein Firmen-/Creator-Name (optional, im Footer). Leer lassen für generisch.

Target
NEXT_PUBLIC_VENDOR_NAME
Vendor URLVariable

Link auf deine Firmen-/Creator-Homepage (optional).

Target
NEXT_PUBLIC_VENDOR_URL
Author NameVariable

Für HTML-Meta-Tag (optional).

Target
NEXT_PUBLIC_AUTHOR_NAME
Author URLVariable

Für HTML-Meta-Tag (optional).

Target
NEXT_PUBLIC_AUTHOR_URL
Product HomepageVariable

Externe Landing-Page (optional).

Target
NEXT_PUBLIC_PRODUCT_HOMEPAGE
NODE_ENVVariable
Default
production
Value
production
TimezoneVariable

TZ-Database-Name, z. B. Europe/Berlin, UTC.

Target
TZ
Default
Europe/Berlin
Value
Europe/Berlin
Postgres HostVariable

All-in-One: Postgres läuft im selben Container.

Target
POSTGRES_HOST
Default
127.0.0.1
Value
127.0.0.1
Postgres PortVariable
Target
POSTGRES_PORT
Default
5432
Value
5432
Postgres DBVariable
Target
POSTGRES_DB
Default
itsweber_play
Value
itsweber_play
Postgres UserVariable
Target
POSTGRES_USER
Default
play
Value
play
Database URLVariable

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
Redis HostVariable
Target
REDIS_HOST
Default
127.0.0.1
Value
127.0.0.1
Redis PortVariable
Target
REDIS_PORT
Default
6379
Value
6379
MinIO Root UserVariable
Target
MINIO_ROOT_USER
Default
play-admin
Value
play-admin
S3 EndpointVariable

All-in-One: MinIO im selben Container.

Target
S3_ENDPOINT
Default
http://127.0.0.1:9000
Value
http://127.0.0.1:9000
S3 RegionVariable
Target
S3_REGION
Default
us-east-1
Value
us-east-1
S3 Access KeyVariable

Identisch zu MinIO Root User.

Target
S3_ACCESS_KEY
Default
play-admin
Value
play-admin
S3 Secret KeyVariable

Identisch zu MinIO Root Password (oben).

Target
S3_SECRET_KEY
Bucket VideosVariable
Target
S3_BUCKET_VIDEOS
Default
play-videos
Value
play-videos
Bucket ThumbsVariable
Target
S3_BUCKET_THUMBS
Default
play-thumbs
Value
play-thumbs
Bucket RawVariable
Target
S3_BUCKET_RAW
Default
play-raw
Value
play-raw
Bucket AssetsVariable
Target
S3_BUCKET_ASSETS
Default
play-assets
Value
play-assets
Max Upload Size (MB)Variable

Muss ≤ `client_max_body_size` im Reverse-Proxy sein. 8192 = 8 GB.

Target
MAX_UPLOAD_SIZE_MB
Default
8192
Value
8192
Transcode QualitiesVariable

Komma-getrennt. Weglassen = weniger Qualitätsstufen = schnellerer Transcode.

Target
TRANSCODE_QUALITIES
Default
1080p,720p,480p
Value
1080p,720p,480p
Transcode ConcurrencyVariable

Gleichzeitig verarbeitete Videos. Höher = CPU-intensiver.

Target
TRANSCODE_CONCURRENCY
Default
2
Value
2
Import ConcurrencyVariable

Gleichzeitige yt-dlp-Imports.

Target
IMPORT_CONCURRENCY
Default
2
Value
2
Auto-CaptionsVariable

1 = automatische Untertitel via Whisper.cpp generieren. Braucht Whisper-Modell im /data-Volume.

Target
AUTO_CAPTIONS_ENABLED
Default
0
Value
0
Rate Limit MaxVariable

Requests pro Fenster auf sensible Endpoints.

Target
RATE_LIMIT_MAX
Default
120
Value
120
Rate Limit Window (ms)Variable

Zeitfenster in Millisekunden. 60000 = 1 Minute.

Target
RATE_LIMIT_WINDOW_MS
Default
60000
Value
60000