bollwerk/.github/skills/publish/SKILL.md
Jens Reinemann e0130910af chore: migrate server URLs from IP to bollwerk.online domain
Replace all HTTP references to 195.246.231.210 with bollwerk.online
across skills, prompts, scripts, and app default settings:

- Dockerfile: rename KRISENVORRAT_JWT_SECRET to BOLLWERK_JWT_SECRET
- SettingsKey.kt: default server URL now http://bollwerk.online:8080
- publish SKILL/prompt/script: HTTP URLs updated to bollwerk.online
- vps-deploy SKILL: Admin-UI and health-check URLs updated
- run-integration-tests.ps1: default BaseUrl updated

SSH commands (ssh/scp) intentionally kept on IP, as DNS is not
used for SSH access.
2026-05-17 18:22:17 +02:00

140 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: publish
description: "APK publizieren: Version bumpen, APK bauen, auf VPS hochladen, Server-Version aktualisieren, QR-Code/Download-Seite verifizieren. Verwende diesen Skill immer wenn eine neue App-Version veröffentlicht werden soll auch wenn der User nur 'publish', 'release', 'veröffentlichen', 'neue Version', 'APK hochladen', 'APK deployen', 'Update bereitstellen' oder 'QR-Code aktualisieren' sagt. Trigger-Phrasen: 'publish', 'release', 'veröffentlichen', 'APK hochladen', 'neue Version', 'Update ausrollen', 'QR-Code'."
---
# Skill: Publish (APK auf VPS veröffentlichen)
Dieser Skill deckt den vollständigen Workflow ab, um eine neue App-Version auf dem VPS bereitzustellen, sodass:
1. Die **Homepage** (QR-Code + Download-Link) die aktuelle APK anbietet
2. Die **Update-Prüfung in der App** die neue Version erkennt und zum Download anbietet
---
## Architektur-Überblick
```
App (lokal) VPS (bollwerk.online)
───────────── ─────────────────────
app/build.gradle.kts /opt/bollwerk/
versionCode / versionName ├── docker-compose.yml (BOLLWERK_APP_VERSION_CODE/NAME)
├── data/app-latest.apk (statisch ausgeliefert)
./gradlew assembleDebug └── Server-Container (Ktor)
→ app-debug.apk ├── GET / → Homepage mit QR-Code
├── GET /api/version → JSON {versionCode, versionName, apkUrl}
scp → /opt/bollwerk/data/ └── GET /static/* → Dateien aus data/
```
### Wie die Update-Prüfung funktioniert
1. App ruft `GET {serverUrl}/api/version` auf → erhält `VersionInfo(versionCode, versionName, apkUrl)`
2. `CheckForUpdateUseCase` vergleicht `versionInfo.versionCode > BuildConfig.VERSION_CODE`
3. Falls neuer → zeigt Download-Button, lädt APK herunter, installiert via `ApkInstaller`
### Wie die Homepage funktioniert
- `GET /` liefert HTML mit QR-Code (via qrcodejs) + Download-Link auf `/static/app-latest.apk`
- Version wird aus `BOLLWERK_APP_VERSION_CODE` / `BOLLWERK_APP_VERSION_NAME` Env-Vars gelesen
---
## Publish-Workflow (Schritte)
### Schritt 1 Version bumpen
In `app/build.gradle.kts`:
- `versionCode` um 1 erhöhen
- `versionName` passend anpassen (z.B. "1.2" → "1.3")
### Schritt 2 Build & Test
```powershell
.\gradlew.bat assembleDebug test
```
Die APK liegt danach unter: `app/build/outputs/apk/debug/app-debug.apk`
### Schritt 3 APK auf VPS hochladen
```powershell
scp app/build/outputs/apk/debug/app-debug.apk root@195.246.231.210:/opt/bollwerk/data/app-latest.apk
```
**Voraussetzung:** SSH-Agent muss laufen und Key geladen sein (siehe vps-deploy Skill).
### Schritt 4 Server-Version aktualisieren
Die Version wird über Environment-Variablen in der `docker-compose.yml` auf dem VPS gesetzt:
```powershell
# Neue Werte per sed in docker-compose.yml eintragen
ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i 's/BOLLWERK_APP_VERSION_CODE=.*/BOLLWERK_APP_VERSION_CODE=<neuer_code>/' docker-compose.yml && sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=<neuer_name>/' docker-compose.yml"
```
Falls die Env-Vars noch nicht in der docker-compose.yml stehen, müssen sie einmalig hinzugefügt werden:
```powershell
ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i '/BOLLWERK_JWT_SECRET/a\ - BOLLWERK_APP_VERSION_CODE=<code>\n - BOLLWERK_APP_VERSION_NAME=<name>' docker-compose.yml"
```
### Schritt 5 Server neustarten
```powershell
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose up -d"
```
### Schritt 6 Verifizieren
```powershell
# Version-API prüfen
Invoke-WebRequest -Uri "http://bollwerk.online:8080/api/version" -UseBasicParsing | Select-Object -ExpandProperty Content
# Homepage prüfen (QR-Code-Seite)
Invoke-WebRequest -Uri "http://bollwerk.online:8080/" -UseBasicParsing | Select-Object StatusCode, StatusDescription
```
Erwartete Ausgabe von `/api/version`:
```json
{"versionCode":<neuer_code>,"versionName":"<neuer_name>","apkUrl":"http://bollwerk.online:8080/static/app-latest.apk"}
```
---
## Automatisiertes Skript
Das Skript `publish-apk.ps1` in diesem Skill-Ordner automatisiert Schritte 36:
```powershell
& ".github/skills/publish/publish-apk.ps1" -VersionCode 4 -VersionName "1.3"
```
**Parameter:**
| Parameter | Pflicht | Beschreibung |
| -------------- | ------- | --------------------------------------------- |
| `-VersionCode` | ja | Neuer versionCode (Integer) |
| `-VersionName` | ja | Neuer versionName (String, z.B. "1.3") |
| `-ApkPath` | nein | Pfad zur APK (Default: debug-APK) |
| `-SkipVerify` | nein | Verifizierung überspringen |
---
## Wichtige Dateien
| Datei | Beschreibung |
|-------|-------------|
| `app/build.gradle.kts` (L18-19) | `versionCode` / `versionName` |
| `server/src/main/resources/application.conf` (L18-21) | Server-Version-Defaults + Env-Var-Override |
| `server/src/main/kotlin/.../routes/VersionRoutes.kt` | Homepage + `/api/version` Endpoint |
| `server/src/main/kotlin/.../plugins/Routing.kt` | `staticFiles("/static", File("data"))` |
| `app/src/main/java/.../usecase/CheckForUpdateUseCase.kt` | Update-Prüfung in der App |
| `app/src/main/java/.../ui/update/UpdateViewModel.kt` | Update-UI + Download-Logik |
---
## Bekannte Lücken / TODOs
- **Kein Release-Build:** Aktuell wird `assembleDebug` verwendet. Für Produktion → Signing-Config + `assembleRelease` einrichten.
- **Kein HTTPS:** Server läuft auf HTTP. QR-Code zeigt `http://`-URL. Für Play Store / Sicherheit → Caddy als Reverse Proxy.
- **Manuelle Version-Env-Vars:** Beim ersten Publish müssen die Env-Vars in die VPS docker-compose eingefügt werden. Das Skript erledigt das automatisch.