Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
151 lines (145 loc) · 6.13 KB
/
Copy pathdocker-compose.yml
File metadata and controls
151 lines (145 loc) · 6.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# =============================================================================
# VideoVault - Videoverwaltungs- und Archivierungsplattform
# Ubuntu 24.04 | Multi-Arch: amd64 + arm64 (Raspberry Pi 5)
#
# Ein kombiniertes Image "videovault" enthaelt Frontend (nginx) und
# Backend (Node.js) im selben Container. nginx (Port 80) leitet /api/
# intern an Node.js (Port 8080, nicht nach aussen) weiter.
#
# ---------------------------------------------------------------------------
# PERSISTENTE DATEN – Zwei Betriebsmodi (ueber .env steuerbar):
#
# Modus A – benannte Docker-Volumes (Standard, empfohlen):
# MEDIA_VOLUME=media_data → docker volume create (automatisch)
# THUMB_VOLUME=thumb_data
# TRASH_VOLUME=trash_data
# CONFIG_VOLUME=config_data
#
# Modus B – Host-Verzeichnisse (Bind Mounts):
# MEDIA_VOLUME=/mnt/nas/videovault/media
# THUMB_VOLUME=/opt/videovault/thumbnails
# TRASH_VOLUME=/opt/videovault/trash
# CONFIG_VOLUME=/opt/videovault/config
#
# Beide Modi werden von Docker Compose automatisch unterschieden:
# Beginnt der Wert mit "/" → Bind Mount; sonst → benanntes Volume.
# Wichtig: Bei Bind Mounts muessen die Host-Verzeichnisse existieren.
# ---------------------------------------------------------------------------
# =============================================================================
services:
# ---------------------------------------------------------------------------
# PostgreSQL (Ubuntu 24.04 + postgresql-16)
# ---------------------------------------------------------------------------
db:
image: codxio/video_vault:postgres-ubuntu
container_name: Video-Vault-db
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-videovault}
POSTGRES_USER: ${DB_USER:-videovault}
POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme}
volumes:
- db_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/001_schema.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-videovault} -d ${DB_NAME:-videovault}"]
interval: 10s
timeout: 5s
retries: 10
networks:
- video_vault
# ---------------------------------------------------------------------------
# VideoVault – kombiniertes Image (Frontend + Backend)
# nginx (Port 80) liefert das Frontend aus und proxied /api/ → Node.js
# intern (localhost:8080). Nur Port 80 ist nach aussen sichtbar.
# ---------------------------------------------------------------------------
videovault:
image: codxio/video_vault:latest
container_name: Video-Vault
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "${WEB_PORT:-8088}:80"
environment:
NODE_ENV: production
PORT: 8080
DB_HOST: db
DB_PORT: 5432
DB_NAME: ${DB_NAME:-videovault}
DB_USER: ${DB_USER:-videovault}
DB_PASSWORD: ${DB_PASSWORD:-changeme}
JWT_SECRET: ${JWT_SECRET:-please-change-this-secret}
JWT_EXPIRES: ${JWT_EXPIRES:-12h}
# Schluessel zum Verschluesseln der Blink-Zugangsdaten (AES-256-GCM).
# Leer = Rueckfall auf JWT_SECRET.
BLINK_ENC_KEY: ${BLINK_ENC_KEY:-}
ADMIN_USER: ${ADMIN_USER:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD muss in .env gesetzt sein}
ADMIN_PASSWORD_RESET: ${ADMIN_PASSWORD_RESET:-false}
# Aufbewahrung
RETENTION_DAYS: ${RETENTION_DAYS:-90}
RETENTION_CRON: ${RETENTION_CRON:-0 3 * * *}
TRASH_RETENTION_DAYS: ${TRASH_RETENTION_DAYS:-14}
# Synchronisation
SYNC_ENABLED: ${SYNC_ENABLED:-false}
SYNC_CRON: ${SYNC_CRON:-0 4 * * *}
SYNC_TARGET: /sync
# Speicher
STORAGE_WARN_PERCENT: ${STORAGE_WARN_PERCENT:-90}
MAX_UPLOAD_MB: ${MAX_UPLOAD_MB:-5120}
# NAS / Freigaben
NAS_MOUNT_BASE: /nas
SHARE_CONFIG_PATH: /config
volumes:
# -----------------------------------------------------------------------
# Daten-Volumes – Standard: benannte Docker-Volumes (Modus A)
# Fuer Host-Verzeichnisse (Bind Mounts, Modus B) absolute Pfade in .env:
# MEDIA_VOLUME=/absoluter/pfad/media
# Docker unterscheidet automatisch: "/" am Anfang = Bind Mount.
#
# Bind-Mount-Verzeichnisse werden automatisch angelegt:
# - Durch install.sh / install-rpi.sh vor dem ersten Start.
# - Durch den Container-Entrypoint beim Start (mkdir -p).
# Ein manuelles Anlegen ist NICHT erforderlich.
# -----------------------------------------------------------------------
- ${MEDIA_VOLUME:-media_data}:/data/media
- ${THUMB_VOLUME:-thumb_data}:/data/thumbnails
- ${TRASH_VOLUME:-trash_data}:/data/trash
- ${CONFIG_VOLUME:-config_data}:/config
- ${SYNC_HDD_PATH:-./sync_target}:/sync
# Berechtigungen fuer NAS-Mounts (SMB/NFS/WebDAV).
# Wer keine NAS-Anbindung nutzt, kann cap_add/devices/security_opt entfernen.
cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH
devices:
- /dev/fuse
security_opt:
- apparmor:unconfined
# Externer DNS-Server: stellt sicher, dass der Container oeffentliche
# Hostnamen (z.B. Blink-API-Endpunkte) zuverlaessig aufloest.
dns:
- 8.8.8.8
- 8.8.4.4
- 1.1.1.1
networks:
- video_vault
# =============================================================================
# Benannte Volumes (werden nur dann als Docker-Volumes angelegt, wenn die
# entsprechende *_VOLUME-Variable in .env NICHT auf einen absoluten Pfad
# gesetzt ist – andernfalls verwendet Docker Compose den Host-Pfad direkt).
# =============================================================================
volumes:
db_data:
media_data:
thumb_data:
trash_data:
config_data:
networks:
video_vault:
name: video_vault
driver: bridge
# Kein "internal: true" – Container benoetigen Internetzugang (Blink-API,
# Python-Pakete beim Build). DNS explizit im videovault-Service konfiguriert.