Files
ems/deploy/deploy.sh
Dusan Vojacek 46d333d561
Some checks failed
CI and deploy / migration-check (push) Failing after 17s
CI and deploy / deploy (push) Has been skipped
deploy.sh: stop app kontejnerů před buildem + self-sync skriptu
Slabý server: build s běžícím stackem se dusí (pozorování z provozu) —
před docker compose build zastavit backend/frontend/postgrest (db zůstává).
Self-sync: po git resetu se ROOT/deploy.sh atomicky obnoví z checkoutu
(projeví se příštím během). První instalace nové verze ručně:
install -m 0755 /opt/ems-deploy/app/deploy/deploy.sh /opt/ems-deploy/deploy.sh

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 15:52:25 +02:00

87 lines
2.9 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).
log "Flyway validate"
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" run --rm flyway validate
log "Flyway migrate (docker compose run --rm flyway)"
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" run --rm flyway migrate
# Slabý server: build s běžícím stackem se dusí (CPU/RAM). App kontejnery před
# buildem zastavit (db NE — flyway už doběhl, ale telemetrie/MCP/IDE na DB visí).
# Výpadek backendu během buildu = navržená degradace (Loxone autonomní fallback).
log "docker compose stop backend frontend postgrest (uvolnit zdroje pro build)"
docker compose -f "$COMPOSE_DST" --env-file "$ENV_FILE" stop backend frontend postgrest || true
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"