diff --git a/deploy_update.sh b/deploy_update.sh index a6a0a4d..eed959b 100644 --- a/deploy_update.sh +++ b/deploy_update.sh @@ -17,13 +17,13 @@ echo -e "${BLUE}========================================${NC}" cd "$PROJECT_ROOT" || { echo -e "${RED}❌ 无法进入项目目录:$PROJECT_ROOT${NC}"; exit 1; } # 1. Git Pull(先重置 lock 文件,避免服务器环境差异导致冲突) -echo -e "${YELLOW}[1/7] 拉取代码...${NC}" +echo -e "${YELLOW}[1/8] 拉取代码...${NC}" git checkout -- composer.lock package-lock.json 2>/dev/null || true git fetch origin && git pull origin master if [ $? -ne 0 ]; then echo -e "${RED}❌ Git 失败${NC}"; exit 1; fi # 2. Composer Install (关键检查点) -echo -e "${YELLOW}[2/7] 安装依赖 (Composer)...${NC}" +echo -e "${YELLOW}[2/8] 安装依赖 (Composer)...${NC}" composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction COMPOSER_EXIT_CODE=$? @@ -68,14 +68,14 @@ if [ $? -ne 0 ]; then fi # 3. 前端构建 -echo -e "${YELLOW}[3/7] 前端构建 (npm run build)...${NC}" +echo -e "${YELLOW}[3/8] 前端构建 (npm run build)...${NC}" npm run build if [ $? -ne 0 ]; then echo -e "${RED}❌ npm run build 失败${NC}"; exit 1; fi echo -e "${GREEN}✅ 前端资源构建完成。${NC}" # 4. 数据库迁移 -echo -e "${YELLOW}[5/7] 数据库迁移...${NC}" +echo -e "${YELLOW}[4/8] 数据库迁移...${NC}" php artisan migrate --force # 5. 优化 @@ -87,8 +87,37 @@ php artisan optimize:clear && php artisan optimize && php artisan view:cache echo -e "${YELLOW}[6/8] 重启 Horizon...${NC}" php artisan horizon:terminate -# 7. 重载 PHP-FPM / opcache,避免 Web 进程继续使用旧的 autoload 缓存 -echo -e "${YELLOW}[7/8] 重载 PHP-FPM...${NC}" +# 7. 重启 Reverb,确保长驻 WebSocket 进程加载最新代码和配置 +echo -e "${YELLOW}[7/8] 重启 Reverb...${NC}" +REVERB_RESTARTED=0 + +# Laravel 官方推荐:部署后使用 reverb:restart 优雅重启长驻进程 +php artisan reverb:restart >/dev/null 2>&1 +if [ $? -eq 0 ]; then + REVERB_RESTARTED=1 + echo -e "${GREEN}✅ 已执行 php artisan reverb:restart。${NC}" +fi + +# 若线上通过 Supervisor 托管 reverb:start,继续尝试重启常见进程名 +if command -v supervisorctl >/dev/null 2>&1; then + SUPERVISOR_REVERB_TARGETS=$(supervisorctl status 2>/dev/null | awk '/reverb|broadcast|websocket/ {print $1}') + if [ -n "$SUPERVISOR_REVERB_TARGETS" ]; then + while IFS= read -r target; do + if [ -n "$target" ]; then + supervisorctl restart "$target" >/dev/null 2>&1 || true + REVERB_RESTARTED=1 + fi + done <<< "$SUPERVISOR_REVERB_TARGETS" + echo -e "${GREEN}✅ 已尝试重启 Supervisor 托管的 Reverb 相关进程。${NC}" + fi +fi + +if [ "$REVERB_RESTARTED" -eq 0 ]; then + echo -e "${YELLOW}⚠️ 未检测到可自动重启的 Reverb 进程,请手动确认 reverb:start / Supervisor 状态。${NC}" +fi + +# 8. 重载 PHP-FPM / opcache,避免 Web 进程继续使用旧的 autoload 缓存 +echo -e "${YELLOW}[8/8] 重载 PHP-FPM...${NC}" PHP_FPM_RELOADED=0 if command -v systemctl >/dev/null 2>&1; then for svc in php-fpm php-fpm-84 php-fpm-83 php-fpm-82 php84-php-fpm php83-php-fpm php82-php-fpm; do @@ -110,8 +139,8 @@ else echo -e "${YELLOW}⚠️ 未识别到 PHP-FPM 服务,请在面板中手动重启当前站点使用的 PHP。${NC}" fi -# 6. 权限 (针对宝塔或Nginx+FPM环境的修正) -echo -e "${YELLOW}[8/8] 修复权限...${NC}" +# 权限修正(针对宝塔或 Nginx + FPM 环境) +echo -e "${YELLOW}[后处理] 修复权限...${NC}" # 将所有文件所属权变更为 Web 运行用户(如 www),防止 root 权限导致框架日志或缓存写入失败 chown -R www:www . # 默认读写执行权限