Dockerfile.admin sets WORKDIR /app and copies the whole repo there, so hash-password.js lives at /app/admin/hash-password.js, not /app/hash-password.js (same pattern as the existing admin/server.js CMD). The docker compose run command in B6 was missing the admin/ prefix, causing MODULE_NOT_FOUND.
8.5 KiB
DEPLOYMENT_ADMIN.md – Login-Editor für larpaso.de
Ergänzt DEPLOYMENT.md um einen eigenen, öffentlich erreichbaren, aber login-geschützten
Editor unter https://admin.larpaso.de. Dort können Texte, Bilder, Links, Impressum,
Datenschutz sowie Schriftarten/-größen und alle Farben der Seite geändert werden.
„Speichern & veröffentlichen" baut die Seite neu und die Änderung ist sofort auf
larpaso.de sichtbar – ohne weiteren Server-Zugriff nötig.
Wie in DEPLOYMENT.md: Teil A ist bereits im Repo erledigt (Claude Code) und lokal getestet. Teil B unten führst du selbst per SSH auf dem Server aus – das ist eine vollständige Schritt-für-Schritt-Anleitung zum Copy-Pasten. Claude Code hat zu keinem Zeitpunkt Zugriff auf Benutzername/Passwort/Secrets oder den Server selbst.
Was der Editor kann
- Texte: alle Überschriften, Absätze, Listen, FAQ, Preis-Punkte, Mappe-Einträge usw. der Startseite – inklusive Impressum und Datenschutzerklärung.
- Bilder: Logo, Mappe-Screenshots, Team-Foto, plus optional eigene Bilder anstelle der eingebauten Google-Vorschau und des PDF/Tabellen-Vergleichs.
- Links: Menüpunkte, E-Mail-Adresse, Kontakt-Angaben.
- Design: Schriftart für Überschriften/Fließtext (Auswahl aus gängigen Google Fonts oder Systemschrift), Schriftgrößen (7 Stufen, per Schieberegler), und alle Farben der Seite einzeln über Hex-Feld, RGB-Schieberegler und Transparenz-Regler.
Was sich technisch ändert
- Neuer Dienst
admin(Node/Express,admin/) mit Login, Bearbeitungsoberfläche und einem „Veröffentlichen"-Knopf, der internnpm run buildausführt. - Der bestehende
website-Dienst (nginx) serviert nicht mehr aus dem Image gebackene Dateien, sondern aus einem gemeinsamen Volume (site-dist), das deradmin-Dienst nach jedem „Veröffentlichen" neu befüllt. Kein Neustart vonwebsitenötig. - Bearbeitete Inhalte (
content/site.json,content/theme.json) und hochgeladene Bilder (public/uploads/) liegen auf eigenen Volumes, damit sie ein Image-Update überleben. - Login: fester Benutzername + Passwort (bcrypt-Hash), Session-Cookie (12h, httpOnly, Secure, SameSite=Strict), Rate-Limit (5 Fehlversuche → 15 Min. Sperre pro IP).
TEIL A – im Repo (bereits erledigt)
admin/– Editor-Backend + -Oberfläche (Login, Formulare, Bild-Upload, Farb-/Font-/ Größen-Editor, Build-Trigger).content/site.json,content/theme.json– alle editierbaren Inhalte bzw. Design-Werte.Dockerfile.admin– Image für denadmin-Dienst.Dockerfile(angepasst) –websiteseedet ein leeressite-dist-Volume beim ersten Start aus dem gebackenen Build, statt Dateien fest einzubacken.docker-entrypoint-seed.sh,docker-entrypoint-admin-seed.sh– Seed-Skripte für die Volumes.- Lokal geprüft:
npm run buildläuft fehlerfrei; Login, Rate-Limit-Sperre, Speichern (Texte, Bilder, Impressum/Datenschutz, Farben, Schriftarten, Schriftgrößen), Bild-Upload und Veröffentlichen wurden lokal gegen den Admin-Server End-to-End getestet.
TEIL B – Schritt für Schritt per SSH (machst du)
Alles unten in dieser Reihenfolge ausführen. Wo <...> steht, durch echte Werte ersetzen.
B0. Voraussetzung: Code muss auf dem Server ankommen können
Damit git pull in B1 etwas findet, muss dieser Stand vorher nach
git.larpaso.de/pascal/larpaso-website gepusht sein. Frag im Chat nach, ob das schon
passiert ist, falls du direkt startest.
B1. Repo aktualisieren
ssh deploy@<server>
cd ~/sites/larpaso-website
git pull
B2. Platzhalter für ~/stack/admin.env anlegen (NICHT ins Git-Repo!)
Erstmal nur eine leere Datei, damit Docker Compose in B3/B5 nicht meckert, dass sie fehlt. Die echten Werte kommen in B6 rein.
touch ~/stack/admin.env
chmod 600 ~/stack/admin.env
B3. Dienste in ~/stack/docker-compose.yml ergänzen
nano ~/stack/docker-compose.yml
Beim bestehenden website-Dienst ein volumes: ergänzen:
website:
build:
context: /home/deploy/sites/larpaso-website
restart: unless-stopped
networks: [web]
volumes:
- site-dist:/usr/share/nginx/html
Neuen admin-Dienst unter services: ergänzen:
admin:
build:
context: /home/deploy/sites/larpaso-website
dockerfile: Dockerfile.admin
restart: unless-stopped
networks: [web]
env_file:
- /home/deploy/stack/admin.env
volumes:
- site-dist:/site-dist
- admin-content:/app/content
- admin-uploads:/app/public/uploads
(Kein ports: bei beiden Diensten – Caddy erreicht sie intern über den Container-Namen.)
Im bestehenden obersten volumes:-Block der Datei ergänzen (nicht neu anlegen):
volumes:
site-dist:
admin-content:
admin-uploads:
B4. Caddy-Block ergänzen
nano ~/stack/caddy/Caddyfile
Hinzufügen:
admin.larpaso.de {
reverse_proxy admin:4321
}
B5. Admin-Image bauen
cd ~/stack
docker compose build admin
Das baut das Image für den Login-Editor – inklusive eines sauberen npm ci für die
Admin-Abhängigkeiten (bcryptjs, Express usw.), im selben zuverlässigen Schritt, der auch
gleich für den Live-Betrieb verwendet wird.
B6. Login-Zugangsdaten erzeugen
Jetzt mit dem gerade gebauten Image statt einem Wegwerf-Container – robuster als ein
Ad-hoc-npm install (das kann mit dem bekannten npm-Fehler „Tracker 'idealTree' already
exists" fehlschlagen):
docker compose run --rm admin node admin/hash-password.js "dein-neues-passwort"
Gibt einen bcrypt-Hash aus (beginnt mit $2a$ oder $2b$) – merken/kopieren.
Zufälliges Session-Secret erzeugen:
docker compose run --rm admin node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Auch kopieren.
B7. ~/stack/admin.env mit echten Werten befüllen
cat > ~/stack/admin.env <<'EOF'
NODE_ENV=production
ADMIN_USERNAME=pascal
ADMIN_PASSWORD_HASH=<bcrypt-Hash aus B6 hier einfügen>
SESSION_SECRET=<Hex-String aus B6 hier einfügen>
EOF
chmod 600 ~/stack/admin.env
B8. DNS bei IONOS
- Neuer A-Eintrag: Hostname
admin→ Server-IPv4 (gleiche IP wie@). - Kurz warten/prüfen:
nslookup admin.larpaso.demuss die Server-IP liefern, bevor B9 läuft (sonst bekommt Caddy kein Zertifikat).
B9. Bauen & starten
cd ~/stack
docker compose build website
docker compose up -d website admin
docker compose restart caddy
docker compose logs -f caddy # auf "certificate obtained successfully" für admin.larpaso.de warten, dann Strg+C
(admin wurde schon in B5 gebaut – falls du seitdem nochmal git pull gemacht hast,
einmal docker compose build admin vorweg wiederholen.)
B10. Prüfen
https://admin.larpaso.de/admin/loginöffnen, mit den Zugangsdaten aus B6/B7 anmelden.- Eine Kleinigkeit ändern (z. B. Telefonnummer im Abschnitt „Kontakt" oder eine Farbe im Abschnitt „Design – Farben"), Speichern & veröffentlichen klicken.
- Build-Ausgabe sollte mit „Complete!" enden.
https://larpaso.deneu laden (ggf. Hard-Reload / Cache leeren) – Änderung sollte sofort da sein.
Fertig. Ab jetzt kannst du alle Texte, Bilder, Links und das Design selbst über
admin.larpaso.de pflegen, ohne mich oder SSH zu brauchen.
Künftige Updates am Code (Admin-Backend selbst)
Ändert sich admin/ oder das Editor-Frontend am Code (nicht über die Editor-Oberfläche,
sondern durch mich im Chat), reicht danach:
cd ~/sites/larpaso-website && git pull
cd ~/stack && docker compose build admin && docker compose up -d admin
content/site.json, content/theme.json und hochgeladene Bilder bleiben unangetastet
(liegen auf eigenen Volumes, nicht im Image).
Bekannte Grenzen
- Nur ein Login (kein Mehrbenutzer-System, keine Passwort-Reset-Funktion in der
Oberfläche – neues Passwort:
docker compose run --rm admin node admin/hash-password.js "..."ausführen (wie B6), neuen Hash inadmin.enveintragen, danndocker compose up -d admin). - Sessions sind In-Memory: Ein Neustart des
admin-Containers meldet alle ab. - Es gibt keine Versionshistorie der Inhalte oder des Designs – beides liegt aber auf dem
Server und kann bei Bedarf manuell gesichert werden (z. B. regelmäßiges Backup der
Volumes
admin-contentundadmin-uploadseinplanen, wie für die anderen Volumes auch). - Schriftarten sind auf eine kuratierte Liste gängiger Google Fonts + Systemschrift begrenzt (keine eigenen Font-Dateien hochladbar) – bei Bedarf im Chat erweiterbar.