VPS Deploy & Backup Kit

Eine kleine App auf einem Server ausliefern, ohne eine einzige fehlgeschlagene Anfrage, und Backups, die Sie nachweislich schon zurückgespielt haben.

Jetzt kaufen: $19 Einmalkauf · v0.3.0 · Sofort-Download über Polar

Cover von VPS Deploy & Backup Kit
Ausgabe eines echten Testlaufs, kein Mock-up.

Das bekommen Sie

Drei kleine Bash-Skripte, ein gemeinsamer Alert-Helfer und die Konfigurationsdateien, die alles verbinden. Zehn Minuten Lesezeit genügen. Installieren müssen Sie nichts, nur die Tools, die die Skripte aufrufen.

DateiAufgabe
deploy.shKlont ein Release, baut es, prüft per Health Check und rollt bei Fehlern zurück. Zwei Modi: restart (Symlink plus pm2-Restart) und bluegreen (im Test unten ohne eine einzige fehlgeschlagene Anfrage). deploy.sh rollback schaltet im Blue/Green-Modus zurück.
backup.shErstellt konsistente Dumps von SQLite- und Postgres-Datenbanken und sichert sie mit restic (standardmäßig 7 tägliche, 4 wöchentliche und 6 monatliche Snapshots). Danach wird das Repository geprüft. Ein defekter Dump stoppt den Lauf, bevor ein Snapshot entsteht.
restore-test.shStellt den letzten Snapshot in einem temporären Verzeichnis wieder her, prüft die Datenbank-Dumps, führt Ihren eigenen optionalen Check aus und liest eine Stichprobe der Daten.
notify.shSchickt eine Telegram-Nachricht oder einen Webhook-POST, sobald ein Skript fehlschlägt. Bei Erfolg bleibt es still.
Konfigurationkit.env.example, Caddyfile.example, ecosystem.config.js, cron.example

Deployments ohne Downtime, gemessen

Im Modus bluegreen startet das neue Release auf dem freien Port und wird direkt per Health Check geprüft. Dann schaltet Caddy per Graceful Reload darauf um, und erst danach wird das alte Release beendet. Ein Release, das nicht gesund ist, bekommt nie Traffic.

Testaufbau: Debian-12-Container, Caddy 2.6.2 aus apt, pm2 und eine Node-App, die 1.5 Sekunden zum Starten braucht. Während des gesamten Deployments liefen 20 Anfragen pro Sekunde durch Caddy, jede fünfte an einen Endpoint mit 300 ms Antwortzeit. Eine Anfrage zählt als fehlgeschlagen bei einem Verbindungsfehler, einem Timeout über 3 Sekunden oder jedem Status außer 200.

SzenarioAnfragenFehlgeschlagenDeploy-Dauer
Modus restart, gutes Release11632 (alle HTTP 502)2.4 s
Modus restart, kaputtes Release (zurückgerollt)38067 (alle HTTP 502)16.8 s
bluegreen, gutes Release21107.6 s
bluegreen, kaputtes Release (Health Check liefert 500)373016.6 s
bluegreen, Release stürzt beim Start ab371016.5 s
bluegreen, rollback20807.5 s

Im Blue/Green-Lauf mit gutem Release sah die Last beide Versionen (115 Antworten von v1, danach 96 von v2). Der Traffic ist also tatsächlich umgezogen. Über mehrere Läufe hinweg verlor der Modus restart jeweils 31 bis 35 Anfragen, Blue/Green keine.

Backups, die Sie wirklich zurückgespielt haben

  • Datenbanken werden korrekt gedumpt. SQLite nutzt die Online-Backup-Funktion samt Integritätsprüfung, Postgres pg_dump -Fc und pg_restore -l. Wer eine laufende Datenbankdatei einfach kopiert, endet oft mit einem defekten Backup.
  • Ein defekter Dump stoppt den Lauf. Im Test brach eine beschädigte SQLite-Datei das Backup ab, ohne dass ein Snapshot entstand.
  • Alte Dumps schleichen sich nicht ein. Eine Datenbank, die Sie aus der Konfiguration entfernt haben, landet nicht weiter in neuen Snapshots.
  • restore-test.sh liefert den Beweis. Das Skript stellt wieder her, prüft die Dumps und führt restic check auf einer Stichprobe aus. Lassen Sie es wöchentlich per Cron laufen.
  • Entferntes Repository. sftp:-Repositories funktionieren mit beiden Skripten (getestet gegen einen lokalen OpenSSH-Server).

