All checks were successful
ENGIN CI / Build, test and smoke (push) Successful in 56s
104 lines
2.8 KiB
Markdown
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
|
|
```
|