-
Notifications
You must be signed in to change notification settings - Fork 0
GCP Failover
← Home · Zurück: Docker-Betrieb
Notfall-Konzept des Repos: eine bei Google Cloud standardmäßig gestoppte
Ersatz-Instanz, die im Ernstfall mit einem Befehl startet, sich selbst aus
dem neuesten Backup versorgt und den Server im Docker-Pfad mit reduzierter
Kapazität hochzieht. Diese Seite erweitert docs/06-failover-gcp.md und
gcp/README.md um die 1:1-Details der drei GCP-Skripte.
-
Maschine: e2-standard-4 — 4 vCPU / 16 GB RAM, Debian 12,
50 GB Boot-Disk (alle drei Werte 1:1 aus
gcp/create-instance.sh= Repo-Default; Maschinentyp-Klassifizierung: Community-Quelle GCP-Katalog). -
Zustand normal: gestoppt. Eine gestoppte Compute-Engine-Instanz
verursacht keine Compute-Kosten, sondern nur Persistent-Disk-Kosten — laut
gcp/README.md„wenige USD/Monat" für die 50-GB-Disk (Angabe der Repo-Doku; Community-Quelle: GCP-Preismodell, Näherung). -
Zustand Notfall: laufend. ~0,13 USD/h laut
gcp/README.mdfür e2-standard-4 (Community-Quelle: GCP-Preisliste — als Näherung gelabelt, regional abhängig, Stand der Repo-Doku). -
Reduziertes Profil: Das Startup-Skript exportiert hartkodiert
SLOTS=3undXMX=8G(1:1 ausgcp/startup-script.sh; Repo-Default — Notfallserver für maximal 3 Spieler, passend zuFAILOVER_SLOTS=3undFAILOVER_XMX=8Gin.env.example). -
Datenfluss: Hauptserver → nächtliches Backup (04:00, systemd-Timer) →
sync-backups.shspiegelt in den GCS-Bucket → Failover zieht beim Start das neuestedaily-*.tar.gzaus dem Bucket.
Anmerkung zum reduzierten Profil (Repo-Stand, 1:1 aus
docker/docker-compose.yml): Die Compose-Datei konsumiert SLOTS NICHT —
sie setzt nur SERVER_NAME, MAX_PLAYERS (Fallback 8) und XMX als
Container-env. Im Failover-Container greift damit MAX_PLAYERS (Fallback 8
bzw. der Wert aus der docker/.env), nicht 3 Slots: „maximal 3 Spieler"
ist die Repo-Intention (FAILOVER_SLOTS=3 in .env.example), vom
Compose-File aber nicht erzwungen.
Die .env-Gruppe dafür (Repo-Default aus .env.example): GCP_PROJECT,
GCP_ZONE=europe-west3-a, GCP_INSTANCE=pz-failover,
GCP_BUCKET=pz-backups-CHANGE_ME, FAILOVER_SLOTS=3, FAILOVER_XMX=8G —
siehe ENV-Variablen.
- Installiertes
gcloudundgsutil(beide werden von den Skripten perneed_cmderfordert, 1:1). - Authentifiziertes Projekt:
gcloud auth loginundgcloud config set project <PROJECT_ID>(gcloud-Standardvoraussetzung; Heuristik: für reinestorage-rw-Scopes reicht ein User-Account mit Compute/Storage-Rechten). - Gefüllte GCP-*-Werte in
.env(Skripte sterben ohne.envperneed_env). -
Wichtig vor dem Anlegen:
gcp/startup-script.shenthält zwei Platzhalter, die laut Kommentar im Skript „vor create-instance.sh ersetzen oder via metadata" gesetzt werden müssen (1:1):BUCKET="__GCP_BUCKET__"undREPO_URL="__REPO_URL__"(z. B.https://<token>@github.com/<user>/ProjectZomboiD.git). Das create-Skript übergibt die Datei ungefiltert per--metadata-from-file=startup-script=...— ohne vorherige Ersetzung läuft der Start ins Leere (Repo-Stand; ehrlich gesagt: die Ersetzung ist ein manueller Schritt, den kein Skript abnimmt).
# 1. Bucket anlegen, falls nicht vorhanden (Region europe-west3, 1:1):
gsutil ls "gs://${GCP_BUCKET}" >/dev/null 2>&1 || gsutil mb -l europe-west3 "gs://${GCP_BUCKET}"
# 2. Instanz anlegen:
gcloud compute instances create "$GCP_INSTANCE" \
--project="$GCP_PROJECT" --zone="$GCP_ZONE" \
--machine-type=e2-standard-4 \
--image-family=debian-12 --image-project=debian-cloud \
--boot-disk-size=50GB \
--scopes=storage-rw \
--metadata-from-file=startup-script="${REPO_ROOT}/gcp/startup-script.sh" \
--tags=pz-failover
# 3. Firewall: Spiel-Ports nur fuer diese Instanz (target-tags):
gcloud compute firewall-rules create pz-failover-udp --project="$GCP_PROJECT" \
--allow=udp:16261,udp:16262 --target-tags=pz-failover 2>/dev/null || true
# 4. Und sofort wieder stoppen (Kosten!):
gcloud compute instances stop "$GCP_INSTANCE" --zone="$GCP_ZONE" --quietAnmerkungen: storage-rw erlaubt der Instanz den Bucket-Zugriff ohne weitere
Auth-Kopplung. Die Firewall-Regel öffnet udp:16261 und udp:16262 — RCON
(27015/tcp) bleibt bewusst zu; Remote-Admin im Notfall würde einen
SSH-Tunnel oder eine zusätzliche Regel brauchen (Heuristik). Die Region
europe-west3 ist im Bucket-Festland hart codiert (1:1), die Zone der Instanz
kommt aus GCP_ZONE (Default europe-west3-a).
Danach die initiale Spiegelung:
bash gcp/sync-backups.shgcp/sync-backups.sh (1:1):
gsutil -m rsync -r "$BACKUP_DIR" "gs://${GCP_BUCKET}"-
-m= parallele Übertragung;-r= rekursiv über alle tar.gz. - Alternativ als make-Target:
make failover-sync. - Einrichtung laut
gcp/README.md: täglich per Cron auf dem Hauptserver, „z. B. 04:30, nach dem naechtlichen Backup" — die Uhrzeit ist als Beispiel zu lesen, der einzige harte Anker ist: NACH dem 04:00-Backup-Timer (Repo-Doku; Cron-Einrichtung selbst ist Handarbeit, siehe Wartung-und-Automatik).
Wenn der Hauptserver ausgefallen ist:
gcloud compute instances start pz-failover --zone=europe-west3-aDas GCE-Startup-Skript (gcp/startup-script.sh) läuft bei JEDEM Start und
macht dann selbst (1:1):
apt-get install docker.io docker-compose-v2 git- Repo nach
/opt/pz/ProjectZomboiDklonen (git cloneperREPO_URL, falls nicht vorhanden) undgit pull --ff-only. - Neuestes Backup ermitteln:
gsutil ls gs://${BUCKET}/daily-*.tar.gz | sort | tail -n1→ nach/tmp/restore.tar.gzladen → in/data/Zomboidentpacken. -
export SLOTS=3 XMX=8Gunddocker compose -f docker/docker-compose.yml up -d— derselbe Container wie in Docker-Betrieb, nur mit Notfall-Profil.
Vorbereitungs-Hinweis (Repo-Lücke, ehrlich): Der frisch geklonte Ordner
enthält kein docker/.env — die Compose-Datei lädt mit env_file: .env
aber genau diese Datei. Hat vor der Aktivierung niemand
docker/.env.docker.example zu docker/.env kopiert und Werte gesetzt,
scheitert docker compose up im Startup-Skript. Wer den Failover
vorbereitet, sollte das Kopieren/Anpassen fest einplanen — das
Startup-Skript erledigt es nicht.
Externe IP abfragen und den Spielern durchgeben (1:1 aus docs/06):
gcloud compute instances describe pz-failover --zone=europe-west3-a \
--format='get(networkInterfaces[0].accessConfigs[0].natIP)'Laut docs/06 ist der Server „~2-3 Minuten spaeter" erreichbar (Schätzung
der Repo-Doku — Heuristik; das erste Boot inklusive Paketinstallation und
Backup-Download kann je nach Backup-Größe länger dauern). Spieler verbinden
sich auf die GCP-IP wie gewohnt (Ports: Ports-und-Netzwerk).
Grenzen des Notfallprofils (Repo-Stand): 3 Slots, 8G Heap — es ist ein Übergangsserver, kein vollwertiger Ersatz (siehe Performance-Guide zur Einordnung von 8 GB Heap). Watchdog/Discord-Automatik des systemd-Pfads läuft hier nicht (Docker-Pfad, siehe Docker-Betrieb).
Ablauf aus docs/06 (1:1):
-
Auf dem Failover: Backup erstellen, in den Bucket laden. Wie genau,
ist im Repo nicht vorgefertigt — Heuristik: im laufenden Container ein
tar.gz aus
/data/Zomboid(Saves + Server) erzeugen (z. B.docker exec) und pergsutil cpunter einem neuen Namen (etwafailover-<ts>.tar.gz) in den Bucket legen, damit der daily-Bestand unangetastet bleibt. -
Lokal:
make restoremit dem Failover-Backup (interaktiver Restore, siehe Backup-und-Restore). - Instanz stoppen:
gcloud compute instances stop pz-failover --zone=europe-west3-aWas dabei unklar bleibt (ehrlich, Heuristik-Labels): das Startup-Skript
zieht beim nächsten Start wieder das alphabetisch/zeitlich letzte
daily-*.tar.gz — ein im Bucket abgelegtes failover-*.tar.gz würde von
diesem Muster NICHT automatisch eingesammelt. Vor einer erneuten
Failover-Aktivierung also prüfen, welcher Stand im Bucket der aktuellste
nutzbare ist.
| Zustand der Instanz | Kostenbild | Quelle/Label |
|---|---|---|
| Gestoppt (Normalzustand) | Nur Persistent-Disk-Kosten, „wenige USD/Monat" | Repo-Doku gcp/README.md; Community-Quelle GCP-Preismodell (Näherung) |
| Laufend (Notfall) | ~0,13 USD/h + Disk | Repo-Doku gcp/README.md; Community-Quelle GCP-Preisliste (Näherung, regional abhängig) |
| Bucket | Speicherkosten für Backup-Archiv, wächst mit Retention | Community-Quelle GCP-Preismodell (Näherung) |
Die wichtigste Regel: Nach dem Notfall die Instanz stoppen. Ein
vergessener laufender Failover läuft mit ~0,13 USD/h weiter — das sind rund
94 USD/Monat (Rechnung: 0,13 × 24 × 30 = 93,6, aus dem Stundensatz der
Repo-Doku abgeleitet; Näherung). Die Rückkehr-Schritte oben enden deshalb
explizit mit instances stop.
Empfehlung (Heuristik, aus docs/06 übernommen): einen GCP-Budget-Alarm
einrichten — docs/06 nennt als Beispiel 10 EUR/Monat. Damit nagelt eine
Mail an, falls die Instanz versehentlich laufen bleibt.
- Backup-und-Restore — Ursprung der daily-Backups und manueller Restore
- Docker-Betrieb — das Compose-File, das der Failover fährt
- Wartung-und-Automatik — Timer/Cron-Geflecht auf dem Hauptserver
- Troubleshooting — wenn der Failover selbst nicht startet
Vertieft in Repo: docs/06-failover-gcp.md, gcp/README.md,
gcp/create-instance.sh, gcp/startup-script.sh, gcp/sync-backups.sh.
Weiter: Backup-und-Restore · Troubleshooting
Labels: Community-Quelle = extern belegt (Herkunft in Klammern, z. B. pzwiki, Steam-Diskussionen, GCP-Preisliste) · Repo-Default = steht genau so im Repo (Template, Skript oder .env.example) · Heuristik = begründete Empfehlung dieses Projekts, nicht extern verifiziert.
The Indie Stone (TIS) publiziert keine offiziellen Storage-/IOPS-/Performance-Specs — Zahlen in diesem Wiki nie als TIS-Anforderung lesen.
Inhalte zielen auf den B42-Stable-Branch: seit B42.20 der Default-Zweig in Steam, kein -beta-Opt-in nötig (Community-Quelle).
Details zu Labels, Quellen und Redaktionsregeln: Konventionen-und-Quellen.
Einstieg
Referenz
- Makefile-Referenz
- Cheatsheet-Tagesbetrieb
- ENV-Variablen
- Server-Konfiguration
- Admin-Befehle
- Mods-Referenz
- Spawn-System
- Skripte-Referenz
- systemd-Referenz
- Ports-und-Netzwerk
- SteamCMD-Referenz
Betrieb
- Wartung-und-Automatik
- Backup-und-Restore
- Updates-und-Rollback
- Monitoring-und-Alerts
- Sicherheit-und-Hardening
- Docker-Betrieb
- GCP-Failover
Tiefenwissen
- Modding-Workflow
- Performance-Guide
- Storage-und-Map-Streaming
- Hardware-Empfehlungen
- Troubleshooting
- Runbook-Raven-Creek
Meta