# 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= \ 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 ```