]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
deploy: рестарт yii-queue воркеров после reload php-fpm origin/feature_filippov_20260507_deploy_queue_restart
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 7 May 2026 14:46:15 +0000 (17:46 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 7 May 2026 14:46:15 +0000 (17:46 +0300)
Воркеры 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
erp24/scripts/server/activate-release.sh
erp24/scripts/server/rollback.sh

index ad29b6b612932cd668b498e1e604829c837ea439..573f049c14b274b75f8c1f58ae743586cb251664 100755 (executable)
@@ -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
index 9aba920cc619c33db723069d5f4580346ffec11c..02bd40549273f093601104c69427bfd0d1b29619 100755 (executable)
@@ -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"
index 4271b5495349530121c74851470a4003239240ee..704d247cc1e99dbed70033880d38a46dda8b6779 100755 (executable)
@@ -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 "Проверьте работу сайта!"