From d0010320b136a32d549c6cb704d98e2ab08e1a3e Mon Sep 17 00:00:00 2001 From: wasrusgen Date: Mon, 1 Jun 2026 17:15:13 +0300 Subject: [PATCH] =?UTF-8?q?ops(deploy):=20py=5Fcompile=20guard=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=20=D1=80=D0=B5=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=20+=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B6=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20+=20Telegram-?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D1=80=D1=82=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy.sh | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/deploy.sh b/deploy.sh index 53cc243..f1c974e 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,21 +1,54 @@ #!/bin/bash # Автодеплой Elena Consulting на Finnish VPS -# Запускается по cron каждые 2 мин: git pull → деплой при изменениях +# Запускается по cron каждые 2 мин: git pull → деплой при изменениях. +# Защита: проверка синтаксиса backend перед рестартом + Telegram-алерт при сбое. set -e REPO=/opt/elena-deploy APP=/opt/elena-consulting -cd $REPO +PY=$APP/venv/bin/python3 +TG_TOKEN="8767209545:AAEVgfL-bAhg6j0fHUyKWUze4SLTfJbLklM" +ADMIN_CHAT_ID="$(grep -E '^ADMIN_CHAT_ID=' "$APP/.env" 2>/dev/null | cut -d= -f2)" + +alert() { + [ -n "$ADMIN_CHAT_ID" ] || return 0 + curl -s "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \ + -d chat_id="$ADMIN_CHAT_ID" --data-urlencode text="$1" >/dev/null 2>&1 || true +} + +cd "$REPO" BEFORE=$(git rev-parse HEAD) -git pull --quiet origin main +if ! git pull --quiet origin main; then + echo "[$(date)] git pull FAILED" + alert "❌ Деплой: git pull упал на сервере консалтинга." + exit 1 +fi AFTER=$(git rev-parse HEAD) + if [ "$BEFORE" != "$AFTER" ]; then echo "[$(date)] Изменения $BEFORE → $AFTER, деплой..." - cp $REPO/docs/cabinet.html $REPO/docs/crm.html $REPO/docs/elena_live.html $APP/static/ 2>/dev/null || true - if [ -f $REPO/backend/elena_app.py ]; then - cp $REPO/backend/elena_app.py $APP/elena_app.py - mkdir -p $APP/legal; cp $REPO/backend/legal/*.md $APP/legal/ 2>/dev/null || true + # Фронтенд — статика, без рисков + cp "$REPO"/docs/cabinet.html "$REPO"/docs/crm.html "$REPO"/docs/elena_live.html "$APP"/static/ 2>/dev/null || true + + if [ -f "$REPO/backend/elena_app.py" ]; then + # 1) Проверка синтаксиса ДО замены/рестарта — иначе ошибка уронит прод + if ! "$PY" -m py_compile "$REPO/backend/elena_app.py" 2>/tmp/pycompile.err; then + echo "[$(date)] SYNTAX ERROR — backend НЕ обновлён" + alert "❌ Деплой ОТМЕНЁН: синтаксис elena_app.py (${AFTER:0:8}). Прод не тронут. $(head -c 250 /tmp/pycompile.err)" + exit 1 + fi + cp "$REPO/backend/elena_app.py" "$APP/elena_app.py" + mkdir -p "$APP/legal"; cp "$REPO"/backend/legal/*.md "$APP"/legal/ 2>/dev/null || true systemctl restart elena-consulting - echo "[$(date)] Backend перезапущен" + sleep 2 + # 2) Проверка, что сервис поднялся + if systemctl is-active --quiet elena-consulting; then + echo "[$(date)] Backend перезапущен и активен" + else + echo "[$(date)] BACKEND DOWN после рестарта" + alert "🔴 СРОЧНО: backend консалтинга НЕ запустился после деплоя (${AFTER:0:8}). journalctl -u elena-consulting -n50" + exit 1 + fi fi echo "[$(date)] Деплой завершён" + alert "✅ Деплой применён: ${AFTER:0:8}" fi