[Unit] Description=OpenFUT FIFA17 UTAS host (STAGING) — client-facing, Core-dependent Documentation=file:///home/alex/OpenFUT/scripts/systemd/README.md # ORDERING AND ADMISSION. `Wants` + `After` order the host after Core and pull # Core in when the host is started; neither gives READINESS, because Type=exec # only proves the binary exec'd. The ExecStartPre below is what actually admits # traffic: the host cannot reach "active" while Core is not listening. Wants=openfut-staging-core.service After=openfut-staging-core.service # Requires on the NAMESPACE (hard) but only Wants on Core (soft) — the host # must never bind the host network, yet must survive a Core blip. Requires=openfut-staging-netns.service After=openfut-staging-netns.service # `Wants`, deliberately NOT `Requires`/`BindsTo`/`PartOf`. Those propagate a # Core stop into a host stop, and — measured, not assumed — a later Core start # does NOT bring the host back, so a routine Core restart would silently leave # the client with no server at all. # # With `Wants` the host survives a Core outage and answers 503 # `core_unavailable`, never falling back to Python. That is the behaviour # production already exhibited on 2026-08-22 when Core was SIGHUP'd out from # under a live host. Because the host holds no Core state between requests, it # resumes serving the moment Core returns, with no supervisor intervention. # StartLimit* MUST live in [Unit]: systemd 252 silently IGNORES them in # [Service] (`systemd-analyze verify` flags it), which would have left the # crash-loop ceiling at the 10s/5 default instead of the intended 60s window. StartLimitIntervalSec=60 StartLimitBurst=5 [Service] Type=exec User=alex Group=alex WorkingDirectory=/home/alex/openfut-sold-staging NetworkNamespacePath=/run/netns/openfut-staging EnvironmentFile=/home/alex/openfut-sold-staging/systemd/host.env # Readiness gate. Bounded, and FAILS rather than blocking forever: a host that # waits indefinitely looks healthy to the supervisor while serving nothing. ExecStartPre=/home/alex/OpenFUT/scripts/systemd/openfut-wait-tcp.sh 127.0.0.1 18081 30 ExecStart=/home/alex/openfut-sold-staging/bin/openfut-utas-host KillSignal=SIGTERM KillMode=mixed TimeoutStopSec=20 Restart=on-failure RestartSec=5s StandardOutput=journal StandardError=journal SyslogIdentifier=openfut-staging-host [Install] WantedBy=multi-user.target