9.2 KiB
Android Cast — production infrastructure
Read this first after a context reset, before changing nginx, deploy paths, or URLs.
| Doc | When |
|---|---|
| docs/README.md | Documentation index — TOC for all guides |
| This file | Topology, hosts, ports, sshfs, agent rules |
| examples/app_hub/DEPLOY.md | Hub landing only (BE listen 80) |
| examples/crash_reporter/backend/README.md | PHP, MariaDB, tickets, ingest |
| docs/GIT_FLOW.md | Branches, next, no direct commits to master |
| docs/TICKETS_ROADMAP.md | Tickets, Gitea, alpha delegation |
Table of contents
- 1. Topology
- 2. Port 8089 — not the androidcast vhost
- 3. Public URLs
- 4. Disk layout (BE)
- 5. Nginx — source of truth in repo
- 6. Local sshfs workspace (not in git)
- 7. FE nginx — two server names
- 8. Verify
- 9. Backend app (crashes / tickets)
- 10. Rules for agents
- 11. Changelog (infra doc)
Documentation index: README.md
1. Topology
Internet / LAN
│
▼
┌─────────────────────────────────────┐
│ FE — Gentoo HVM │
│ Public: https://apps.f0xx.org │
│ TLS termination, nginx reverse proxy│
└──────────────┬──────────────────────┘
│ proxy_pass http://artc0.intra.raptor.org:80
│ (default location /)
▼
┌─────────────────────────────────────┐
│ BE — Alpine VM 10.7.16.128 │
│ nginx: /etc/nginx/conf.d/apps.conf│
│ PHP-FPM unix socket │
│ MariaDB: androidcast_crashes │
└─────────────────────────────────────┘
| Role | Host | Notes |
|---|---|---|
| FE | Gentoo, apps.f0xx.org |
Almost all app traffic → BE :80 |
| BE | Alpine artc0.intra.raptor.org |
App vhost lives in listen 80 for FE traffic |
| Jump SSH | f0xx.org:222 → Alpine :22 |
~/.ssh/config host alpine-be |
| Git origin | git://f0xx.org/android_cast |
Integration branch next |
2. Port 8089 — not the androidcast vhost
Do not configure or document the project hub or crash console on :8089 for this installation.
| Port | Service |
|---|---|
| 80 | Canonical androidcast vhost on BE (hub + crashes when FE uses location / or explicit :80 upstream) |
| 443 | BE TLS (used by some FE proxy_pass rules, e.g. apps.f0xx.org → https://artc0:443/.../crashes/) |
| 8089 | Other stack (e.g. Janus /janus/) — not androidcast nginx vhost |
Wrong FE pattern (remove if present on artc0.f0xx.org):
proxy_pass https://artc0.intra.raptor.org:8089/app/androidcast_project/; # BAD for hub
Correct public path for hub:
https://apps.f0xx.org/app/androidcast_project/ → FE location / → http://artc0.intra.raptor.org:80 → BE listen 80 locations.
3. Public URLs
| URL | Component |
|---|---|
https://apps.f0xx.org/app/androidcast_project/ |
Static hub (examples/app_hub/index.html) |
https://apps.f0xx.org/app/androidcast_project/crashes/ |
PHP crash + tickets console |
https://apps.f0xx.org/app/androidcast_project/build/ |
PHP APK builder console |
https://apps.f0xx.org/app/androidcast_project/crashes/api/upload.php |
Device crash upload (no session) |
Legacy hostname f0xx.org may still appear in app settings.json examples; production ingest/scripts prefer apps.f0xx.org.
4. Disk layout (BE)
Web root prefix:
/var/www/localhost/htdocs/apps/app/androidcast_project/
| Path on BE | Repo |
|---|---|
.../androidcast_project/android_cast/ |
Full git tree (crash backend, app sources) |
.../androidcast_project/index.html |
examples/app_hub/index.html (copy or symlink) |
.../androidcast_project/ota-artifacts/v0/ |
OTA publish tree (/v0/ota/ on public URL) |
.../android_cast/examples/crash_reporter/backend/public/ |
PHP document root for crashes |
config.php base_path must be exactly:
/app/androidcast_project/crashes
5. Nginx — source of truth in repo
| File | Purpose |
|---|---|
examples/crash_reporter/backend/nginx.apps-port80.fragment |
Replace BE server { listen 80; ... } — hub + crashes + build |
examples/crash_reporter/backend/nginx.apps-builder.frag |
Build-only blocks (also included on BE 443 via apps_builder.frag) |
examples/crash_reporter/backend/nginx.fe-apps.f0xx.org.snippet |
FE hub/crashes → http://artc0:80 (preserve URI) |
examples/crash_reporter/backend/nginx.apps.conf.fragment |
Reference blocks (443-oriented comments) |
examples/crash_reporter/backend/nginx.vm.conf |
Full VM example |
BE apps.conf today (typical)
listen 80— often empty (only generic\.php$) → public hub 502 until port-80 fragment is applied.listen 443 ssl— may already contain hub + crashes (direct HTTPS to VM).
FE apps.f0xx.org uses proxy_pass http://artc0.intra.raptor.org:80 for / — so hub must be on BE port 80, not only 443.
Hub location (correct)
Use directory alias, not alias to a single file:
location /app/androidcast_project/ {
alias /var/www/localhost/htdocs/apps/app/androidcast_project/;
index index.html;
}
Reload (BE only for hub deploy)
ssh alpine-be 'sudo nginx -t && sudo rc-service nginx reload'
6. Local sshfs workspace (not in git)
Edit live configs from the dev machine via mounts under repo tmp/:
| Mount | Remote |
|---|---|
tmp/FE_gentoo/etc/nginx/ |
Gentoo FE nginx |
tmp/BE_alpine/etc/nginx/conf.d/apps.conf |
Alpine BE apps vhost |
tmp/BE_alpine/var/www/localhost/htdocs/apps/... |
BE web tree |
Treat tmp/ as local mirrors — sync/reload on the real host after edits.
7. FE nginx — two server names
Mounted copy: tmp/FE_gentoo/etc/nginx/nginx.conf.
server_name |
location / |
androidcast crashes | Hub /app/androidcast_project/ |
|---|---|---|---|
apps.f0xx.org |
→ http://artc0:80 |
Must not → https://artc0:443/... (static download) |
Hub/crashes blocks must use http://artc0:80 — see nginx.fe-apps.f0xx.org.snippet |
/v0/ota/ on FE |
→ http://artc0:80 |
BE :80 serves static tree | In consolidated /etc/nginx/apps.conf — see patches/fe-nginx-APPLY.md |
artc0.f0xx.org |
→ http://artc0:80 |
Legacy → :8089 | Legacy → :8089 — remove hub block; prefer apps.f0xx.org |
Agent default: fix BE listen 80 first. Change FE only when user asks or to delete wrong 8089 hub overrides on artc0.f0xx.org.
8. Verify
# BE directly (simulates FE Host header)
curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: apps.f0xx.org" \
"http://artc0.intra.raptor.org/app/androidcast_project/"
curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: apps.f0xx.org" \
"http://artc0.intra.raptor.org/app/androidcast_project/crashes/"
# Public
curl -sS -o /dev/null -w "%{http_code}\n" \
"https://apps.f0xx.org/app/androidcast_project/"
Expect 200 (or 302 → crashes only if you intentionally redirect root).
9. Backend app (crashes / tickets)
- PHP 8.1+ FPM on Alpine; MariaDB DB
androidcast_crashes. - Migration
003_tickets.sqlas MySQL root if UI says table missing (app user cannot DDL). Database::requireTicketsTable()must open PDO beforeSHOW TABLES(fixed in repo).- Ingest smoke tickets:
php scripts/ingest_alpha_smoke_tickets.php --url=https://apps.f0xx.org/app/androidcast_project/crashes
10. Rules for agents
- KISS — prefer one BE change (
listen 80fragment) over FE + BE + 8089 guesses. - Never point androidcast hub/crashes docs at :8089 for this install.
- Do not use
aliastoindex.htmlas a file path (breaks trailing slash / CSS). - Do not commit
tmp/sshfs trees,*.log, or workspace files unless user asks. - Do not commit to
master/nextdirectly — usefeature/*→ merge tonext(GIT_FLOW). - User may be unwell / slow to deploy — give short copy-paste steps, not long runbooks.
11. Changelog (infra doc)
| Date | Note |
|---|---|
| 2026-05-21 | Documented BE-only hub on port 80; 8089 = Janus only; FE apps vs artc0 split |