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

104 lines
2.8 KiB
Markdown

# 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:
```bash
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ń
```bash
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:
```text
user=10001:10001 readonly=true pids=256 memory=1073741824 nanocpus=2000000000
```
## Logi i diagnostyka
```bash
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ę:
```bash
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:
```bash
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ć:
```bash
ENGIN_BIND_ADDRESS=0.0.0.0 \
docker compose -f compose.prod.yaml up -d --no-build
```
## Zatrzymanie
```bash
docker compose -f compose.prod.yaml down
```