From db230a6a77fb42e34dd3e7f6858d9639303d728e Mon Sep 17 00:00:00 2001 From: Anton Afanasyeu Date: Wed, 10 Jun 2026 11:54:09 +0200 Subject: [PATCH] sync --- docs/BUILD_DEPLOY.md | 10 +++++--- docs/INFRA.md | 1 + .../backend/nginx.apps-port80.fragment | 7 ++++++ .../backend/nginx.apps.conf.fragment | 5 ++++ .../backend/nginx.fe-apps.f0xx.org.snippet | 12 +++++++++ examples/crash_reporter/backend/nginx.vm.conf | 5 ++++ .../backend/scripts/prepare-be-ota-mount.sh | 25 +++++++++++++++++++ examples/settings.json | 3 ++- 8 files changed, 64 insertions(+), 4 deletions(-) create mode 100755 examples/crash_reporter/backend/scripts/prepare-be-ota-mount.sh diff --git a/docs/BUILD_DEPLOY.md b/docs/BUILD_DEPLOY.md index e236407..1536bcc 100644 --- a/docs/BUILD_DEPLOY.md +++ b/docs/BUILD_DEPLOY.md @@ -86,12 +86,16 @@ Direct debug ports: crashes `:8082`, builder `:8083`. |-----|------------------| | `build.repo_root` | `/var/www/.../androidcast_project/android_cast` (git tree) | | `build.artifacts_root` | `/var/www/.../androidcast_project/out/builds` — **must exist**, writable by PHP-FPM (`nginx`) | +| `build.ota_mount` | `/var/www/.../androidcast_project/ota-artifacts` — nginx serves `…/v0/ota/` at `/v0/ota/` | | `build.runner_script` | full path to `scripts/docker-build-runner.sh` (no `...` placeholders) | ```sh -mkdir -p .../out/builds .../ota-artifacts -chown -R nginx:nginx .../out -chmod -R 775 .../out +sudo examples/crash_reporter/backend/scripts/prepare-be-ota-mount.sh +mkdir -p .../out/builds +chown -R nginx:nginx .../out .../ota-artifacts +chmod -R 775 .../out .../ota-artifacts ``` +Apply nginx OTA block: `nginx.apps-port80.fragment` (`location ^~ /v0/ota/`), then `nginx -t && rc-service nginx reload` on BE. + If **Start build** shows *Network error*, check BE `php-fpm81` log: often `mkdir(): Permission denied` on `out/builds` (HTTP 500, not a browser network fault). diff --git a/docs/INFRA.md b/docs/INFRA.md index 080dad6..264a9e6 100644 --- a/docs/INFRA.md +++ b/docs/INFRA.md @@ -116,6 +116,7 @@ Web root prefix: |------------|------| | `.../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: diff --git a/examples/crash_reporter/backend/nginx.apps-port80.fragment b/examples/crash_reporter/backend/nginx.apps-port80.fragment index 7daa09c..aa7f7ee 100644 --- a/examples/crash_reporter/backend/nginx.apps-port80.fragment +++ b/examples/crash_reporter/backend/nginx.apps-port80.fragment @@ -5,6 +5,13 @@ server { listen 80; + # OTA v0 static tree — devices fetch https://apps.f0xx.org/v0/ota/channel/stable.json + # Populate: builder auto_deploy, or rsync out/ota/v0/ → .../ota-artifacts/v0/ + location ^~ /v0/ota/ { + alias /var/www/localhost/htdocs/apps/app/androidcast_project/ota-artifacts/v0/ota/; + add_header Cache-Control "public, max-age=60"; + } + location = /app/androidcast_project { return 301 /app/androidcast_project/; } diff --git a/examples/crash_reporter/backend/nginx.apps.conf.fragment b/examples/crash_reporter/backend/nginx.apps.conf.fragment index 5c0242c..36312c7 100644 --- a/examples/crash_reporter/backend/nginx.apps.conf.fragment +++ b/examples/crash_reporter/backend/nginx.apps.conf.fragment @@ -1,6 +1,11 @@ # Paste into the listen 443 (and 80) server {} in /etc/nginx/conf.d/apps.conf # Replaces old per-URL blocks + any backend symlink paths. + location ^~ /v0/ota/ { + alias /var/www/localhost/htdocs/apps/app/androidcast_project/ota-artifacts/v0/ota/; + add_header Cache-Control "public, max-age=60"; + } + location = /app/androidcast_project/crashes { return 301 /app/androidcast_project/crashes/; } diff --git a/examples/crash_reporter/backend/nginx.fe-apps.f0xx.org.snippet b/examples/crash_reporter/backend/nginx.fe-apps.f0xx.org.snippet index 5c5551b..b952fce 100644 --- a/examples/crash_reporter/backend/nginx.fe-apps.f0xx.org.snippet +++ b/examples/crash_reporter/backend/nginx.fe-apps.f0xx.org.snippet @@ -1,4 +1,16 @@ # FE apps.f0xx.org — replace hub/crashes upstream blocks (use BE port 80, preserve URI). +# If location / already proxy_passes to artc0:80, /v0/ota/ needs no extra block once BE serves it. +# Optional explicit block (same upstream as /): +# +# location /v0/ota/ { +# proxy_pass http://artc0.intra.raptor.org:80; +# proxy_http_version 1.1; +# proxy_set_header Host $host; +# proxy_set_header X-Real-IP $remote_addr; +# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +# proxy_set_header X-Forwarded-Proto $scheme; +# } +# # File: tmp/FE_gentoo/etc/nginx/nginx.conf (inside server { listen 443; server_name apps.f0xx.org; }) # # WRONG (causes browser to download index.php as application/octet-stream): diff --git a/examples/crash_reporter/backend/nginx.vm.conf b/examples/crash_reporter/backend/nginx.vm.conf index 57e8cce..c652555 100644 --- a/examples/crash_reporter/backend/nginx.vm.conf +++ b/examples/crash_reporter/backend/nginx.vm.conf @@ -18,6 +18,11 @@ server { access_log /var/log/nginx/apps.intra.raptor.org.access_log main; error_log /var/log/nginx/apps.intra.raptor.org.error_log warn; + location ^~ /v0/ota/ { + alias /var/www/localhost/htdocs/apps/app/androidcast_project/ota-artifacts/v0/ota/; + add_header Cache-Control "public, max-age=60"; + } + location = /app/androidcast_project/crashes { return 301 /app/androidcast_project/crashes/; } diff --git a/examples/crash_reporter/backend/scripts/prepare-be-ota-mount.sh b/examples/crash_reporter/backend/scripts/prepare-be-ota-mount.sh new file mode 100755 index 0000000..458a711 --- /dev/null +++ b/examples/crash_reporter/backend/scripts/prepare-be-ota-mount.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Create BE OTA artifact directory for nginx location /v0/ota/ (run on alpine-be). +# +# Usage (on BE as root): +# sudo ./prepare-be-ota-mount.sh +# sudo ./prepare-be-ota-mount.sh /custom/path/to/ota-artifacts +# +# After mkdir, publish artifacts: +# rsync -av ./out/ota/v0/ /var/www/.../ota-artifacts/v0/ +# Or enable builder config build.ota_mount + auto_deploy. +set -euo pipefail + +OTA_ROOT="${1:-/var/www/localhost/htdocs/apps/app/androidcast_project/ota-artifacts}" +V0="${OTA_ROOT}/v0" + +mkdir -p "${V0}/ota/channel" +chown -R nginx:nginx "${OTA_ROOT}" +chmod -R 775 "${OTA_ROOT}" + +echo "OTA mount ready: ${OTA_ROOT}" +echo "nginx alias target: ${V0}/ota/" +echo "Channel URL: https://apps.f0xx.org/v0/ota/channel/stable.json" +echo +echo "Publish example:" +echo " rsync -av out/ota/v0/ ${V0}/" diff --git a/examples/settings.json b/examples/settings.json index 5b438eb..7034ab1 100644 --- a/examples/settings.json +++ b/examples/settings.json @@ -1,7 +1,8 @@ { "ota": { - "base_url": "https://foxx.org/v0/ota/channel/stable.json", + "base_url": "https://apps.f0xx.org/v0/ota/channel/stable.json", "base_urls": [ + "https://apps.f0xx.org/v0/ota/channel/stable.json", "https://foxx.org/v0/ota/channel/stable.json", "https://mirror.foxx.org/v0/ota/channel/stable.json", "mqtt://foxx.org:8443/ota/v0/channel/stable.json"