# 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`.
