- CRM_USE_STUB: local runs no longer reach the live CRM. With only the Checkbox stub, a stub receipt would still move the real order to PACKED. Refused in production, same as CHECKBOX_USE_STUB. - scripts/deploy.sh: backup, fast-forward main, build, health check and code rollback on failure. scripts/backup.sh: pg_dump with verification and 14-day rotation (used by cron and deploy.sh). - Gitea Actions CI: ruff + pytest, oxlint + build. - DEPLOY.md runbook; CLAUDE.md rules for safe local development. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
2.7 KiB
Bash
Executable File
57 lines
2.7 KiB
Bash
Executable File
#!/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
|