Alarm bei Fehlern

Setzen Sie TELEGRAM_BOT_TOKEN und TELEGRAM_CHAT_ID oder NOTIFY_WEBHOOK_URL. Ein fehlgeschlagenes Deployment, Backup oder ein fehlgeschlagener Restore-Test löst pro Kanal genau eine Nachricht aus, ein erfolgreicher Lauf keine. Das Token geht per stdin an curl und wird nie ausgegeben. Ist die Benachrichtigungs-API nicht erreichbar, bleibt der Exit-Code des Skripts unverändert.

Einrichtung in fünf Schritten

  1. Installieren Sie restic, git, curl und pm2 (dazu caddy für Blue/Green sowie sqlite3 oder postgresql-client, je nach Datenbank).
  2. Kopieren Sie den Ordner auf den Server, führen Sie cp kit.env.example kit.env aus und passen Sie die Datei an.
  3. Legen Sie das Repository-Passwort in einer Datei mit Modus 600 ab.
  4. Starten Sie nacheinander ./backup.sh, ./restore-test.sh und ./deploy.sh.
  5. Tragen Sie die Cron-Zeilen aus cron.example ein.

So wurde getestet

59 Checks laufen in einem sauberen Debian-12-Container (Node 22, restic, PostgreSQL 15, Caddy 2.6.2 und OpenSSH aus apt, pm2). Sie decken ab: Backup von Ordnern, SQLite und Postgres, Restore mit Zeilenvergleich, falsches Repository, beschädigte Datenbank, fehlenden Dump, Deployment und Rollback in beiden Modi unter Last, Alarme gegen eine lokale Fake-API sowie restic über SFTP.

Für wen es ist

Für Solo-Entwickler und kleine Teams, die eine oder zwei Node- oder Go-Apps auf einem einzelnen Linux-VPS betreiben und Deployments und Backups wollen, auf die sie sich verlassen können, ohne auf Kubernetes umzusteigen.

Voraussetzungen

Linux, bash, pm2, restic und für Blue/Green Caddy. Ihre App liest ihren Port aus PORT. Blue/Green lässt zwei Releases einige Sekunden lang parallel laufen, daher müssen Datenbank-Migrationen abwärtskompatibel sein.

Häufige Fragen

Brauche ich das Kit, um Deployments ohne Downtime zu bekommen?

Nein. Die Technik steht mit den wichtigsten Befehlen in diesem Beitrag. Das Kit packt sie zusammen mit Health Checks, Rollback, Zustandsverwaltung, Alarmen und der Testsuite in ein fertiges Paket.

Von welchem Stack geht es aus?

Linux, bash, pm2, Caddy für Blue/Green, restic für Backups und eine App, die ihren Port aus der Umgebungsvariable PORT liest.

Funktioniert es mit Postgres und SQLite?

Ja, beide werden gedumpt und geprüft.

Kann ich es für mehrere Apps nutzen?

Pro App eine kit.env. Mit KIT_CONF wählen Sie die Datei aus.

Wie ist die Lizenz?

Sie dürfen es auf Ihren eigenen Servern einsetzen. Die Dateien weiterzuverkaufen ist nicht erlaubt.

Änderungsprotokoll

  • 0.3.0: Blue/Green-Deployments mit Rollback, Alarme bei Fehlern (Telegram und Webhook), SFTP-Repositories getestet, alle Meldungen auf Englisch.
  • 0.2.0: SQLite- und Postgres-Dumps in backup.sh, Dump-Prüfung in restore-test.sh.
  • 0.1.0: erstes Release.

Weiterlesen

Herunterladen

Jetzt kaufen: $19

Zahlung, Steuern und Rechnung übernimmt Polar als Merchant of Record. Den Download-Link erhalten Sie nach dem Checkout.