From 835f846d9392237d305da4187f20fb9c4eb6ff2d Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Thu, 7 May 2026 17:46:15 +0300 Subject: [PATCH] =?utf8?q?deploy:=20=D1=80=D0=B5=D1=81=D1=82=D0=B0=D1=80?= =?utf8?q?=D1=82=20yii-queue=20=D0=B2=D0=BE=D1=80=D0=BA=D0=B5=D1=80=D0=BE?= =?utf8?q?=D0=B2=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20reload=20php-fpm?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Воркеры yii queue/listen читают .env один раз при старте и кэшируют vendor/autoload в памяти. Без принудительного рестарта они продолжают работать с прежними токенами/кодом задач — и любое изменение в .env или коде джоб до них не доедет. Инцидент 2026-05-07: после ротации TELEGRAM_BOT_TOKEN_PROD в @BotFather воркеры с uptime 68 дней (last restart Feb27) продолжали слать с отозванным токеном, выдавая 401 Unauthorized — ERP молча терял все уведомления клиентам с 21.04 по 07.05. Дополнительно убиваются orphan-процессы yii queue/listen с PPID=1: такие появляются, если supervisor когда-то рестартовали без graceful stop детей — supervisorctl restart их НЕ трогает, а они продолжают слушать очередь со старым окружением. На erpp 2026-05-07 жили ровно 10 таких orphan'ов от Feb27 параллельно с новыми воркерами. Изменения: - erp24/scripts/server/activate-release.sh +31 - erp24/scripts/server/rollback.sh +20 - erp24/scripts/local/deploy-to-prod.sh +25 --- erp24/scripts/local/deploy-to-prod.sh | 25 +++++++++++++++++++ erp24/scripts/server/activate-release.sh | 31 ++++++++++++++++++++++++ erp24/scripts/server/rollback.sh | 20 +++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/erp24/scripts/local/deploy-to-prod.sh b/erp24/scripts/local/deploy-to-prod.sh index ad29b6b6..573f049c 100755 --- a/erp24/scripts/local/deploy-to-prod.sh +++ b/erp24/scripts/local/deploy-to-prod.sh @@ -209,6 +209,31 @@ ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" " fi " || log_warn "Не удалось перезагрузить PHP-FPM (возможно нужен sudo)" +# ===== ШАГ 7.1: Перезапуск yii queue/listen воркеров ===== +# Воркеры читают .env при старте и кэшируют autoload — без рестарта +# изменения в коде/конфиге до них не доедут. См. инцидент 2026-05-07 +# (отозванный TELEGRAM_BOT_TOKEN_PROD держался в памяти 68 дней). +log_info "" +log_info "Перезапуск yii-queue воркеров..." +ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" " + if command -v supervisorctl &> /dev/null && sudo supervisorctl status yii-queue: > /dev/null 2>&1; then + sudo supervisorctl restart yii-queue: > /dev/null + # Orphan'ы (PPID=1) — supervisorctl их не трогает, нужен прямой kill + sleep 1 + ORPHANS=\$(ps -eo pid=,ppid=,etimes=,args= \ + | awk '\$2 == 1 && \$4 ~ /yii\$/ && \$5 == \"queue/listen\" && \$3 > 60 { print \$1 }') + if [ -n \"\$ORPHANS\" ]; then + echo \"Убиваем orphan queue/listen (PPID=1): \$(echo \$ORPHANS | tr '\n' ' ')\" + echo \"\$ORPHANS\" | xargs -r sudo kill 2>/dev/null || true + sleep 2 + STILL=\$(ps -eo pid=,ppid=,args= \ + | awk '\$2 == 1 && \$4 ~ /yii\$/ && \$5 == \"queue/listen\" { print \$1 }') + [ -n \"\$STILL\" ] && echo \"\$STILL\" | xargs -r sudo kill -9 2>/dev/null || true + fi + echo 'yii-queue воркеры перезапущены' + fi +" || log_warn "Не удалось перезапустить yii-queue (нужны права sudo для supervisorctl)" + # ===== ШАГ 8: Миграции ===== echo "" read -p "Запустить миграции? (y/n): " -n 1 -r diff --git a/erp24/scripts/server/activate-release.sh b/erp24/scripts/server/activate-release.sh index 9aba920c..02bd4054 100755 --- a/erp24/scripts/server/activate-release.sh +++ b/erp24/scripts/server/activate-release.sh @@ -84,6 +84,37 @@ if command -v systemctl &> /dev/null; then fi fi +# Перезапуск yii queue/listen воркеров. +# .env читается воркером один раз при старте процесса; vendor/autoload +# тоже закэширован в памяти. Без рестарта воркеры продолжат работать +# с прежним токеном/кодом, и любое изменение в .env или коде задач до +# них не доедет. Инцидент 2026-05-07: после ротации +# TELEGRAM_BOT_TOKEN_PROD воркеры с uptime 68 дней продолжали слать с +# отозванным токеном, выдавая 401 Unauthorized. +if command -v supervisorctl &> /dev/null && supervisorctl status yii-queue: > /dev/null 2>&1; then + echo "Перезапуск yii-queue воркеров..." + supervisorctl restart yii-queue: > /dev/null + # Orphan-воркеры (PPID=1) — supervisorctl restart их НЕ трогает. + # Возникают, если supervisor когда-то перезапускали без остановки + # детей (или дети пережили краш родителя). Они держат старое + # окружение в памяти и параллельно с новыми воркерами потребляют + # из очереди. На erpp 2026-05-07 жили 10 таких orphan'ов с Feb27. + sleep 1 + ORPHANS=$(ps -eo pid=,ppid=,etimes=,args= \ + | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" && $3 > 60 { print $1 }') + if [ -n "$ORPHANS" ]; then + echo "Найдены orphan queue/listen (PPID=1, etime>60s): $(echo $ORPHANS | tr '\n' ' ')" + echo "$ORPHANS" | xargs -r kill 2>/dev/null || true + sleep 2 + STILL=$(ps -eo pid=,ppid=,args= \ + | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" { print $1 }') + if [ -n "$STILL" ]; then + echo "$STILL" | xargs -r kill -9 2>/dev/null || true + fi + fi + echo -e "${GREEN}✓ yii-queue воркеры перезапущены${NC}" +fi + echo "" echo "Проверьте работу сайта!" echo "При проблемах выполните откат: ./rollback.sh" diff --git a/erp24/scripts/server/rollback.sh b/erp24/scripts/server/rollback.sh index 4271b549..704d247c 100755 --- a/erp24/scripts/server/rollback.sh +++ b/erp24/scripts/server/rollback.sh @@ -88,5 +88,25 @@ if command -v systemctl &> /dev/null; then fi fi +# Перезапуск yii queue/listen воркеров. +# При rollback'е воркеры тоже должны быть рестартанутыми, иначе они +# останутся с кодом/.env «нового» релиза в памяти, а сайт будет +# использовать старый — рассинхрон. См. activate-release.sh для +# подробностей про orphan'ы и инцидент 2026-05-07. +if command -v supervisorctl &> /dev/null && supervisorctl status yii-queue: > /dev/null 2>&1; then + supervisorctl restart yii-queue: > /dev/null + sleep 1 + ORPHANS=$(ps -eo pid=,ppid=,etimes=,args= \ + | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" && $3 > 60 { print $1 }') + if [ -n "$ORPHANS" ]; then + echo "$ORPHANS" | xargs -r kill 2>/dev/null || true + sleep 2 + STILL=$(ps -eo pid=,ppid=,args= \ + | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" { print $1 }') + [ -n "$STILL" ] && echo "$STILL" | xargs -r kill -9 2>/dev/null || true + fi + echo -e "${GREEN}✓ yii-queue воркеры перезапущены${NC}" +fi + echo "" echo "Проверьте работу сайта!" -- 2.39.5