Run 368/369: flyway validate 9,5 min nedostal spojení k db (EOF) — server zadušený běžícím stackem + buildem. Stop backend/frontend/postgrest hned po compose config; db zůstává pro flyway. Workflow self-install už funguje (ověřeno v logu 369: nový skript se použil). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
90 lines
3.2 KiB
Bash
Executable File
90 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# POZOR: Gitea Actions spouští KOPII tohoto skriptu v ${ROOT}/deploy.sh (ne checkout).
|
|
# Skript se po git resetu sám synchronizuje (atomicky, projeví se PŘÍŠTÍM během).
|
|
# První nasazení nové verze skriptu: ručně `install -m 0755 app/deploy/deploy.sh /opt/ems-deploy/deploy.sh`.
|
|
set -euo pipefail
|
|
|
|
ROOT="${EMS_DEPLOY_ROOT:-/opt/ems-deploy}"
|
|
APP="${ROOT}/app"
|
|
COMPOSE_SRC="${APP}/deploy/docker-compose.yml"
|
|
COMPOSE_DST="${ROOT}/docker-compose.yml"
|
|
ENV_FILE="${ROOT}/.env"
|
|
LOCK_FILE="${ROOT}/.deploy.lock"
|
|
|
|
log() {
|
|
echo "[$(date -Iseconds)] $*"
|
|
}
|
|
|
|
if [[ ! -d "$APP/.git" ]]; then
|
|
log "ERROR: missing git checkout at $APP"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
log "ERROR: missing $ENV_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$COMPOSE_SRC" ]]; then
|
|
log "ERROR: missing $COMPOSE_SRC"
|
|
exit 1
|
|
fi
|
|
|
|
exec 9>"$LOCK_FILE"
|
|
flock 9
|
|
|
|
log "Starting deploy (ROOT=$ROOT)"
|
|
log "whoami=$(whoami)"
|
|
log "pwd=$(pwd)"
|
|
log "app owner=$(stat -c '%u:%g %n' "$APP")"
|
|
|
|
log "Git: fetch origin"
|
|
git -c safe.directory="$APP" -C "$APP" fetch origin
|
|
|
|
log "Git: checkout main"
|
|
git -c safe.directory="$APP" -C "$APP" checkout main
|
|
|
|
log "Git: reset --hard origin/main"
|
|
git -c safe.directory="$APP" -C "$APP" reset --hard origin/main
|
|
|
|
# Self-sync skriptu pro PŘÍŠTÍ běh (atomický mv — běžící instance čte původní inode).
|
|
if ! cmp -s "$APP/deploy/deploy.sh" "$ROOT/deploy.sh"; then
|
|
log "Self-sync deploy.sh (projeví se příštím během)"
|
|
install -m 0755 "$APP/deploy/deploy.sh" "$ROOT/.deploy.sh.new"
|
|
mv -f "$ROOT/.deploy.sh.new" "$ROOT/deploy.sh"
|
|
fi
|
|
|
|
log "Sync compose -> $COMPOSE_DST"
|
|
install -m 0644 "$COMPOSE_SRC" "$COMPOSE_DST"
|
|
|
|
log "docker compose config (validate)"
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" config >/dev/null
|
|
|
|
# Flyway: nejdřív validate (soubory vs flyway_schema_history na DB), pak migrate.
|
|
# Čisté `up -d` často znovu nespustí jednorázový kontejner flyway — změny jen v R__/*.sql přes migrate.
|
|
# Při chybě je v logu celý Flyway výstup (konkrétní SQL / řádek).
|
|
# Slabý server: backend (pandas/solver) + frontend dusí box natolik, že flyway
|
|
# nedostane spojení k DB (run 369: 9,5 min timeout → EOF). App kontejnery stopnout
|
|
# PŘED flyway; db zůstává. Výpadek backendu během deploye = navržená degradace
|
|
# (Loxone autonomní fallback).
|
|
log "docker compose stop backend frontend postgrest (uvolnit zdroje pro flyway+build)"
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" stop backend frontend postgrest || true
|
|
|
|
log "Flyway validate"
|
|
# *:pending — nové/změněné repeatables aplikuje hned následující migrate;
|
|
# bez ignore patternu flyway 12 validate selže dřív, než se k migrate dostane.
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" run --rm flyway validate -ignoreMigrationPatterns='*:pending'
|
|
|
|
log "Flyway migrate (docker compose run --rm flyway)"
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" run --rm flyway migrate
|
|
|
|
log "docker compose build"
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" build
|
|
|
|
log "docker compose up -d"
|
|
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" up -d
|
|
|
|
log "docker image prune (dangling only)"
|
|
docker image prune -f
|
|
|
|
log "Deploy finished OK" |