Deployment: Krisenvorrat-Server auf Hetzner VPS #50

Closed
opened 2026-05-16 11:08:23 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-16 11:08:23 +00:00 (Migrated from github.com)

Ziel

Den Krisenvorrat Sync-Server (Ktor/Kotlin) auf einem Hetzner VPS deployen, sodass die Android-App über das Internet synchronisieren kann.

Voraussetzungen

  • Hetzner-Account vorhanden
  • Dockerfile und Server-Code sind produktionsreif im Repo
  • API-Key wird beim Deployment festgelegt

Schritt-für-Schritt-Anleitung

Phase 1: Hetzner VPS bestellen

  1. Einloggen auf console.hetzner.cloud
  2. Neues Projekt anlegen (z.B. "Krisenvorrat") oder bestehendes nutzen
  3. Server erstellen:
    • Location: Falkenstein oder Nürnberg (günstigste DE-Standorte)
    • Image: Ubuntu 24.04
    • Typ: CX22 (2 vCPU, 4 GB RAM, ~3,50€/Monat) – reicht locker
    • SSH-Key hinterlegen (oder Passwort wählen)
    • Hostname: z.B. krisenvorrat
  4. IP-Adresse notieren (wird nach Erstellung angezeigt)

Phase 2: Server einrichten (SSH)

# 1. Verbinden
ssh root@<SERVER-IP>

# 2. System updaten
apt update && apt upgrade -y

# 3. Docker installieren
curl -fsSL https://get.docker.com | sh

# 4. Firewall einrichten (nur SSH + App-Port)
ufw allow 22/tcp
ufw allow 8080/tcp
ufw enable

# 5. Nicht-Root-User anlegen (optional aber empfohlen)
adduser krisenvorrat
usermod -aG docker krisenvorrat

Phase 3: App deployen

# 1. Repository klonen
git clone https://github.com/jreinemann-euris/krisenvorrat.git
cd krisenvorrat

# 2. Docker-Image bauen
docker build -t krisenvorrat-server .

# 3. API-Key festlegen und Container starten
docker run -d \
  --name krisenvorrat \
  --restart unless-stopped \
  -p 8080:8080 \
  -v krisenvorrat-data:/app/data \
  -e KRISENVORRAT_API_KEY="<DEIN-SICHERER-KEY-MIND-32-ZEICHEN>" \
  krisenvorrat-server

# 4. Prüfen ob es läuft
curl http://localhost:8080/api/health
# Erwartete Antwort: "OK"

Phase 4: Extern erreichbar machen

# Von deinem lokalen Rechner testen:
curl http://<SERVER-IP>:8080/api/health
# Erwartete Antwort: "OK"

# Authentifizierten Endpunkt testen:
curl -H "X-API-Key: <DEIN-KEY>" http://<SERVER-IP>:8080/api/inventory
# Erwartete Antwort: leeres Inventar-JSON

Phase 5: Android-App konfigurieren

  1. App öffnen → Einstellungen → Server-Synchronisation
  2. Server-URL eintragen: http://<SERVER-IP>:8080
  3. API-Key eintragen
  4. Sync testen

Phase 6 (Optional): HTTPS & Domain

Falls gewünscht, kann später ergänzt werden:

  • Domain auf die Server-IP zeigen lassen (DNS A-Record)
  • Caddy oder Traefik als Reverse Proxy mit automatischem Let's Encrypt SSL
  • Port 443 statt 8080
# Beispiel mit Caddy (automatisches HTTPS):
apt install caddy
# Caddyfile: krisenvorrat.example.com -> localhost:8080

Wartung & Updates

# Neues Deployment nach Code-Änderungen:
cd krisenvorrat
git pull
docker build -t krisenvorrat-server .
docker stop krisenvorrat && docker rm krisenvorrat
docker run -d \
  --name krisenvorrat \
  --restart unless-stopped \
  -p 8080:8080 \
  -v krisenvorrat-data:/app/data \
  -e KRISENVORRAT_API_KEY="<DEIN-KEY>" \
  krisenvorrat-server

# Logs anschauen:
docker logs -f krisenvorrat

# Datenbank-Backup (H2-Datei):
docker cp krisenvorrat:/app/data ./backup-$(date +%Y%m%d)

Akzeptanzkriterien

  • Hetzner VPS läuft mit Docker
  • Krisenvorrat-Server ist als Container deployed
  • Health-Check unter http://:8080/api/health antwortet "OK"
  • Authentifizierter Zugriff auf /api/inventory funktioniert
  • Datenbank-Volume ist persistent (überlebt Container-Neustarts)
  • Android-App kann erfolgreich synchronisieren
  • Container startet automatisch nach Server-Reboot (--restart unless-stopped)
