From 8c53b318da23960330e8625fdab0b1a6e3199dcd Mon Sep 17 00:00:00 2001 From: xucheng Date: Sun, 18 Jan 2026 18:58:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E9=9A=A7=E9=81=93?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E8=87=AA=E5=8A=A8=E9=87=8D=E5=90=AF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=AE=B9=E5=99=A8=E5=86=85?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E7=AE=A1=E7=90=86=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构隧道进程管理:将隧道启动从 entrypoint.sh 移至 docker-entrypoint.sh - 添加隧道自动重启机制:监控循环每5秒检查隧道进程状态,异常退出时自动重启 - 增强日志记录:隧道输出重定向至 /tmp/tunnel.log 便于问题排查 - 修复原始架构问题:解决 exec 替换进程导致后台隧道失去父进程监控的问题 - 优化清理逻辑:在信号处理和错误退出时正确清理隧道进程 --- docker-entrypoint.sh | 81 ++++++++++++++++++++++++++++++++++++++++++-- entrypoint.sh | 3 +- 2 files changed, 79 insertions(+), 5 deletions(-) mode change 100644 => 100755 docker-entrypoint.sh mode change 100644 => 100755 entrypoint.sh diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh old mode 100644 new mode 100755 index f7c4ffe..089e226 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,11 +1,35 @@ #!/bin/bash # ============================================================================= # FA3 Datafetch 容器启动脚本 -# 功能:启动后端 (FastAPI) 和前端 (Next.js),处理进程管理 +# 功能:启动后端 (FastAPI)、前端 (Next.js) 和隧道,处理进程管理 # ============================================================================= set -e +# 隧道重启函数 +restart_tunnel() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到隧道进程已停止,正在重启..." + if [ -n "$TUNNEL_PID" ]; then + kill "$TUNNEL_PID" 2>/dev/null || true + fi + + # 确保环境变量存在 + if [ -z "$SERVER_ADDRS" ] || [ -z "$SERVICE_ID" ] || [ -z "$LOCAL_PORT" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:隧道环境变量缺失,无法重启" + return 1 + fi + + # 启动隧道 + /usr/local/bin/portwardenc >/dev/null 2>&1 & + TUNNEL_PID=$! + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 隧道已重启,PID: $TUNNEL_PID" + + # 保存 PID 到文件,方便监控 + echo "$TUNNEL_PID" > /tmp/tunnel.pid 2>/dev/null || true + + return 0 +} + # 信号处理函数 cleanup() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] 收到停止信号,正在关闭服务..." @@ -15,8 +39,11 @@ cleanup() { if [ -n "$FRONTEND_PID" ]; then kill "$FRONTEND_PID" 2>/dev/null || true fi + if [ -n "$TUNNEL_PID" ]; then + kill "$TUNNEL_PID" 2>/dev/null || true + fi # 等待进程结束 - wait $BACKEND_PID $FRONTEND_PID 2>/dev/null || true + wait $BACKEND_PID $FRONTEND_PID $TUNNEL_PID 2>/dev/null || true echo "[$(date '+%Y-%m-%d %H:%M:%S')] 所有服务已停止" exit 0 } @@ -77,12 +104,46 @@ if ! kill -0 "$FRONTEND_PID" 2>/dev/null; then fi # ============================================================================= -# 3. 监控服务状态 +# 3. 启动隧道服务 +# ============================================================================= +echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动隧道服务..." + +# 检查隧道环境变量 +if [ -z "$SERVER_ADDRS" ] || [ -z "$SERVICE_ID" ] || [ -z "$LOCAL_PORT" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告:隧道环境变量缺失,隧道将不会启动" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 需要 SERVER_ADDRS, SERVICE_ID, LOCAL_PORT" + TUNNEL_PID="" +else + # 启动隧道(保留错误日志用于诊断) + /usr/local/bin/portwardenc >/tmp/tunnel.log 2>&1 & + TUNNEL_PID=$! + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 隧道PID: $TUNNEL_PID (日志: /tmp/tunnel.log)" + + # 保存 PID 到文件 + echo "$TUNNEL_PID" > /tmp/tunnel.pid 2>/dev/null || true + + # 等待隧道启动 + sleep 2 + + # 检查隧道是否启动成功 + if ! kill -0 "$TUNNEL_PID" 2>/dev/null; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告:隧道启动失败或已退出" + TUNNEL_PID="" + fi +fi + +# ============================================================================= +# 4. 监控服务状态 # ============================================================================= echo "[$(date '+%Y-%m-%d %H:%M:%S')] ============================================" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 所有服务启动成功!" echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 前端: http://localhost:3001 (通过隧道暴露)" echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 后端: http://localhost:8000 (仅容器内部)" +if [ -n "$TUNNEL_PID" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 隧道: PID $TUNNEL_PID (自动重启已启用)" +else + echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 隧道: 未运行 (请检查环境变量)" +fi echo "[$(date '+%Y-%m-%d %H:%M:%S')] ============================================" # 持续监控进程状态 @@ -91,6 +152,9 @@ while true; do if ! kill -0 "$BACKEND_PID" 2>/dev/null; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:后端进程已停止!" kill "$FRONTEND_PID" 2>/dev/null || true + if [ -n "$TUNNEL_PID" ]; then + kill "$TUNNEL_PID" 2>/dev/null || true + fi exit 1 fi @@ -98,8 +162,19 @@ while true; do if ! kill -0 "$FRONTEND_PID" 2>/dev/null; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:前端进程已停止!" kill "$BACKEND_PID" 2>/dev/null || true + if [ -n "$TUNNEL_PID" ]; then + kill "$TUNNEL_PID" 2>/dev/null || true + fi exit 1 fi + # 检查隧道(如果已启用) + if [ -n "$TUNNEL_PID" ]; then + if ! kill -0 "$TUNNEL_PID" 2>/dev/null; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告:隧道进程已停止,尝试自动重启..." + restart_tunnel + fi + fi + sleep 5 done diff --git a/entrypoint.sh b/entrypoint.sh old mode 100644 new mode 100755 index c542f09..44fd28e --- a/entrypoint.sh +++ b/entrypoint.sh @@ -141,8 +141,7 @@ export SERVER_ADDRS="$PW_SERVER_ADDRS" export SERVICE_ID="$PW_SERVICE_ID" export LOCAL_PORT="$PW_LOCAL_PORT" -echo "Starting Portwarden client in the background..." -/usr/local/bin/portwardenc & +# 注意:隧道进程现在由 docker-entrypoint.sh 管理,不再在这里启动 echo "Executing main container command: $@" exec "$@"