- Package: de.krisenvorrat.* -> de.bollwerk.* - Klassen: KrisenvorratApp/Database/Theme -> Bollwerk* - ApplicationId: de.bollwerk.app - Server: BOLLWERK_* Env-Vars, bollwerk HOCON-Config - Docker: bollwerk-server/db/backup Container-Namen - Room DB: bollwerk.db, SharedPrefs: bollwerk_secure_prefs - Export-Dateien: bollwerk_export/inventar - UI-Strings, HTML, Admin-UI: alle auf Bollwerk - Docs, Skills, README angepasst - Alle Tests gruen, Build erfolgreich
140 lines
5.9 KiB
Markdown
140 lines
5.9 KiB
Markdown
---
|
||
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 (195.246.231.210)
|
||
───────────── ─────────────────────
|
||
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://195.246.231.210:8080/api/version" -UseBasicParsing | Select-Object -ExpandProperty Content
|
||
|
||
# Homepage prüfen (QR-Code-Seite)
|
||
Invoke-WebRequest -Uri "http://195.246.231.210:8080/" -UseBasicParsing | Select-Object StatusCode, StatusDescription
|
||
```
|
||
|
||
Erwartete Ausgabe von `/api/version`:
|
||
```json
|
||
{"versionCode":<neuer_code>,"versionName":"<neuer_name>","apkUrl":"http://195.246.231.210:8080/static/app-latest.apk"}
|
||
```
|
||
|
||
---
|
||
|
||
## Automatisiertes Skript
|
||
|
||
Das Skript `publish-apk.ps1` in diesem Skill-Ordner automatisiert Schritte 3–6:
|
||
|
||
```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.
|