Add CRM stub flag, deploy/backup scripts, CI and prod runbook
- 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>
This commit is contained in:
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user