feat(infra): Self-Hosted Android Build + F-Droid Repo-Server (#133) #134

Merged
admin-mrrm merged 7 commits from feat/fdroid-deploy into main 2026-04-27 18:59:53 +02:00
Owner

Summary

  • infra/android-builder/Dockerfile: Build-Image mit JDK 17, Android SDK 35, NDK 26.3, CMake 3.22, Node 24, pnpm
  • Drone-Pipeline publish-android-builder: Baut das Image bei Dockerfile-Änderungen neu
  • Drone-Pipeline publish-apk: expo prebuildgradlew assembleRelease (mit Keystore aus Secret) → SCP APK zum Server → fdroid update
  • infra/fdroid/: nginx-Config, config.yml, App-Metadaten YAML, update.sh
  • deploy/docker-compose.yml: nginx-Service für fdroid.mrrm.de (via Traefik)

Manuelle Einmal-Schritte vor dem ersten Deploy

Siehe infra/fdroid/SETUP.md:

  1. Verzeichnisse auf dem Server anlegen
  2. fdroid init ausführen (erzeugt Repo-Signing-Keystore)
  3. Android-Release-Keystore generieren + als Drone-Secrets hinterlegen
  4. DNS fdroid.mrrm.de setzen
  5. publish-android-builder Pipeline einmalig manuell triggern (großes Image ~4 GB)

Test plan

  • publish-android-builder baut und pusht Image erfolgreich
  • publish-apk läuft durch: APK landet in /opt/server-stack/fdroid/repo/
  • fdroid update generiert index-v2.json
  • https://fdroid.mrrm.de/repo ist erreichbar
  • F-Droid-App kann das Repo abonnieren und die App installieren

🤖 Generated with Claude Code

## Summary - **`infra/android-builder/Dockerfile`**: Build-Image mit JDK 17, Android SDK 35, NDK 26.3, CMake 3.22, Node 24, pnpm - **Drone-Pipeline `publish-android-builder`**: Baut das Image bei Dockerfile-Änderungen neu - **Drone-Pipeline `publish-apk`**: `expo prebuild` → `gradlew assembleRelease` (mit Keystore aus Secret) → SCP APK zum Server → `fdroid update` - **`infra/fdroid/`**: nginx-Config, `config.yml`, App-Metadaten YAML, `update.sh` - **`deploy/docker-compose.yml`**: nginx-Service für `fdroid.mrrm.de` (via Traefik) ## Manuelle Einmal-Schritte vor dem ersten Deploy Siehe `infra/fdroid/SETUP.md`: 1. Verzeichnisse auf dem Server anlegen 2. `fdroid init` ausführen (erzeugt Repo-Signing-Keystore) 3. Android-Release-Keystore generieren + als Drone-Secrets hinterlegen 4. DNS `fdroid.mrrm.de` setzen 5. `publish-android-builder` Pipeline einmalig manuell triggern (großes Image ~4 GB) ## Test plan - [ ] `publish-android-builder` baut und pusht Image erfolgreich - [ ] `publish-apk` läuft durch: APK landet in `/opt/server-stack/fdroid/repo/` - [ ] `fdroid update` generiert `index-v2.json` - [ ] `https://fdroid.mrrm.de/repo` ist erreichbar - [ ] F-Droid-App kann das Repo abonnieren und die App installieren 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(infra): Self-Hosted Android Build + F-Droid Repo-Server (#133)
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
b3c25dd397
- infra/android-builder/Dockerfile: JDK 17 + Android SDK 35 + NDK 26 +
  Node 24 + pnpm — wird als android-builder:latest in die Registry gepusht
- .drone.yml: zwei neue Pipelines
  - publish-android-builder: baut das Builder-Image bei Dockerfile-Änderungen
  - publish-apk: expo prebuild → gradlew assembleRelease → SCP → fdroid update
- infra/fdroid/: config.yml, nginx.conf, metadata YAML, update.sh
- deploy/docker-compose.yml: fdroid-repo nginx-Service unter fdroid.${DOMAIN}
- infra/fdroid/SETUP.md: einmaliges Server-Setup (keystore, DNS, F-Droid-Client)

Manuelle Schritte vor dem ersten Deploy: siehe infra/fdroid/SETUP.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(mobile): versionCode automatisch aus Git-Commit-Count ableiten
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
a2928cd66c
ANDROID_VERSION_CODE = git rev-list --count HEAD, gesetzt von Drone vor
expo prebuild. Lokal fällt der Wert auf 1 zurück — nur CI-gebundene APKs
werden via F-Droid verteilt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(infra): nginx root path an Volume-Mount anpassen
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
a7a7892961
docker-compose mounted das repo-Verzeichnis nach /usr/share/nginx/html/repo,
nginx.conf verwies aber auf /repo — Dateien wurden nicht gefunden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(infra): eigenes fdroidserver Docker-Image statt externem Registry-Image
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
564db9d442
Externes Image war nicht erreichbar. Eigenes schlankes Image auf Basis
python:3.12-slim + JDK + fdroidserver via pip. update.sh verwendet
jetzt fdroidserver:local.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(infra): korrektes fdroidserver Docker-Image verwenden
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
5c2418262c
registry.gitlab.com/fdroid/docker-executable-fdroidserver ist das
offizielle ausführbare Image. Eigenes Dockerfile nicht mehr nötig.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(infra): fdroid-Präfix aus update.sh entfernen
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
1f65217321
Image nutzt fdroid als Entrypoint — Subkommando ohne Präfix übergeben.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(infra): mrrmlabapp-db aus configs-Block in services verschieben
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
fd2d7d1c0d
mrrmlabapp-db war versehentlich unter configs: gelandet statt unter
services: — docker-compose validierung schlug fehl.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!134
No description provided.