#!/bin/bash # Автодеплой Elena Consulting на Finnish VPS # Запускается по cron каждые 2 мин: git pull → деплой при изменениях. # Защита: проверка синтаксиса backend перед рестартом + Telegram-алерт при сбое. set -e REPO=/opt/elena-deploy APP=/opt/elena-consulting PY=$APP/venv/bin/python3 TG_TOKEN="${TG_TOKEN}" 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) 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 # 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 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