Ein Check-In- und Punkteverwaltungssystem für die „Hogwartsnacht" mit Fotoverwaltung über Immich. https://hogwartsnacht.de
This repository has been archived on 2026-05-30. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Vue 64.9%
  • TypeScript 34.1%
  • Dockerfile 0.4%
  • Shell 0.2%
  • HTML 0.2%
  • Other 0.1%
Find a file
2026-02-25 17:15:23 +01:00
.github Specify game points (#9) 2026-02-04 17:08:27 +01:00
backend Linting 2026-02-25 16:51:55 +01:00
frontend Fix flow direction 2026-02-25 17:15:23 +01:00
.gitignore WIP 2026-01-21 06:04:09 +01:00
docker-compose.yml feat(auth): enhance cookie-based authentication and add user role endpoint 2026-02-02 20:21:17 +01:00
LICENCE.md Add LICENCE.md 2026-02-25 16:56:59 +01:00
lint.sh Add lint script 2026-01-29 16:30:23 +01:00
README.md Enhance Nginx configuration for HTTPS redirection and SSL setup 2026-02-25 17:09:44 +01:00

Punktesystem Hogwartsnacht

Ein Check-In- und Punkteverwaltungssystem für die „Hogwartsnacht" mit Fotoverwaltung über Immich. Schüler:innen werden in Häuser (Gryffindor, Hufflepuff, Ravenclaw, Slytherin) eingeteilt, können bei Spielen Punkte sammeln und erhalten am Ende eine E-Mail mit ihrem Punktestand sowie einem Link zu ihrem Fotoalbum.

Inhaltsverzeichnis


Architektur

Komponente Technologie
Backend Fastify + Prisma (PostgreSQL) + TypeScript
Frontend Vue 3 + Vuetify 3 + Pinia + Vite
Fotoverwaltung Immich (selbst gehostet)
Authentifizierung WebAuthn Passkeys (@simplewebauthn/*)
Deployment Docker Compose + GitHub Actions (Self-Hosted Runner)

Setup

Voraussetzungen

  • Docker und Docker Compose installiert
  • Eine laufende Immich-Instanz (siehe Immich einrichten)
  • Ein iServ-Zugang (optional, für die E-Mail-Suche bei der Schülererstellung)
  • Ein SMTP-Server (optional, für den E-Mail-Versand)

Umgebungsvariablen

Erstelle eine .env-Datei im Projektroot mit folgenden Variablen:

# Datenbank
DB_USER=hogwartsnachtuser
DB_PASSWORD=hogwartsnachtpass
DB_NAME=hogwartsnachtdb
DB_PORT=5432

# Ports
BACKEND_PORT=8080
FRONTEND_PORT=80

# CORS & Backend-URL
CORS_ORIGIN=https://hogwartsnacht.de
BACKEND_URL=https://api.hogwartsnacht.de

# Cookie-Secret (zufällig generierter String)
COOKIE_SECRET=ein_sicheres_geheimnis

# Immich
IMMICH_BASE_URL=http://immich:2283
IMMICH_API_KEY=dein_immich_api_key

# iServ (optional, für E-Mail-Suche)
ISERV_ENDPOINT=https://iserv.example.com
ISERV_COOKIE=dein_iserv_session_cookie

# SMTP (optional, für E-Mail-Versand)
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=noreply@example.com
SMTP_PASS=smtp_passwort
SMTP_FROM=Hogwartsnacht <noreply@example.com>

# Test-Modus für Mails (optional)
TEST_MAIL_RECEIVER=test@example.com
Variable Beschreibung
CORS_ORIGIN Die Domain des Frontends (für CORS-Header)
BACKEND_URL Die öffentliche URL des Backends (wird beim Frontend-Build eingebaut)
COOKIE_SECRET Secret für signierte Session-Cookies
IMMICH_BASE_URL URL der Immich-Instanz (intern im Docker-Netzwerk oder extern)
IMMICH_API_KEY API-Key eines Immich-Admins
ISERV_ENDPOINT iServ-Suchendpunkt für die E-Mail-Adress-Auflösung
ISERV_COOKIE Session-Cookie für die iServ-API
TEST_MAIL_RECEIVER Wenn gesetzt, erscheint im Mail Sender ein Testmodus mit einem Dummy-Schüler

Immich einrichten

  1. Eine Immich-Instanz deployen (siehe Immich-Docs).
  2. Einen Admin-Account anlegen.
  3. In den Immich-Einstellungen unter Account Settings → API Keys einen neuen API-Key erstellen.
  4. Den API-Key und die Base-URL in die .env-Datei eintragen.

Important

Die IMMICH_BASE_URL muss vom Backend-Container aus erreichbar sein. Wenn Immich im selben Docker-Netzwerk läuft, kann der Service-Name verwendet werden (z.B. http://immich:2283). Ansonsten die externe URL verwenden.

Immich wird verwendet, um:

  • Beim Erstellen eines Schülers (mit Fotoerlaubnis) automatisch ein persönliches Fotoalbum anzulegen.
  • Fotos über die Fotozuweisung-Seite in das Album des Schülers hochzuladen.
  • Beim E-Mail-Versand einen passwortgeschützten Shared-Link zum Album zu generieren.

Die iServ-Integration wird benötigt, um beim Schüler:innen-Import automatisch die E-Mail-Adressen aufzulösen. Dafür wird ein Session-Cookie aus einer eingeloggten iServ-Sitzung benötigt.

  1. Im Browser bei iServ einloggen (als Lehrer- oder Admin-Account).
  2. Die Browser-Entwicklertools öffnen (F12 → Tab Netzwerk / Network).
  3. Eine beliebige Seite in iServ aufrufen.
  4. Den Request an die iServ-Domain anklicken und in den Request Headers den Wert von Cookie kopieren.
    • Der Cookie sieht typischerweise so aus: IServSAT=abc123...; IServSID=xyz789...
  5. Den gesamten Cookie-String als Wert für ISERV_COOKIE in die .env-Datei eintragen.

Important

Der iServ-Cookie ist nur ca. 24 Stunden gültig. Danach muss ein neuer Cookie beschafft und in die .env-Datei eingetragen werden. Anschließend muss der Backend-Container neu gestartet werden (docker compose restart backend), damit der neue Cookie geladen wird. Erst dann kann der Schüler:innen-Import mit iServ-Suche durchgeführt werden.

SSL / Reverse Proxy

Das Punktesystem liefert HTTP auf den konfigurierten Ports aus. Für den Produktivbetrieb wird HTTPS (SSL) benötigt insbesondere weil WebAuthn-Passkeys nur über sichere Verbindungen funktionieren. Dafür gibt es zwei gängige Optionen:

Option A: Cloudflare Tunnel (empfohlen für einfache Setups)

Ein Cloudflare Tunnel leitet Traffic von einer öffentlichen Domain direkt zu den lokalen Ports ohne offene Firewall-Ports und mit automatischem SSL.

  1. Einen kostenlosen Cloudflare-Account erstellen.
  2. Die Domain bei Cloudflare als DNS-Zone hinzufügen (Nameserver umstellen).
  3. cloudflared auf dem Server installieren:
    curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared
    chmod +x /usr/local/bin/cloudflared
    cloudflared tunnel login
    
  4. Einen Tunnel erstellen und konfigurieren:
    cloudflared tunnel create hogwartsnacht
    
  5. Die Datei ~/.cloudflared/config.yml erstellen:
    tunnel: <TUNNEL_ID>
    credentials-file: /root/.cloudflared/<TUNNEL_ID>.json
    
    ingress:
      - hostname: hogwartsnacht.de
        service: http://localhost:80
      - hostname: api.hogwartsnacht.de
        service: http://localhost:8080
      - service: http_status:404
    
  6. DNS-Einträge anlegen:
    cloudflared tunnel route dns hogwartsnacht hogwartsnacht.de
    cloudflared tunnel route dns hogwartsnacht api.hogwartsnacht.de
    
  7. Tunnel als Systemd-Service starten:
    cloudflared service install
    systemctl start cloudflared
    systemctl enable cloudflared
    

Option B: Nginx Reverse Proxy mit Let's Encrypt

  1. Nginx und Certbot installieren:
    apt install nginx certbot python3-certbot-nginx
    
  2. Nginx-Konfiguration erstellen (z.B. /etc/nginx/sites-available/hogwartsnacht):
    # HTTP → HTTPS Redirect
    server {
        listen 80;
        server_name hogwartsnacht.de api.hogwartsnacht.de;
        return 301 https://$host$request_uri;
    }
    
    # Frontend
    server {
        listen 443 ssl;
        server_name hogwartsnacht.de;
    
        ssl_certificate /etc/letsencrypt/live/hogwartsnacht.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/hogwartsnacht.de/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
    
        # HSTS (optional, empfohlen  erzwingt HTTPS für 1 Jahr)
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    # Backend API
    server {
        listen 443 ssl;
        server_name api.hogwartsnacht.de;
    
        ssl_certificate /etc/letsencrypt/live/hogwartsnacht.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/hogwartsnacht.de/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
    
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
        location / {
            proxy_pass http://localhost:3001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  3. Aktivieren und SSL-Zertifikate beziehen:
    ln -s /etc/nginx/sites-available/hogwartsnacht /etc/nginx/sites-enabled/
    nginx -t && systemctl reload nginx
    certbot --nginx -d hogwartsnacht.de -d api.hogwartsnacht.de
    
    Certbot erstellt die Zertifikate und passt bei Bedarf die Konfiguration weiter an. Die Zertifikate werden automatisch erneuert.

Note

Bei Verwendung eines Nginx Reverse Proxys müssen FRONTEND_PORT und BACKEND_PORT auf andere Werte gesetzt werden (z.B. 3000 und 3001), damit sie nicht mit dem Nginx auf Port 80 kollidieren.

Starten

docker compose up --build

Die Datenbank-Migrationen werden automatisch beim Start des Backend-Containers ausgeführt.

  • Frontend: http://localhost:80 (bzw. FRONTEND_PORT)
  • Backend: http://localhost:8080 (bzw. BACKEND_PORT)

Lokale Entwicklung (ohne Docker)

# Backend
cd backend
pnpm install
pnpm db:generate
pnpm db:migrate    # DATABASE_URL muss gesetzt sein
pnpm start

# Frontend
cd frontend
pnpm install
pnpm dev

PWA (Progressive Web App)

Das Frontend ist als Progressive Web App (PWA) verfügbar. Eine PWA ist eine Webanwendung, die sich wie eine native App auf dem Gerät installieren lässt mit eigenem App-Icon auf dem Homescreen, Vollbild-Modus und schnellerem Zugriff.

Installation auf Android

  1. Die Seite (z.B. https://hogwartsnacht.de) in Chrome öffnen.
  2. Im Browser-Menü (drei Punkte oben rechts) auf „Zum Startbildschirm hinzufügen" oder „App installieren" tippen.
  3. Den Namen bestätigen und auf „Hinzufügen" tippen.
  4. Die App erscheint als Icon auf dem Homescreen.

Installation auf iOS (iPhone/iPad)

  1. Die Seite in Safari öffnen (andere Browser unterstützen PWA-Installation auf iOS nicht).
  2. Auf das Teilen-Symbol (Quadrat mit Pfeil nach oben) tippen.
  3. Nach unten scrollen und „Zum Home-Bildschirm" auswählen.
  4. Den Namen bestätigen und auf „Hinzufügen" tippen.

Hinweis für Admins

Die PWA startet immer auf der Startseite (/), die automatisch auf /spiel weiterleitet. Ein Admin-Login erfordert jedoch den speziellen Pfad /login?admin=true, der in der PWA nicht direkt aufgerufen werden kann.

Lösung: Admins müssen sich im normalen Browser (nicht in der PWA) über https://hogwartsnacht.de/login?admin=true einloggen. Da die Session über Cookies funktioniert und der Browser den Cookie mit der PWA teilt, ist man danach auch in der PWA als Admin eingeloggt. Alternativ kann ein Admin-Passkey auch direkt im Browser auf /verwaltung/passkeys erstellt werden.


Admin-Seiten (Verwaltung)

Die Verwaltungsseiten sind unter /verwaltung erreichbar und erfordern eine Admin-Authentifizierung. Übersicht der verfügbaren Seiten:

Schüler:innen

Pfad: /verwaltung/schueler

Hier werden Schüler:innen importiert und verwaltet.

CSV-Import

Es kann eine CSV-Datei mit folgendem Format hochgeladen werden:

Vorname,Nachname,Klasse,Id,fGruppeId,Fotoerlaubnis
Max,Mustermann,5a,S001,FG01,Ja
Erika,Musterfrau,5b,S002,FG01,Nein

Pflichtfelder im Header (case-insensitive):

  • Vorname
  • Nachname
  • Klasse
  • Id Eindeutige Schüler-ID (z.B. erster Buchstabe Vorname, erster Buchstabe Nachname und Buchstabe Klasse; Beispielformel für z.B. LibreOffice Calc: =UPPER(LEFT(A4; 1) & LEFT(B4; 2) & RIGHT(C4;1)))
  • fGruppeId Freundesgruppen-ID (Schüler:innen in derselben Gruppe werden bevorzugt im gleichen Haus platziert)

Optionales Feld:

  • Fotoerlaubnis Akzeptierte Werte: Y, Yes, J, Ja, 1, true (case-insensitive). Alles andere wird als false interpretiert.

Ablauf des Imports

  1. CSV hochladen → Schüler:innen, die bereits existieren (gleiche ID), werden automatisch übersprungen.
  2. Für jede zu importierende Schüler:in wird automatisch eine iServ-Suche nach der E-Mail-Adresse durchgeführt.
  3. Bei einem perfekten Match (Konfidenz = 10) wird die E-Mail automatisch ausgewählt.
  4. Das Haus wird automatisch bestimmt:
    • Wenn bereits Schüler:innen derselben Freundesgruppe existieren → gleiches Haus.
    • Sonst → zufällige Zuweisung zum Haus mit den wenigsten Schüler:innen.
  5. „Alle automatisch erstellen" verarbeitet alle verbleibenden Schüler:innen nacheinander (nur wenn eine E-Mail gefunden wurde).

Weitere Funktionen

  • Schüler:innen bearbeiten: Name, Klasse, iServ-Mail, Haus und Fotoerlaubnis können nachträglich geändert werden.
  • Freundesgruppen verschieben: Ganze Freundesgruppen können in ein anderes Haus verschoben werden.
  • PDF-Export: Liste aller Schüler:innen als PDF, gruppiert nach Haus, Klasse oder Freundesgruppe.
  • Häuser-Übersicht: Zeigt die Anzahl der Schüler:innen pro Haus.

Fotozuweisung

Pfad: /verwaltung/fotos

Hier können Fotos einzelnen Schüler:innen zugewiesen werden:

  1. Schüler:in über die Suche (Name oder ID) filtern, bis genau ein Ergebnis angezeigt wird.
  2. Foto aufnehmen oder auswählen (unterstützt Kamera-Capture auf Mobilgeräten).
  3. „Speichern" klicken → Das Foto wird in Immich in das Album des Schülers hochgeladen.

Note

Fotos können nur für Schüler:innen mit Fotoerlaubnis hochgeladen werden. Der Speichern-Button ist andernfalls deaktiviert.

Mail Sender

Pfad: /verwaltung/mail

Versendet E-Mails mit dem Punktestand und (falls vorhanden) dem Link zum Fotoalbum an ausgewählte Schüler:innen. Nur für Admins.

  • Schüler:innen können nach Name, Klasse oder Haus gefiltert und ausgewählt werden.
  • Die E-Mails enthalten den Punktestand, die Haus-Zugehörigkeit und einen passwortgeschützten Link zum Fotoalbum.
  • Die Spalte „Mailcount" zeigt an, wie viele Mails bereits an die jeweilige Schüler:in gesendet wurden.
  • Testmodus: Durch Anhängen von ?test=true an die URL (/verwaltung/mail?test=true) wird der Testmodus aktiviert. Dabei erscheint ein konfigurierbarer Dummy-Schüler, und Test-Mails werden an die in TEST_MAIL_RECEIVER hinterlegte Adresse gesendet. So kann das E-Mail-Template überprüft werden, bevor echte Mails versendet werden. Voraussetzung ist, dass TEST_MAIL_RECEIVER in der .env-Datei gesetzt ist.

Warning

SMTP muss vollständig konfiguriert sein (SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM).

Passkeys

Pfad: /verwaltung/passkeys

Hier können neue WebAuthn-Passkeys erstellt werden. Jeder Passkey wird mit der aktuellen Session verknüpft (Admin oder User). Neue Passkeys können nur erstellt werden, wenn man bereits eingeloggt ist.

Sessions

Pfad: /verwaltung/sessions

Zeigt alle aktiven Sessions (Session-Token, Name, Rolle, Erstellzeitpunkt). Admins können ausgewählte Sessions invalidieren („Deauth"), um Benutzer zwangsweise abzumelden.

Statistik

Pfad: /verwaltung/statistik

Zeigt Punktestatistiken in zwei Tabs:

  • Individuell: Rangliste aller Schüler:innen (gesamt, nach Klasse oder nach Haus filterbar). Die Top 3 werden auf einem Podium angezeigt mit einem „Enthüllen"-Button und Konfetti-Animation.
  • Gruppe: Vergleich der Klassen oder Häuser nach Punkten pro Schüler:in. Auch hier mit einem Enthüllungs-Effekt.

Tip

Die Statistik-Seite eignet sich ideal für eine Präsentation/Beamer-Darstellung bei der Siegerehrung.


Neue Instanz initialisieren

Schritt-für-Schritt-Anleitung für eine komplett neue Installation:

  1. Repository klonen

    git clone https://github.com/BothimTV/punktesystem.git
    cd punktesystem
    
  2. .env-Datei erstellen (siehe Umgebungsvariablen)

  3. Immich einrichten (siehe Immich einrichten)

  4. System starten

    docker compose up --build -d
    
  5. Ersten Passkey erstellen

    • Das Frontend öffnen (z.B. https://hogwartsnacht.de).
    • Die App leitet auf /login weiter.
    • Da noch keine Passkeys existieren, muss der erste Passkey direkt über die Passkey-Verwaltung erstellt werden:
      • Navigiere zu /verwaltung/passkeys.
      • Da noch keine Authentifizierung besteht, wird beim erstmaligen Zugang direkt ein Passkey erstellt. Dieser erste Passkey ist automatisch ein Admin-Passkey.
    • Alternativ kann der erste Passkey über die API erstellt werden.
  6. Admin-Passkey einrichten

    • Auf /login?admin=true navigieren, um sich spezifisch als Admin anzumelden.
    • Auf /verwaltung/passkeys weitere Passkeys (Admin oder User) erstellen.
  7. Schüler:innen importieren

    • CSV-Datei vorbereiten (siehe CSV-Import).
    • Auf /verwaltung/schueler die CSV hochladen und den Import durchführen.
  8. Event durchführen

    • Benutzer loggen sich über /login ein (User-Passkey).
    • Check-In (/checkin): Schüler:innen beim Ankommen einchecken, Fotoerlaubnis prüfen/setzen.
    • Spiel (/spiel): Schüler:innen auswählen, Spiel + Faktor wählen, Punkte vergeben.
    • Fotos (/verwaltung/fotos): Fotos aufnehmen und Schüler:innen zuweisen.
  9. Nach dem Event

    • Statistiken unter /verwaltung/statistik präsentieren.
    • E-Mails über /verwaltung/mail versenden (Punktestände + Fotoalbum-Links).

Spiele anpassen

Die Spiele sind direkt im Frontend definiert in der Datei frontend/src/pages/spiel.vue. Sie werden als Array von Objekten konfiguriert:

const games = [
  {
    title: 'Kräuterkunde',         // Anzeigename
    defaultPoints: 5,              // Basispunktzahl
    factors: {
      1: true,                     // 1x Faktor verfügbar
      2: false,                    // 2x Faktor nicht verfügbar
      2.5: false,                  // 2.5x Faktor nicht verfügbar
      3: false,                    // 3x Faktor nicht verfügbar
    },
  },
  {
    title: 'Quidditch (Fangen)',
    defaultPoints: 14,
    factors: {
      1: true,
      2: false,
      2.5: true,
      3: false,
    },
  },
  // ...weitere Spiele
]

So funktioniert die Punktevergabe

  • Auf der Spielseite (/spiel) wählt man eine oder mehrere Schüler:innen aus.
  • Dann wird ein Spiel und ein Faktor gewählt.
  • Die vergebenen Punkte berechnen sich als: defaultPoints × Faktor (abgerundet).
  • Der Faktor-Toggle zeigt 1x, 2x, 2.5x, 3x deaktivierte Faktoren (Wert false) können nicht ausgewählt werden.
  • Es gibt eine Aktionshistorie (im LocalStorage gespeichert), über die Punktevergaben rückgängig gemacht werden können.

Spiele ändern

  1. Die Datei frontend/src/pages/spiel.vue bearbeiten.
  2. Im games-Array Einträge hinzufügen, entfernen oder anpassen.
  3. Neu deployen (siehe Automatisches Deployment).

Note

Da die Spiele nur im Frontend definiert sind, ist kein Datenbank-Update nötig. Die Punkte selbst werden als einfache Zahl pro Schüler:in gespeichert es gibt kein Log einzelner Spiel-Ergebnisse in der Datenbank.


Automatisches Deployment

Das Projekt nutzt GitHub Actions mit einem Self-Hosted Runner für CI/CD.

Workflows

Workflow Trigger Beschreibung
build.yml Pull Request auf main Baut die Docker-Container, um sicherzustellen dass der Build funktioniert
deploy.yml Push auf main + manuell Baut die Container und deployt auf den Server

Deploy-Workflow im Detail

  1. Build: Checkout + docker compose build auf dem Self-Hosted Runner.
  2. Deploy: SSH-Verbindung zum Produktionsserver und Ausführen von /opt/hogwartsnacht/rebuild.sh.

Einrichtung

1. Self-Hosted Runner installieren

Auf dem Build-Server einen GitHub Actions Self-Hosted Runner installieren (siehe GitHub-Docs).

2. Deploy-Benutzer auf dem Produktionsserver erstellen

Es empfiehlt sich, einen eigenen Benutzer für das automatische Deployment anzulegen:

# Benutzer erstellen
sudo adduser --disabled-password --gecos "Deploy" deploy

# Docker-Berechtigung geben
sudo usermod -aG docker deploy

# Verzeichnis für die Anwendung erstellen
sudo mkdir -p /opt/hogwartsnacht
sudo chown deploy:deploy /opt/hogwartsnacht

3. SSH-Schlüssel erstellen und einrichten

Ein SSH-Schlüsselpaar wird benötigt, damit GitHub Actions sich auf dem Server einloggen kann:

# Auf dem lokalen Rechner (oder dem Build-Server) ein Schlüsselpaar generieren
ssh-keygen -t ed25519 -C "hogwartsnacht-deploy" -f ~/.ssh/hogwartsnacht_deploy -N ""

Den öffentlichen Schlüssel auf dem Produktionsserver hinterlegen:

# Auf dem Produktionsserver als deploy-Benutzer
sudo mkdir -p /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh

# Den Inhalt von ~/.ssh/hogwartsnacht_deploy.pub einfügen:
sudo nano /home/deploy/.ssh/authorized_keys

sudo chmod 600 /home/deploy/.ssh/authorized_keys
sudo chown -R deploy:deploy /home/deploy/.ssh

Den privaten Schlüssel (~/.ssh/hogwartsnacht_deploy) als GitHub Secret hinterlegen (siehe nächster Schritt).

4. GitHub Secrets konfigurieren

Im Repository unter Settings → Secrets and variables → Actions folgende Secrets anlegen:

Secret Beschreibung Beispiel
SERVER_HOST Hostname/IP des Produktionsservers 192.168.1.100
SERVER_USER SSH-Benutzername deploy
SSH_KEY Inhalt des privaten SSH-Schlüssels Inhalt von ~/.ssh/hogwartsnacht_deploy
SERVER_PORT SSH-Port 22

5. Repository auf dem Server klonen

sudo -u deploy git clone https://github.com/BothimTV/punktesystem.git /opt/hogwartsnacht

6. Rebuild-Skript erstellen

Unter /opt/hogwartsnacht/rebuild.sh:

#!/bin/bash
cd /opt/hogwartsnacht
git pull
docker compose up --build -d

Ausführbar machen:

chmod +x /opt/hogwartsnacht/rebuild.sh

7. .env-Datei ablegen

Die .env-Datei mit allen erforderlichen Umgebungsvariablen unter /opt/hogwartsnacht/.env anlegen (siehe Umgebungsvariablen).

Manuelles Deployment

Der Deploy-Workflow kann auch manuell über die GitHub Actions UI ausgelöst werden (workflow_dispatch).


Lizenz

Siehe LICENCE.