#!/bin/sh # Выкладка main на прод: бэкап БД → git pull → сборка и запуск → проверка health. # Если новая версия не поднялась — откат кода на предыдущий коммит (БД не откатывается, # путь к свежему бэкапу печатается). Запуск на сервере: ~/lux_fiscal/scripts/deploy.sh [--force] set -eu cd "$(dirname "$0")/.." C="docker compose -f docker-compose.yml -f docker-compose.prod.yml" health() { # Цепочка целиком: nginx фронтенда → api → БД/Redis. $C exec -T frontend wget -qO- http://127.0.0.1/api/v1/health | grep -q '"status":"ok"' } if [ -n "$(git status --porcelain --untracked-files=no)" ]; then echo "На сервере есть незакоммиченные правки в отслеживаемых файлах — разберитесь вручную:" >&2 git status --short --untracked-files=no >&2 exit 1 fi # PREV — то, что крутится сейчас (после неудачной выкладки это detached-коммит отката, а не main). PREV=$(git rev-parse HEAD) git checkout -q main git fetch -q origin main git merge -q --ff-only origin/main NEW=$(git rev-parse HEAD) if [ "$PREV" = "$NEW" ] && [ "${1:-}" != "--force" ]; then echo "Нечего выкладывать: уже на $(git log --oneline -1). Пересобрать всё равно: --force" exit 0 fi echo "== Бэкап БД" BACKUP=$(scripts/backup.sh | tail -1 | awk '{print $3}') echo " $BACKUP" echo "== Выкладка $(git log --oneline -1 "$PREV") -> $(git log --oneline -1 "$NEW")" if $C up -d --build --wait --remove-orphans && health; then echo "== Готово: $(git log --oneline -1)" docker image prune -f --filter "label=com.docker.compose.project=lux-fiscal" > /dev/null || true exit 0 fi echo "!! Новая версия не поднялась — откат кода на $PREV" >&2 $C logs --tail 50 migrate api worker >&2 || true git checkout -q --detach "$PREV" $C up -d --build --wait --remove-orphans || true if health; then echo "!! Откат выполнен, работает $(git log --oneline -1). Репозиторий в detached HEAD —" >&2 echo "!! следующий deploy.sh сам вернётся на main." >&2 else echo "!! Откат не помог: сервис не отвечает." >&2 fi echo "!! Если новая версия успела применить миграции, а старый код с ними несовместим —" >&2 echo "!! восстановите БД из бэкапа, снятого перед выкладкой: $BACKUP (см. DEPLOY.md)." >&2 exit 1