# Deployment Guide - Payload CMS Multi-Tenant *Letzte Aktualisierung: 17. Januar 2026* > **Wichtig:** Für die vollständige Deployment-Strategie siehe [DEPLOYMENT_STRATEGY.md](./DEPLOYMENT_STRATEGY.md) ## Übersicht ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ DEVELOPMENT │ │ STAGING │ │ PRODUCTION │ │ sv-frontend │───▶│ sv-payload │───▶│ Hetzner 3 │ │ Local Dev │ │ pl.porwoll.tech│ │ cms.c2sgmbh.de │ │ develop branch │ │ develop branch │ │ main branch │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` --- ## Umgebungen | Umgebung | Server | URL | Branch | Zweck | |----------|--------|-----|--------|-------| | **Development** | sv-payload (LXC 700) | https://pl.porwoll.tech | `develop` | Entwicklung & Testing | | **Production** | Hetzner 3 | https://cms.c2sgmbh.de | `main` | Live-System | --- ## Git Branching Workflow **Regel:** Immer auf `develop` entwickeln, nach Freigabe mit `main` mergen. ```bash # 1. Auf develop entwickeln git checkout develop git pull origin develop git add . && git commit -m "feat: neue Funktion" git push origin develop # → Automatisches Deployment auf Staging # 2. Nach Test: Merge in main git checkout main && git merge develop && git push origin main # → Manuelles Deployment auf Production ``` --- ## Staging Deployment (develop → pl.porwoll.tech) ### Automatisch via GitHub Actions Bei jedem Push auf `develop` wird automatisch deployed: 1. Pre-deployment Checks (Lint, Tests) 2. SSH-Verbindung zu sv-payload 3. `git pull origin develop` 4. `pnpm install` 5. `pnpm payload migrate` 6. `pnpm build` 7. `pm2 restart payload` 8. Health Check ### Manuell auf sv-payload ```bash ssh payload@10.10.181.100 cd /home/payload/payload-cms git pull origin develop pnpm install pnpm payload migrate pnpm build pm2 restart payload pm2 logs payload --lines 20 ``` --- ## Production Deployment (main → cms.c2sgmbh.de) ### Option A: Via GitHub Actions (Empfohlen) ```bash git checkout main && git merge develop && git push origin main gh workflow run deploy-production.yml ``` Der Workflow führt automatisch aus: Pre-flight Checks, Tests, Datenbank-Backup, Deployment, Health Check, bei Fehler automatischer Rollback. ### Option B: Via Deploy-Script auf Server ```bash ssh payload@162.55.85.18 cd ~/payload-cms ./scripts/deploy-production.sh # Optionen: ./scripts/deploy-production.sh -y # Ohne Bestätigung ./scripts/deploy-production.sh --skip-backup # Ohne Backup ./scripts/deploy-production.sh --rollback # Rollback ./scripts/deploy-production.sh --dry-run # Dry-Run ``` --- ## Rollback ```bash # Automatischer Rollback ./scripts/deploy-production.sh --rollback # Manuell zu Commit git log --oneline -10 git reset --hard pnpm install && pnpm build pm2 restart payload ``` --- ## CI/CD Pipeline | Workflow | Trigger | Aktion | |----------|---------|--------| | `ci.yml` | Push/PR auf main, develop | Lint, Test, Build | | `security.yml` | Push/PR, Schedule | Security Scanning | | `deploy-staging.yml` | Push auf develop | Auto-Deploy zu Staging | | `deploy-production.yml` | Manuell | Production Deployment | ### GitHub Secrets | Secret | Beschreibung | |--------|-------------| | `STAGING_SSH_KEY` | SSH Private Key für sv-payload | | `PRODUCTION_SSH_KEY` | SSH Private Key für Hetzner 3 | --- ## Umgebungsvariablen ### Production (.env) ```env DATABASE_URI=postgresql://payload:***@localhost:5432/payload_db PAYLOAD_PUBLIC_SERVER_URL=https://cms.c2sgmbh.de NODE_ENV=production PORT=3001 REDIS_URL=redis://localhost:6379 ``` ### Staging (.env) ```env DATABASE_URI=postgresql://payload:***@127.0.0.1:6432/payload_db PAYLOAD_PUBLIC_SERVER_URL=https://pl.porwoll.tech NODE_ENV=production PORT=3000 REDIS_URL=redis://localhost:6379 ``` --- ## Health Check ```bash pm2 status pm2 logs payload --lines 50 curl -I https://cms.c2sgmbh.de/api/users curl -I https://cms.c2sgmbh.de/admin redis-cli ping ```