hackathon-ENGIN/docs/PRODUCTION_RUNBOOK.md
Jakub Famulski 2 5ebfdc389a
All checks were successful
ENGIN CI / Build, test and smoke (push) Successful in 56s
prod: run container with restricted privileges
2026-08-25 13:16:23 +02:00

2.8 KiB

ENGIN — production runbook

Kontrakt wdrożenia

  • Docker Engine i Docker Compose v2.
  • Aplikacja działa jako UID/GID 10001:10001.
  • Port jest domyślnie dostępny tylko na 127.0.0.1:8501.
  • Root filesystem kontenera jest tylko do odczytu; zapisywalny jest wyłącznie tymczasowy /tmp o rozmiarze 64 MiB.
  • Kontener nie ma Linux capabilities i nie może uzyskać nowych uprawnień.
  • Limity: 2 CPU, 1 GiB RAM i 256 procesów.
  • Przesłane CSV nie są zapisywane na dysku ani w wolumenie.

Pierwszy start

Wykonuj polecenia z katalogu repozytorium na czystym, zatwierdzonym commicie:

export ENGIN_IMAGE_TAG="$(git rev-parse --short HEAD)"

docker compose -f compose.prod.yaml config --quiet
docker compose -f compose.prod.yaml build
docker compose -f compose.prod.yaml up -d --no-build
docker compose -f compose.prod.yaml ps

curl --fail http://127.0.0.1:8501/_stcore/health

Oczekiwana odpowiedź healthchecku: ok.

Kontrola ograniczeń

CONTAINER_ID="$(docker compose -f compose.prod.yaml ps -q engin)"

docker inspect --format \
  'user={{.Config.User}} readonly={{.HostConfig.ReadonlyRootfs}} pids={{.HostConfig.PidsLimit}} memory={{.HostConfig.Memory}} nanocpus={{.HostConfig.NanoCpus}}' \
  "$CONTAINER_ID"

Oczekiwane wartości:

user=10001:10001 readonly=true pids=256 memory=1073741824 nanocpus=2000000000

Logi i diagnostyka

docker compose -f compose.prod.yaml logs --tail 200 engin
docker compose -f compose.prod.yaml ps

Logi są rotowane przez sterownik local: maksymalnie trzy pliki po 10 MiB.

Aktualizacja

Najpierw zachowaj SHA aktualnie działającego obrazu, następnie zbuduj nową, jednoznacznie otagowaną wersję:

docker compose -f compose.prod.yaml ps
git pull --ff-only

export ENGIN_IMAGE_TAG="$(git rev-parse --short HEAD)"
docker compose -f compose.prod.yaml build
docker compose -f compose.prod.yaml up -d --no-build
curl --fail http://127.0.0.1:8501/_stcore/health

Nie usuwaj poprzedniego obrazu przed zakończeniem smoke testu.

Rollback

Jeżeli smoke test nowej wersji nie przejdzie, uruchom poprzedni lokalny tag bez ponownego budowania:

ENGIN_IMAGE_TAG=<poprzedni_git_sha> \
  docker compose -f compose.prod.yaml up -d --no-build

curl --fail http://127.0.0.1:8501/_stcore/health

Jeżeli obrazu o wskazanym tagu już nie ma, przełącz repo na zatwierdzony commit, odbuduj obraz i ponownie wykonaj smoke test. Nie używaj niezaufanego artefaktu modelu jako skrótu do rollbacku.

Udostępnienie poza hostem

Domyślne wiązanie 127.0.0.1 jest celowe. Dostęp sieciowy włączaj dopiero za reverse proxy z TLS i regułami firewalla. W takim środowisku można ustawić:

ENGIN_BIND_ADDRESS=0.0.0.0 \
  docker compose -f compose.prod.yaml up -d --no-build

Zatrzymanie

docker compose -f compose.prod.yaml down