- Vue 64.9%
- TypeScript 34.1%
- Dockerfile 0.4%
- Shell 0.2%
- HTML 0.2%
- Other 0.1%
| .github | ||
| backend | ||
| frontend | ||
| .gitignore | ||
| docker-compose.yml | ||
| LICENCE.md | ||
| lint.sh | ||
| README.md | ||
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
- Setup
- PWA (Progressive Web App)
- Admin-Seiten (Verwaltung)
- Neue Instanz initialisieren
- Spiele anpassen
- Automatisches Deployment
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
- Eine Immich-Instanz deployen (siehe Immich-Docs).
- Einen Admin-Account anlegen.
- In den Immich-Einstellungen unter Account Settings → API Keys einen neuen API-Key erstellen.
- Den API-Key und die Base-URL in die
.env-Datei eintragen.
Important
Die
IMMICH_BASE_URLmuss 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.
iServ-Cookie beschaffen
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.
So erhält man den Cookie
- Im Browser bei iServ einloggen (als Lehrer- oder Admin-Account).
- Die Browser-Entwicklertools öffnen (
F12→ Tab Netzwerk / Network). - Eine beliebige Seite in iServ aufrufen.
- Den Request an die iServ-Domain anklicken und in den Request Headers den Wert von
Cookiekopieren.- Der Cookie sieht typischerweise so aus:
IServSAT=abc123...; IServSID=xyz789...
- Der Cookie sieht typischerweise so aus:
- Den gesamten Cookie-String als Wert für
ISERV_COOKIEin 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.
- Einen kostenlosen Cloudflare-Account erstellen.
- Die Domain bei Cloudflare als DNS-Zone hinzufügen (Nameserver umstellen).
cloudflaredauf 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- Einen Tunnel erstellen und konfigurieren:
cloudflared tunnel create hogwartsnacht - Die Datei
~/.cloudflared/config.ymlerstellen: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 - DNS-Einträge anlegen:
cloudflared tunnel route dns hogwartsnacht hogwartsnacht.de cloudflared tunnel route dns hogwartsnacht api.hogwartsnacht.de - Tunnel als Systemd-Service starten:
cloudflared service install systemctl start cloudflared systemctl enable cloudflared
Option B: Nginx Reverse Proxy mit Let's Encrypt
- Nginx und Certbot installieren:
apt install nginx certbot python3-certbot-nginx - 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; } } - Aktivieren und SSL-Zertifikate beziehen:
Certbot erstellt die Zertifikate und passt bei Bedarf die Konfiguration weiter an. Die Zertifikate werden automatisch erneuert.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
Note
Bei Verwendung eines Nginx Reverse Proxys müssen
FRONTEND_PORTundBACKEND_PORTauf andere Werte gesetzt werden (z.B.3000und3001), 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
- Die Seite (z.B.
https://hogwartsnacht.de) in Chrome öffnen. - Im Browser-Menü (drei Punkte oben rechts) auf „Zum Startbildschirm hinzufügen" oder „App installieren" tippen.
- Den Namen bestätigen und auf „Hinzufügen" tippen.
- Die App erscheint als Icon auf dem Homescreen.
Installation auf iOS (iPhone/iPad)
- Die Seite in Safari öffnen (andere Browser unterstützen PWA-Installation auf iOS nicht).
- Auf das Teilen-Symbol (Quadrat mit Pfeil nach oben) tippen.
- Nach unten scrollen und „Zum Home-Bildschirm" auswählen.
- 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):
VornameNachnameKlasseId– 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 alsfalseinterpretiert.
Ablauf des Imports
- CSV hochladen → Schüler:innen, die bereits existieren (gleiche ID), werden automatisch übersprungen.
- Für jede zu importierende Schüler:in wird automatisch eine iServ-Suche nach der E-Mail-Adresse durchgeführt.
- Bei einem perfekten Match (Konfidenz = 10) wird die E-Mail automatisch ausgewählt.
- 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.
- „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:
- Schüler:in über die Suche (Name oder ID) filtern, bis genau ein Ergebnis angezeigt wird.
- Foto aufnehmen oder auswählen (unterstützt Kamera-Capture auf Mobilgeräten).
- „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=truean die URL (/verwaltung/mail?test=true) wird der Testmodus aktiviert. Dabei erscheint ein konfigurierbarer Dummy-Schüler, und Test-Mails werden an die inTEST_MAIL_RECEIVERhinterlegte Adresse gesendet. So kann das E-Mail-Template überprüft werden, bevor echte Mails versendet werden. Voraussetzung ist, dassTEST_MAIL_RECEIVERin 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:
-
Repository klonen
git clone https://github.com/BothimTV/punktesystem.git cd punktesystem -
.env-Datei erstellen (siehe Umgebungsvariablen) -
Immich einrichten (siehe Immich einrichten)
-
System starten
docker compose up --build -d -
Ersten Passkey erstellen
- Das Frontend öffnen (z.B.
https://hogwartsnacht.de). - Die App leitet auf
/loginweiter. - 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.
- Navigiere zu
- Alternativ kann der erste Passkey über die API erstellt werden.
- Das Frontend öffnen (z.B.
-
Admin-Passkey einrichten
- Auf
/login?admin=truenavigieren, um sich spezifisch als Admin anzumelden. - Auf
/verwaltung/passkeysweitere Passkeys (Admin oder User) erstellen.
- Auf
-
Schüler:innen importieren
- CSV-Datei vorbereiten (siehe CSV-Import).
- Auf
/verwaltung/schuelerdie CSV hochladen und den Import durchführen.
-
Event durchführen
- Benutzer loggen sich über
/loginein (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.
- Benutzer loggen sich über
-
Nach dem Event
- Statistiken unter
/verwaltung/statistikpräsentieren. - E-Mails über
/verwaltung/mailversenden (Punktestände + Fotoalbum-Links).
- Statistiken unter
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 (Wertfalse) 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
- Die Datei
frontend/src/pages/spiel.vuebearbeiten. - Im
games-Array Einträge hinzufügen, entfernen oder anpassen. - 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
- Build: Checkout +
docker compose buildauf dem Self-Hosted Runner. - 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.