Deployment overview
Three things get deployed:
Signaling serverOne Rust binary behind a TLS terminator. No database, two env vars.Android CIA self-hosted GitHub Actions runner that builds debug + release APKs and cuts a GitHub Release on every push to main.R8 / minificationWhy the release build almost didn’t work, and the keep rules that fixed it.Publishing these docsRunning this MkDocs site locally and putting it on the web.
The moving parts
What you need
| To run | You need |
|---|---|
| The signaling server | A host with a public IP or DNS name, a TLS cert (Let’s Encrypt via the proxy), Rust toolchain or a prebuilt binary |
| The Android app | The APK from Releases, and the server URL set in Settings → Server |
| The CI | A self-hosted runner with the Android SDK + JDK 21 (the workflow is runs-on: self-hosted) |
| These docs online | Any static host - GitHub Pages, Cloudflare Pages, Netlify, or the same VPS |
Configuration surface
The entire deployment config is:
| Where | Setting |
|---|---|
| Server env | HOST (default 0.0.0.0), PORT (default 8080), RUST_LOG (default info) |
| Reverse proxy | your-host → 127.0.0.1:8080, WebSocket upgrade passthrough, TLS |
| Android app | Settings → Server → Signaling server URL (wss://your-host/) |
| CI | ANDROID_HOME / ANDROID_SDK_ROOT in the workflow env |
There are no secrets to manage on the server - a room code is the only shared secret, and it’s chosen per-call by the users.