## Ziel Den Krisenvorrat Sync-Server (Ktor/Kotlin) auf einem Hetzner VPS deployen, sodass die Android-App über das Internet synchronisieren kann. ## Voraussetzungen - Hetzner-Account vorhanden - Dockerfile und Server-Code sind produktionsreif im Repo - API-Key wird beim Deployment festgelegt --- ## Schritt-für-Schritt-Anleitung ### Phase 1: Hetzner VPS bestellen 1. **Einloggen** auf [console.hetzner.cloud](https://console.hetzner.cloud) 2. **Neues Projekt** anlegen (z.B. "Krisenvorrat") oder bestehendes nutzen 3. **Server erstellen:** - Location: Falkenstein oder Nürnberg (günstigste DE-Standorte) - Image: **Ubuntu 24.04** - Typ: **CX22** (2 vCPU, 4 GB RAM, ~3,50€/Monat) – reicht locker - SSH-Key hinterlegen (oder Passwort wählen) - Hostname: z.B. `krisenvorrat` 4. **IP-Adresse** notieren (wird nach Erstellung angezeigt) ### Phase 2: Server einrichten (SSH) ```bash # 1. Verbinden ssh root@<SERVER-IP> # 2. System updaten apt update && apt upgrade -y # 3. Docker installieren curl -fsSL https://get.docker.com | sh # 4. Firewall einrichten (nur SSH + App-Port) ufw allow 22/tcp ufw allow 8080/tcp ufw enable # 5. Nicht-Root-User anlegen (optional aber empfohlen) adduser krisenvorrat usermod -aG docker krisenvorrat ``` ### Phase 3: App deployen ```bash # 1. Repository klonen git clone https://github.com/jreinemann-euris/krisenvorrat.git cd krisenvorrat # 2. Docker-Image bauen docker build -t krisenvorrat-server . # 3. API-Key festlegen und Container starten docker run -d \ --name krisenvorrat \ --restart unless-stopped \ -p 8080:8080 \ -v krisenvorrat-data:/app/data \ -e KRISENVORRAT_API_KEY="<DEIN-SICHERER-KEY-MIND-32-ZEICHEN>" \ krisenvorrat-server # 4. Prüfen ob es läuft curl http://localhost:8080/api/health # Erwartete Antwort: "OK" ``` ### Phase 4: Extern erreichbar machen ```bash # Von deinem lokalen Rechner testen: curl http://<SERVER-IP>:8080/api/health # Erwartete Antwort: "OK" # Authentifizierten Endpunkt testen: curl -H "X-API-Key: <DEIN-KEY>" http://<SERVER-IP>:8080/api/inventory # Erwartete Antwort: leeres Inventar-JSON ``` ### Phase 5: Android-App konfigurieren 1. App öffnen → Einstellungen → Server-Synchronisation 2. Server-URL eintragen: `http://<SERVER-IP>:8080` 3. API-Key eintragen 4. Sync testen ### Phase 6 (Optional): HTTPS & Domain Falls gewünscht, kann später ergänzt werden: - **Domain** auf die Server-IP zeigen lassen (DNS A-Record) - **Caddy** oder **Traefik** als Reverse Proxy mit automatischem Let's Encrypt SSL - Port 443 statt 8080 ```bash # Beispiel mit Caddy (automatisches HTTPS): apt install caddy # Caddyfile: krisenvorrat.example.com -> localhost:8080 ``` --- ## Wartung & Updates ```bash # Neues Deployment nach Code-Änderungen: cd krisenvorrat git pull docker build -t krisenvorrat-server . docker stop krisenvorrat && docker rm krisenvorrat docker run -d \ --name krisenvorrat \ --restart unless-stopped \ -p 8080:8080 \ -v krisenvorrat-data:/app/data \ -e KRISENVORRAT_API_KEY="<DEIN-KEY>" \ krisenvorrat-server # Logs anschauen: docker logs -f krisenvorrat # Datenbank-Backup (H2-Datei): docker cp krisenvorrat:/app/data ./backup-$(date +%Y%m%d) ``` ## Akzeptanzkriterien - [ ] Hetzner VPS läuft mit Docker - [ ] Krisenvorrat-Server ist als Container deployed - [ ] Health-Check unter http://<IP>:8080/api/health antwortet "OK" - [ ] Authentifizierter Zugriff auf /api/inventory funktioniert - [ ] Datenbank-Volume ist persistent (überlebt Container-Neustarts) - [ ] Android-App kann erfolgreich synchronisieren - [ ] Container startet automatisch nach Server-Reboot (--restart unless-stopped)
Sign in to join this conversation.
No description provided.