slimcore-website/infra/marketing-vps/README.md
Pascal Oelmann 3c79b63db5
Some checks failed
Deploy Marketing-Site / Lint + Smoke-Tests (push) Failing after 1m9s
Deploy Marketing-Site / Deploy auf Marketing-VPS (push) Failing after 0s
Deploy Marketing-Site / Deploy-Notification (push) Successful in 9s
Initial Astro-Build, Deployment-Setup und Forgejo-Workflow
- Astro 6 + React + Tailwind v4 Projekt-Skelett mit allen Marketing-Seiten
  (Home, Module, Tester, Souveränität, Roadmap, Kontakt, Impressum, Datenschutz)
- Self-hosted Outfit + JetBrains Mono Fonts (DSGVO)
- Marketing-Komponenten gemäss CLAUDE.md §5.6 (NumberedItem, ModuleCard,
  StatusDot, TechStrip, SovereigntyBlock, RoadmapTimeline, etc.)
- Module-Daten in src/content/module.ts als Single Source of Truth
- E2E Smoke-Tests via Playwright
- OG-Image-Generator
- Forgejo Workflow .forgejo/workflows/deploy.yml für Tier-2 Static Deploy
- Infra-as-Code Snapshot in infra/marketing-vps/
- Brand-System Submodule auf Forgejo umgezogen (war GitHub)
- Deployment- und Handoff-Dokumentation
- .DS_Store aus Tracking entfernt, .gitignore um Test-Artefakte ergaenzt
2026-05-05 01:59:35 +02:00

2.6 KiB

Marketing-VPS Konfiguration

Diese Verzeichnisinhalte werden auf den Marketing-VPS (marketing.digiformer.eu) deployt und sind dort die Source of Truth für Caddy + Uptime Kuma.

Initial-Deploy auf den VPS

# Auf einem Rechner mit SSH-Zugang zum Marketing-VPS
rsync -avz --delete \
  -e "ssh -i ~/.ssh/marketing-admin" \
  infra/marketing-vps/ \
  deploy@marketing.digiformer.eu:/home/deploy/marketing/

# Auf dem Marketing-VPS
ssh deploy@marketing.digiformer.eu
cd /home/deploy/marketing
sudo mkdir -p /var/www /var/log/caddy
sudo chown -R deploy:deploy /var/www /var/log/caddy
docker compose up -d
docker compose logs -f caddy

Caddyfile-Update

Caddy validiert und lädt neu mit:

docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

Status-Page-Passwort setzen

docker compose exec caddy caddy hash-password
# Eingabe-Aufforderung, gibt bcrypt-Hash aus
# In Caddyfile bei `status.digiformer.eu` einsetzen, dann reload

Neue Marken-Site hinzufügen

  1. Caddyfile-Block ergänzen (analog zu slimcore.io)
  2. caddy reload (siehe oben)
  3. DNS A-Record für <neue-domain>.<tld> auf VPS-IP zeigen
  4. Forgejo-Workflow im jeweiligen Marken-Repo deployt automatisch nach /var/www/<neue-domain>/

SSH-Berechtigungen für Forgejo-Runner

Der Runner braucht einen User mit rsync-only-Rechten auf /var/www/:

# Auf Marketing-VPS
sudo adduser --disabled-password --gecos "" rsync-deploy
sudo mkdir -p /home/rsync-deploy/.ssh

# rrsync ist Teil des rsync-Pakets
sudo apt install rsync
RRSYNC=$(find /usr -name 'rrsync' 2>/dev/null | head -1)

# authorized_keys mit Befehls-Restriktion: nur Schreiben in /var/www
echo "command=\"$RRSYNC -wo /var/www\",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty <forgejo-runner-public-key>" \
  | sudo tee /home/rsync-deploy/.ssh/authorized_keys

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

# rsync-deploy braucht Schreibrechte
sudo chown rsync-deploy:rsync-deploy /var/www

Disaster-Recovery

  • Caddy-Container fällt ausdocker compose restart caddy
  • VPS unreachable → siehe docs/deployment.md (RTO ~45 min, statisches Build-Output reproduzierbar)
  • TLS-Cert-Problemcaddy-data-Volume enthält Let's-Encrypt-Account. Bei Volume-Verlust holt Caddy automatisch neue Certs (~30 s pro Domain)
  • Uptime-Kuma-Daten verloren → kritischer Schaden gering, Monitor-Konfiguration neu anlegen (~10 min)