Produktions-Deployment¶
Empfohlene Architektur¶
Internet / Heimnetz
↓
nginx (Reverse Proxy)
↓
┌────┴────┐
│ │
Backend Frontend
:3001 (statische Dateien)
systemd-Service¶
Für ein dauerhaftes Betreiben als systemd-Service:
[Unit]
Description=Ripster - Disc Ripping Service
After=network.target
[Service]
Type=simple
User=michael
WorkingDirectory=/home/michael/ripster
ExecStart=/bin/bash /home/michael/ripster/start.sh
ExecStop=/bin/bash /home/michael/ripster/kill.sh
Restart=on-failure
RestartSec=10s
# Umgebungsvariablen
Environment=NODE_ENV=production
Environment=PORT=3001
Environment=LOG_LEVEL=info
[Install]
WantedBy=multi-user.target
# Service aktivieren und starten
sudo systemctl daemon-reload
sudo systemctl enable ripster
sudo systemctl start ripster
# Status prüfen
sudo systemctl status ripster
# Logs anzeigen
journalctl -u ripster -f
Frontend-Build¶
Für Produktion das Frontend bauen:
Die statischen Dateien landen in frontend/dist/.
nginx-Konfiguration¶
# /etc/nginx/sites-available/ripster
server {
listen 80;
server_name ripster.local;
# Statisches Frontend
root /home/michael/ripster/frontend/dist;
index index.html;
# SPA Fallback (React Router)
location / {
try_files $uri $uri/ /index.html;
}
# API-Proxy zum Backend
location /api/ {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# WebSocket-Proxy
location /ws {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
sudo ln -s /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Nur-Backend-Produktion (ohne nginx)¶
Falls kein Reverse Proxy gewünscht ist, kann das Backend die Frontend-Dateien direkt ausliefern:
# Frontend bauen
cd frontend && npm run build
# Backend startet und serviert frontend/dist/
cd backend && NODE_ENV=production npm start
Das Backend ist so konfiguriert, dass es im Produktionsmodus die frontend/dist/-Dateien als statische Assets ausliefert.
Datenbank-Backup¶
# Datenbank sichern
cp backend/data/ripster.db backend/data/ripster.db.backup.$(date +%Y%m%d)
# Oder mit SQLite-eigenem Backup-Befehl
sqlite3 backend/data/ripster.db ".backup '/mnt/backup/ripster.db'"
Automatisches Backup
Cron-Job für tägliches Backup:
Log-Rotation¶
Ripster rotiert Logs automatisch täglich. Falls zusätzlich systemd-Journal-Rotation gewünscht ist:
# /etc/logrotate.d/ripster
/home/michael/ripster/backend/logs/*.log {
daily
rotate 14
compress
missingok
notifempty
}
Sicherheitshinweise¶
Heimnetz-Einsatz
Ripster ist für den Einsatz im lokalen Heimnetz konzipiert und enthält keine Authentifizierung. Stelle sicher, dass der Dienst nicht öffentlich erreichbar ist.
Falls öffentlicher Zugang benötigt wird:
-
Basic Auth via nginx:
-
VPN-Zugang (empfohlen): Zugriff nur über WireGuard/OpenVPN
-
SSL/TLS: Let's Encrypt mit certbot für HTTPS