# Python backend baseline — 2026-08-10 Frozen rollback target for the working offline FUT backend (Python migration) as it ran on 10.10.0.120. Everything here was recorded from the live system before any cleanup/restructure; the image and state are archived in `/home/alex/OpenFUT/docker-backups/`. ## Frozen image | field | value | |------------|-------| | tag | `openfut-fut-backend:python-baseline-2026-08-10` | | image id | `e1f93ad647ab` | | digest | `sha256:e1f93ad647abbec32e2751f3e88fed75d3e574d4500395b21c31d0f0b96abac6` | | created | 2026-08-10T02:14:56Z (built as `openfut-fut-backend:dev`) | | size | 278 MB | | archive | `docker-backups/openfut-fut-backend-python-baseline-2026-08-10.tar.gz` (53 MB, `docker save \| gzip -1`) | ## Frozen container | field | value | |------------|-------| | id | `f16d3204cbf48151be232ff8f4194b429e311042f8f6f95644760d4b8eba2938` | | created | 2026-08-10T02:14:56.194470252Z | | image | `openfut-fut-backend:dev` (= baseline image id) | | restart | `unless-stopped` | | network | `docker_default`, IP `172.19.0.2`, aliases `openfut-fut-backend`, `fut-backend` | | log | json-file | | inspect | `docker-backups/openfut-fut-backend-container-inspect-2026-08-10.json` | ### Environment (Config.Env) ``` FUT_SETTINGS=off FUT_MODES=1 OPENFUT_BIND=0.0.0.0 OPENFUT_ADVERTISE=10.10.0.120 POW_CONTENT_ADDR=0.0.0.0:8080 POW_CONTENT_HOST=10.10.0.120:8085 FUT_ACCOUNT_PATH=/state/active_account.json FUT_PROFILE_ROOT=/state/accounts PYTHON_VERSION=3.12.13 (python:3.12-slim base) ``` ### Volumes / mounts Bind mount `docker/state` (host) -> `/state` (container, rw). Runtime state: `active_account.json` (active persona) + `accounts/` (FUT saves by persona). Snapshot: `docker-backups/state-2026-08-10/`. ### Ports (host -> container) | host | container | service | |------|-----------|---------| | 4216 | 4216 | LSX (Origin bootstrap) | | 42127 | 42127 | Blaze redirector (TLS) | | 42130 | 42130 | Blaze main | | 42131 | 42131 | Nucleus OAuth stub | | 8081 | 8081 | FUT roster XML (HTTPS) | | 8099 | 8099 | UTAS / RS4 FUT REST API | | 8094 | 8094 | POW / EASFC API | | 8085 | 8080 | POW content (remapped to avoid openfut-core:8080) | All listeners verified bound on `0.0.0.0` in the container (LSX/Blaze/nucleus, roster, UTAS, POW, POW content). ## Dataset manifest `docker-backups/SHA256SUMS-container-baseline-2026-08-10.txt` — sha256 of all 323 files under `/app/tools` + `/app/data` inside the running container. `fifa17-python/tools/` and `fifa17-python/data/` are the staged sources that built this image (verified byte-identical to the container copies at freeze time). Images rebuilt from git now bake their own `/app/SHA256SUMS.txt`; the rebuild-equivalence check is `diff` between that and this manifest; the only expected deltas are pycache files (not committed) and the redir cert pair (regenerated per build). ## Restore ```sh # From the archived image (works offline, exact layers): docker load -i /home/alex/OpenFUT/docker-backups/openfut-fut-backend-python-baseline-2026-08-10.tar.gz docker tag openfut-fut-backend:python-baseline-2026-08-10 openfut-fut-backend:dev # Or rebuild from git: cd /home/alex/OpenFUT/fifa17-recon/docker/fifa17-python cp .env.example .env # set OPENFUT_ADVERTISE docker compose up -d --build ``` ## Status at freeze time - The 2026-08-10 `openfut-fut-backend` container was **left running untouched** (the .105 launcher audit uses it). No rebuild/replacement happens until that audit finishes; the frozen image is the rollback target if cleanup breaks it. - `docker/state` was **not** moved during restructure (bind path must not change while the container is live); the new compose mounts `../state` from the same location. - TURN/relay re-addressing (multiplayer) and long-tail endpoints (weather, matchday, kit assets) are deferred feature gaps — tracked separately. ## Running state vs image — what the frozen image does NOT contain The baseline image (`python-baseline-2026-08-10` / `dev`) was built at 02:14Z, but the container's `/app` was hot-patched afterwards: * `tools/utas_server.py` — gained the `FUT_MODES`-gated `offlineSeason` block in GetHubData's club response (keeps the hub's offline-season summary valid). * `tools/test_hub_offline_season_contract.py` — added to `/app/tools`. `docker save` captures the image, not the container's writable layer, so the baseline tar.gz lacks those two changes. Two paths cover the exact runtime: * `openfut-fut-backend:python-running-2026-08-10` — `docker commit` of the running container (sha256:093a98fa0496...), the exact runtime FS. * The committed `fifa17-python/tools` + `data` — synced to match the running container byte-for-byte (237 files verified, incl. the redir cert pair), so a fresh build reproduces the actual running backend. Proven by rebuilding from the committed sources and diffing the baked `/app/SHA256SUMS.txt` against the container manifest: identical. Archive: `docker-backups/openfut-fut-backend-python-running-2026-08-10.tar.gz`.