# TECHSTACK DOKUMENTATION - DEZEMBER 2025 ## Infrastruktur-Gesamtübersicht ``` ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ GESAMTARCHITEKTUR │ │ │ │ ┌───────────────────────────────────────────────────────────────────────────────┐ │ │ │ LOKALE ENTWICKLUNGSUMGEBUNG │ │ │ │ (Proxmox VE Cluster) │ │ │ │ LAN: 10.10.181.0/24 │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ sv-payload │ │ sv-postgres │ │sv-dev-payload│ │sv-analytics │ │ │ │ │ │ LXC 700 │ │ LXC 701 │ │ LXC 702 │ │ LXC 703 │ │ │ │ │ │ Payload CMS │ │ PostgreSQL │ │ Next.js │ │ Umami │ │ │ │ │ │10.10.181.100│ │10.10.181.101│ │10.10.181.102│ │10.10.181.103│ │ │ │ │ │ + Redis │ │ │ │ │ │ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └───────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌───────────────────┴───────────────────┐ │ │ │ LOKALER INTERNETZUGANG │ │ │ │ 850 Mbps ↓ / 50 Mbps ↑ │ │ │ │ │ │ │ │ Feste IP-Adressen: │ │ │ │ 37.24.237.178 - Router │ │ │ │ 37.24.237.179 - complexcaresolutions │ │ │ │ 37.24.237.180 - Nginx Proxy Manager │ │ │ │ 37.24.237.181 - pl.c2sgmbh.de │ │ │ │ 37.24.237.182 - frei │ │ │ └───────────────────┬───────────────────┘ │ │ │ │ │ INTERNET │ │ │ │ │ ┌──────────────────────────────────┼──────────────────────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ HETZNER 1 │ │ HETZNER 2 │ │ HETZNER 3 │ │ │ │ CCS GmbH │ │ Martin Porwoll │ │ Backend/Analytics │ │ │ │ │ │ │ │ │ │ │ │ 78.46.87.137 │ │ 94.130.141.114 │ │ 162.55.85.18 │ │ │ │ Debian 12.12 │ │ Ubuntu 24.04 │ │ Debian 13 │ │ │ │ Plesk │ │ Plesk │ │ Native │ │ │ │ │ │ │ │ │ │ │ │ Next.js Frontends │ │ Next.js Frontends │ │ ✅ Payload CMS │ │ │ │ • complexcare... │ │ • porwoll.de │ │ ✅ Umami │ │ │ │ • gunshin.de │ │ • caroline-... │ │ ✅ PostgreSQL 17 │ │ │ └─────────────────────┘ └─────────────────────┘ │ ✅ Redis Cache │ │ │ │ ✅ Claude Code │ │ │ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ ``` --- ## Server-Details ### HETZNER 3 - Backend & Analytics (NEU) | Eigenschaft | Wert | |-------------|------| | **Hostname** | sv-hz03-backend | | **IP-Adresse** | 162.55.85.18 | | **Betriebssystem** | Debian 13 "Trixie" | | **CPU** | AMD Ryzen 5 3600 (6 Cores / 12 Threads) | | **RAM** | 64 GB DDR4 ECC | | **Storage** | 2x 512 GB NVMe SSD (Software RAID 1) | | **Netzwerk** | 1 Gbit/s (garantiert) | | **Traffic** | Unbegrenzt | | **Kosten** | ~€52/Monat | #### Services auf Hetzner 3 | Service | User | Port | URL | Status | |---------|------|------|-----|--------| | PostgreSQL 17 | postgres | 5432 | localhost | ✅ Läuft | | Payload CMS | payload | 3001 | https://cms.c2sgmbh.de | ✅ Läuft | | Umami Analytics | umami | 3000 | https://analytics.c2sgmbh.de | ✅ Läuft | | Redis Cache | redis | 6379 | localhost | ✅ Läuft | | Nginx | root | 80/443 | Reverse Proxy | ✅ Läuft | | Claude Code | claude | - | CLI Tool | ✅ Installiert | #### System-User | User | Zweck | Home-Verzeichnis | |------|-------|------------------| | root | System-Administration | /root | | payload | Payload CMS | /home/payload | | umami | Umami Analytics | /home/umami | | claude | Claude Code / Server-Admin | /home/claude | #### SSH-Zugang ```bash ssh root@162.55.85.18 ssh payload@162.55.85.18 ssh umami@162.55.85.18 ssh claude@162.55.85.18 ``` --- ### HETZNER 1 - Complex Care Solutions GmbH | Eigenschaft | Wert | |-------------|------| | **Eigentümer** | Complex Care Solutions GmbH | | **IP-Adresse** | 78.46.87.137 | | **Betriebssystem** | Debian 12.12 | | **Control Panel** | Plesk Web Pro Edition 18.0.73 | | **CPU** | AMD Ryzen 7 Pro 8700GE | | **RAM** | 64 GB | | **Storage** | 2x 512 GB NVMe SSD (Software RAID 1) | | **Max. Domains** | 30 | #### Domains auf Hetzner 1 | Domain | DNS/Weiterleitung | Zweck | |--------|-------------------|-------| | **complexcaresolutions.de** | A: 78.46.87.137 | Hauptdomain | | complexcaresolutions.at/ch/eu/nl | → complexcaresolutions.de | Redirects | | complexcaresolutions.org | A: 78.46.87.137 | Alternate | | complex-care-solutions.com | A: 78.46.87.137 | International | | **gunshin.de** | Vorlage: Standard | Portfolio/Holding | | c2sgmbh.de | → complexcaresolutions.de | Kurzform | | zweitmeinung-*.de | → complexcaresolutions.de | Fachgebiete | --- ### HETZNER 2 - Martin Porwoll (privat) | Eigenschaft | Wert | |-------------|------| | **Eigentümer** | Martin Porwoll (privat) | | **IP-Adresse** | 94.130.141.114 | | **Betriebssystem** | Ubuntu 24.04 LTS | | **Control Panel** | Plesk Web Pro Edition 18.0.73 | | **CPU** | Intel Xeon E3-1275v6 | | **RAM** | 64 GB | | **Storage** | 2x 512 GB NVMe SSD (Software RAID 1) | | **Max. Domains** | 30 | #### Domains auf Hetzner 2 | Domain | DNS/Weiterleitung | Zweck | |--------|-------------------|-------| | **porwoll.de** | A: 94.130.141.114 | Hauptdomain | | **caroline-porwoll.de** | A: 94.130.141.114 | Dr. Caroline Porwoll | | caroline-porwoll.com | A: 94.130.141.114 | International | | porwoll.com/cloud/live/shop/tech | Vorlage: Standard | Varianten | --- ### Lokale Infrastruktur (Proxmox) | Server | IP | Port | Funktion | OS | |--------|-----|------|----------|-----| | sv-payload | 10.10.181.100 | 3000 | Payload CMS (Dev) + Redis | Debian 13 | | sv-postgres | 10.10.181.101 | 5432 | PostgreSQL (Dev) | Debian 13 | | sv-dev-payload | 10.10.181.102 | 3001 | Next.js Frontend | Debian 13 | | sv-analytics | 10.10.181.103 | 3000 | Umami (Dev) | Debian 13 | #### Feste IP-Adressen (Lokal) | IP | Verwendung | |----|------------| | 37.24.237.178 | Router / Gateway | | 37.24.237.179 | complexcaresolutions.cloud | | 37.24.237.180 | Nginx Proxy Manager | | 37.24.237.181 | pl.c2sgmbh.de (Payload Dev) | | 37.24.237.182 | **Frei** | --- ## Credentials ### sv-hz03-backend (162.55.85.18) - Produktion #### PostgreSQL | Datenbank | User | Passwort | |-----------|------|----------| | payload_db | payload | Suchen55 | | umami_db | umami | Suchen55 | #### Redis ```bash redis-cli -h localhost -p 6379 # Kein Passwort (nur localhost) ``` #### Umami Analytics | URL | User | Passwort | |-----|------|----------| | https://analytics.c2sgmbh.de | admin | ⚠️ ÄNDERN! (Standard: umami) | #### Payload CMS | URL | User | Passwort | |-----|------|----------| | https://cms.c2sgmbh.de/admin | [wie Dev] | [wie Dev] | #### Environment Variables - Payload (.env) ```env DATABASE_URI=postgresql://payload:Suchen55@localhost:5432/payload_db PAYLOAD_SECRET=hxPARlMkmv+ZdCOAMw+N4o2x4mNbERB237iDQTYXALY= PAYLOAD_PUBLIC_SERVER_URL=https://cms.c2sgmbh.de NEXT_PUBLIC_SERVER_URL=https://cms.c2sgmbh.de NODE_ENV=production PORT=3001 CONSENT_LOGGING_API_KEY=7644095c1be9b726ac6c1433c7a544f4d99b55337d70f52c8dc85a4b76ef9f1a IP_ANONYMIZATION_PEPPER=18f2d29f1ead67f15fec88ee2357565a6c0073394bcd085ef636f877954bd546 REDIS_HOST=localhost REDIS_PORT=6379 ``` #### Environment Variables - Umami (.env) ```env DATABASE_URL=postgresql://umami:Suchen55@localhost:5432/umami_db APP_SECRET=aqwsOyaH/1IyWHby+Ni5e5IIt/soJwvWcfxMM6kwYS0= TRACKER_SCRIPT_NAME=custom COLLECT_API_ENDPOINT=/api/send DISABLE_TELEMETRY=1 ``` --- ### pl.c2sgmbh.de (Entwicklung) #### PostgreSQL (sv-postgres) | Datenbank | User | Passwort | |-----------|------|----------| | payload_db | payload | Finden55 | #### Redis (sv-payload) ```bash redis-cli -h localhost -p 6379 # Kein Passwort (nur localhost) ``` #### Environment Variables (.env) ```env DATABASE_URI=postgresql://payload:Finden55@10.10.181.101:5432/payload_db PAYLOAD_SECRET=a53b254070d3fffd2b5cfcc3 PAYLOAD_PUBLIC_SERVER_URL=https://pl.c2sgmbh.de NEXT_PUBLIC_SERVER_URL=https://pl.c2sgmbh.de NODE_ENV=production PORT=3000 CONSENT_LOGGING_API_KEY=7644095c1be9b726ac6c1433c7a544f4d99b55337d70f52c8dc85a4b76ef9f1a IP_ANONYMIZATION_PEPPER=18f2d29f1ead67f15fec88ee2357565a6c0073394bcd085ef636f877954bd546 REDIS_HOST=localhost REDIS_PORT=6379 ``` --- ## Redis Caching ### Architektur ``` ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ REDIS CACHING STRATEGIE │ │ │ │ Request → Payload CMS → Redis Cache? │ │ │ │ │ ┌────┴────┐ │ │ HIT MISS │ │ │ │ │ │ ▼ ▼ │ │ Return PostgreSQL → Cache in Redis → Return │ │ │ │ Cache-Typen: │ │ • API Response Cache (GET /api/pages, /api/posts) │ │ • Automatische Invalidierung bei Content-Änderungen │ │ │ │ Konfiguration: │ │ • Max Memory: 2GB (Prod) / 512MB (Dev) │ │ • Eviction: allkeys-lru │ │ • TTL: 5 Minuten (Standard) │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ ``` ### Redis Befehle ```bash # Status prüfen redis-cli ping # Statistiken redis-cli info stats # Cache-Keys anzeigen redis-cli keys "*" # Cache leeren redis-cli flushdb # Live-Monitoring redis-cli monitor ``` ### Cache-Dateien im Projekt ``` src/ ├── lib/ │ ├── redis.ts # Redis Client & Cache Helper │ └── cache-keys.ts # Cache Key Definitionen └── hooks/ └── invalidateCache.ts # Cache Invalidierung bei Content-Änderungen ``` --- ## Claude Code ### Installation auf sv-hz03-backend ```bash ssh claude@162.55.85.18 claude ``` ### CLAUDE.md Standort ``` /home/claude/CLAUDE.md ``` ### Berechtigungen | Berechtigung | Status | |--------------|--------| | sudo systemctl restart nginx | ✅ NOPASSWD | | sudo systemctl restart postgresql | ✅ NOPASSWD | | sudo systemctl status * | ✅ NOPASSWD | | sudo su - payload | ✅ NOPASSWD | | sudo su - umami | ✅ NOPASSWD | | sudo redis-cli * | ✅ NOPASSWD | ### Häufige Claude Code Aufgaben ```bash # Service-Status sudo su - payload -c "pm2 status" sudo systemctl status nginx postgresql redis-server # Logs sudo su - payload -c "pm2 logs payload" sudo tail -f /var/log/nginx/error.log # Deployment sudo su - payload -c "~/deploy.sh" # Backup sudo su - payload -c "~/backup.sh" # Redis Monitor sudo redis-cli monitor ``` --- ## Git & GitHub ### Repository | Eigenschaft | Wert | |-------------|------| | **Repository** | https://github.com/c2s-admin/cms.c2sgmbh.git | | **Visibility** | Private | | **Owner** | c2s-admin | | **Branch** | main | ### GitHub CLI Installation **Auf Debian/Ubuntu:** ```bash # GPG-Schlüssel hinzufügen curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg # Repository hinzufügen echo "deb [arch=amd64 signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list # Installation sudo apt update sudo apt install gh -y ``` ### GitHub Authentifizierung ```bash # Mit Web-Authentifizierung gh auth login --web # Status prüfen gh auth status ``` ### Git-Konfiguration **Remote Repository:** ```bash # HTTPS (empfohlen für gh auth) git remote add origin https://github.com/c2s-admin/cms.c2sgmbh.git # Remote prüfen git remote -v # Remote URL ändern (falls nötig) git remote set-url origin https://github.com/c2s-admin/cms.c2sgmbh.git ``` **SSH-Keys (Alternative):** ```bash # SSH-Key generieren ssh-keygen -t ed25519 -C "payload@c2sgmbh.de" # Public Key zu GitHub hinzufügen cat ~/.ssh/id_ed25519.pub # → Auf GitHub.com: Settings → SSH and GPG keys → New SSH key # SSH Remote verwenden git remote set-url origin git@github.com:c2s-admin/cms.c2sgmbh.git ``` ### .gitignore (Wichtig!) Sensible Dateien, die NICHT committed werden dürfen: ```gitignore # Environment Variables .env .env*.local # Build-Ausgaben /.next/ /build /out # Dependencies /node_modules # Backups & Datenbanken *.sql *.sql.gz /backups/ # Media-Uploads /media # Logs *.log ``` ### Git Workflow **Entwicklung (pl.c2sgmbh.de):** ```bash cd /home/payload/payload-cms # Status prüfen git status # Änderungen stagen git add . # Commit erstellen git commit -m "feat: Beschreibung der Änderung" # Zu GitHub pushen git push origin main ``` **Commit Message Konventionen:** ``` feat: Neues Feature fix: Bugfix chore: Wartung/Cleanup docs: Dokumentation refactor: Code-Refactoring style: Formatierung test: Tests ``` ### Nützliche Git-Befehle ```bash # Letzte Commits anzeigen git log --oneline -10 # Änderungen anzeigen git diff git diff --staged # Änderungen rückgängig machen git restore # Unstaged Änderungen verwerfen git restore --staged # Aus Staging entfernen # Branch-Info git branch -a git status # Von GitHub pullen git pull origin main # Merge-Konflikte prüfen git diff --name-only --diff-filter=U ``` ### GitHub CLI Befehle ```bash # Repository anzeigen gh repo view gh repo view --web # Issues gh issue list gh issue create # Pull Requests gh pr list gh pr create # Repository klonen gh repo clone c2s-admin/cms.c2sgmbh ``` ### Backup über Git (Ausnahme!) **Normalerweise:** SQL-Dateien werden NICHT committed (`.gitignore`) **Ausnahme für Server-Migration:** ```bash # Backup erzwingen (einmalig!) git add -f backup.sql git commit -m "chore: temporary database backup for migration" git push # ⚠️ WICHTIG: Nach Transfer wieder entfernen! git rm backup.sql git commit -m "chore: remove database backup after migration" git push # Optional: Aus Git-Historie komplett löschen git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch backup.sql" \ --prune-empty --tag-name-filter cat -- --all git push origin --force --all ``` --- ## Deployment Workflow ``` ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ DEPLOYMENT WORKFLOW │ │ │ │ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ ENTWICKLUNG (DEV) │ │ PRODUKTION (PROD) │ │ │ │ pl.c2sgmbh.de │ │ cms.c2sgmbh.de │ │ │ │ 37.24.237.181 │ │ 162.55.85.18 │ │ │ │ 10.10.181.100 (LAN) │ │ │ │ │ └──────────────────────────────────┘ └──────────────────────────────────┘ │ │ │ │ Step 1: CODE ENTWICKELN │ │ ┌────────────────────────────────────────────────────────────────────────┐ │ │ │ cd /home/payload/payload-cms │ │ │ │ # Code ändern, testen │ │ │ │ pnpm dev # Lokal testen │ │ │ │ pnpm build # Build-Test │ │ │ │ pm2 restart payload # Auf Dev-Server deployen │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ │ │ Step 2: ZU GITHUB PUSHEN │ │ ┌────────────────────────────────────────────────────────────────────────┐ │ │ │ git status # Änderungen prüfen │ │ │ │ git add . # Alle Änderungen stagen │ │ │ │ git commit -m "feat: XYZ" # Commit erstellen │ │ │ │ git push origin main # Zu GitHub pushen │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ GITHUB REPOSITORY (PRIVAT) │ │ │ │ https://github.com/c2s-admin/cms.c2sgmbh │ │ │ │ │ │ │ │ ✅ Code gesichert │ │ │ │ ✅ Versionierung │ │ │ │ ✅ .env in .gitignore │ │ │ │ ✅ Backup SQL (temporär, nach Transfer löschen) │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ │ │ Step 3: AUF PRODUKTION DEPLOYEN │ │ ┌────────────────────────────────────────────────────────────────────────┐ │ │ │ ssh payload@162.55.85.18 │ │ │ │ ~/deploy.sh # Automatisches Deployment │ │ │ │ │ │ │ │ Das deploy.sh Script macht: │ │ │ │ ├─ git pull origin main # Code von GitHub holen │ │ │ │ ├─ pnpm install # Dependencies aktualisieren │ │ │ │ ├─ pnpm build # Produktions-Build │ │ │ │ └─ pm2 restart payload # Service neustarten │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ │ │ Step 4: VERIFIZIERUNG │ │ ┌────────────────────────────────────────────────────────────────────────┐ │ │ │ pm2 status # Prozess läuft? │ │ │ │ pm2 logs payload --lines 20 # Logs prüfen │ │ │ │ curl https://cms.c2sgmbh.de/api/globals/site-settings │ │ │ │ # Browser: https://cms.c2sgmbh.de/admin │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ ``` ### Git-Setup auf Servern | Server | User | Remote | Auth-Methode | Status | |--------|------|--------|--------------|--------| | pl.c2sgmbh.de (Dev) | payload | HTTPS | GitHub CLI (`gh auth`) | ✅ Konfiguriert | | cms.c2sgmbh.de (Prod) | payload | SSH | SSH-Key | ✅ Eingerichtet | ### Deployment-Befehle **Entwicklungsserver → GitHub:** ```bash # Auf pl.c2sgmbh.de (10.10.181.100) cd /home/payload/payload-cms # 1. Änderungen prüfen git status git diff # 2. Build-Test lokal pnpm build pm2 restart payload # 3. Testen curl https://pl.c2sgmbh.de/api/globals/site-settings # 4. Zu Git committen git add . git commit -m "feat: Beschreibung der Änderung" # 5. Zu GitHub pushen git push origin main ``` **GitHub → Produktionsserver:** ```bash # Option A: SSH + Deploy-Script (empfohlen) ssh payload@162.55.85.18 '~/deploy.sh' # Option B: Manuelles SSH-Login ssh payload@162.55.85.18 cd ~/payload-cms git pull origin main pnpm install pnpm build pm2 restart payload pm2 logs payload --lines 20 ``` ### Deploy-Script (~/deploy.sh) ```bash #!/bin/bash set -e echo "🚀 Deployment gestartet..." cd ~/payload-cms echo "📥 Git Pull..." git pull origin main echo "📦 Dependencies installieren..." pnpm install echo "🔨 Build erstellen..." pnpm build echo "🔄 PM2 Neustart..." pm2 restart payload echo "✅ Deployment abgeschlossen!" pm2 status ``` --- ## Backup ### Backup-Script (~/backup.sh) ```bash #!/bin/bash set -e BACKUP_DIR=~/backups DATE=$(date +%Y-%m-%d_%H-%M-%S) RETENTION_DAYS=7 mkdir -p $BACKUP_DIR echo "🔄 Backup gestartet: $DATE" # PostgreSQL Backup PGPASSWORD=Suchen55 pg_dump -h localhost -U payload payload_db > $BACKUP_DIR/payload_db_$DATE.sql PGPASSWORD=Suchen55 pg_dump -h localhost -U umami umami_db > $BACKUP_DIR/umami_db_$DATE.sql # Komprimieren gzip $BACKUP_DIR/payload_db_$DATE.sql gzip $BACKUP_DIR/umami_db_$DATE.sql # Alte Backups löschen find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "✅ Backup abgeschlossen!" ls -lh $BACKUP_DIR/*.sql.gz 2>/dev/null | tail -10 ``` ### Cronjob (täglich 3:00 Uhr) ``` 0 3 * * * /home/payload/backup.sh >> /home/payload/backups/backup.log 2>&1 ``` ### Backup-Speicherort ``` /home/payload/backups/ ├── payload_db_2025-12-05_03-00-00.sql.gz ├── umami_db_2025-12-05_03-00-00.sql.gz └── backup.log ``` --- ## Service-Management ### PM2 Befehle ```bash # Status pm2 status # Logs pm2 logs payload pm2 logs umami # Neustart pm2 restart payload pm2 restart umami # Alle neustarten pm2 restart all # Speichern für Autostart pm2 save ``` ### Systemd Services ```bash # PostgreSQL systemctl status postgresql systemctl restart postgresql # Nginx systemctl status nginx systemctl restart nginx nginx -t # Config testen # Redis systemctl status redis-server systemctl restart redis-server ``` --- ## URLs Übersicht | Service | Entwicklung | Produktion | |---------|-------------|------------| | Payload Admin | https://pl.c2sgmbh.de/admin | https://cms.c2sgmbh.de/admin | | Payload API | https://pl.c2sgmbh.de/api | https://cms.c2sgmbh.de/api | | Umami | - | https://analytics.c2sgmbh.de | --- ## SSH Schnellzugriff ```bash # Produktion (Hetzner 3) ssh root@162.55.85.18 # Root ssh payload@162.55.85.18 # Payload User ssh umami@162.55.85.18 # Umami User ssh claude@162.55.85.18 # Claude Code # Hetzner Server ssh root@78.46.87.137 # Hetzner 1 (CCS) ssh root@94.130.141.114 # Hetzner 2 (Porwoll) # Entwicklung (Proxmox) ssh payload@10.10.181.100 # sv-payload ssh root@10.10.181.101 # sv-postgres ssh developer@10.10.181.102 # sv-dev-payload ssh root@10.10.181.103 # sv-analytics ``` --- ## Wichtige Dateipfade ### sv-hz03-backend (Produktion) ``` /home/payload/ ├── payload-cms/ # Payload CMS │ ├── .env # Environment │ ├── src/ # Source Code │ │ ├── lib/ │ │ │ ├── redis.ts # Redis Client │ │ │ └── cache-keys.ts # Cache Keys │ │ └── hooks/ │ │ └── invalidateCache.ts │ └── .next/ # Build Output ├── deploy.sh # Deployment Script ├── backup.sh # Backup Script └── backups/ # Backups /home/umami/ └── umami/ # Umami Analytics ├── .env └── .next/ /home/claude/ └── CLAUDE.md # Claude Code Kontext ``` --- ## Firewall (UFW) ```bash ufw status verbose # Offene Ports auf sv-hz03-backend: # 22/tcp - SSH # 80/tcp - HTTP # 443/tcp - HTTPS ``` --- ## SSL Zertifikate | Domain | Anbieter | Ablauf | |--------|----------|--------| | cms.c2sgmbh.de | Let's Encrypt | 2026-03-05 | | analytics.c2sgmbh.de | Let's Encrypt | 2026-03-05 | Auto-Renewal via Certbot Timer. --- ## Tech Stack | Komponente | Technologie | Version | |------------|-------------|---------| | CMS | Payload CMS | 3.66.0 | | Framework | Next.js | 15.4.7 | | Runtime | Node.js | 22.x | | Datenbank | PostgreSQL | 17.6 | | Cache | Redis | 7.x | | Analytics | Umami | 3.x | | Process Manager | PM2 | Latest | | Package Manager | pnpm | Latest | | Reverse Proxy | Nginx | Latest | | SSL | Let's Encrypt | - | | Server Admin | Claude Code | 2.0.59 | --- ## Notfall-Kontakte Bei Problemen: 1. **Logs prüfen:** `pm2 logs` 2. **Services neustarten:** `pm2 restart all` 3. **Nginx prüfen:** `nginx -t && systemctl restart nginx` 4. **PostgreSQL prüfen:** `systemctl status postgresql` 5. **Redis prüfen:** `redis-cli ping` 6. **Claude Code nutzen:** `ssh claude@162.55.85.18` → `claude` --- ## Checkliste nach Deployment - [ ] `pm2 status` - Alle Prozesse online? - [ ] `redis-cli ping` - Redis antwortet? - [ ] https://cms.c2sgmbh.de/admin - Admin erreichbar? - [ ] https://analytics.c2sgmbh.de - Umami erreichbar? - [ ] `pm2 logs payload --lines 10` - Keine Fehler? --- *Stand: 05. Dezember 2025* *Server: sv-hz03-backend (162.55.85.18)* *Setup: Payload CMS + Umami + PostgreSQL + Redis + Claude Code*