# Produktion - Ripster
Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding
Author: Michael

Zum Inhalt

# Produktions-Deployment

## Empfohlene Architektur

    Internet / Heimnetz
            ↓
       nginx (Reverse Proxy)
            ↓
       ┌────┴────┐
       │         │
    Backend   Frontend
     :3001     (statische Dateien)

## systemd-Service

Für ein dauerhaftes Betreiben als systemd-Service:

    sudo nano /etc/systemd/system/ripster.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:

    cd frontend
    npm run build

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:

    0 3 * * * sqlite3 /home/michael/ripster/backend/data/ripster.db ".backup '/mnt/backup/ripster-$(date +\%Y\%m\%d).db'"

## 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:

1. Basic Auth via nginx:

       sudo htpasswd -c /etc/nginx/.htpasswd michael

       location / {
           auth_basic "Ripster";
           auth_basic_user_file /etc/nginx/.htpasswd;
           # ...
       }

2. VPN-Zugang (empfohlen): Zugriff nur über WireGuard/OpenVPN

3. SSL/TLS: Let's Encrypt mit certbot für HTTPS