mirror of
https://github.com/wasrusgen/wasrusgen1-crm.git
synced 2026-06-03 16:44:46 +00:00
ops(deploy): py_compile guard перед рестартом + проверка живости сервиса + Telegram-алерт при сбое
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c7c91d9dbe
commit
d0010320b1
49
deploy.sh
49
deploy.sh
@ -1,21 +1,54 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Автодеплой Elena Consulting на Finnish VPS
|
# Автодеплой Elena Consulting на Finnish VPS
|
||||||
# Запускается по cron каждые 2 мин: git pull → деплой при изменениях
|
# Запускается по cron каждые 2 мин: git pull → деплой при изменениях.
|
||||||
|
# Защита: проверка синтаксиса backend перед рестартом + Telegram-алерт при сбое.
|
||||||
set -e
|
set -e
|
||||||
REPO=/opt/elena-deploy
|
REPO=/opt/elena-deploy
|
||||||
APP=/opt/elena-consulting
|
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)
|
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)
|
AFTER=$(git rev-parse HEAD)
|
||||||
|
|
||||||
if [ "$BEFORE" != "$AFTER" ]; then
|
if [ "$BEFORE" != "$AFTER" ]; then
|
||||||
echo "[$(date)] Изменения $BEFORE → $AFTER, деплой..."
|
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"/docs/cabinet.html "$REPO"/docs/crm.html "$REPO"/docs/elena_live.html "$APP"/static/ 2>/dev/null || true
|
||||||
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
|
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
|
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
|
fi
|
||||||
echo "[$(date)] Деплой завершён"
|
echo "[$(date)] Деплой завершён"
|
||||||
|
alert "✅ Деплой применён: ${AFTER:0:8}"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user