xianyufaka/entrypoint.sh
2026-04-15 22:56:44 +08:00

170 lines
5.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
echo "========================================"
echo " 闲鱼自动回复系统 - 启动中..."
echo "========================================"
# 显示环境信息
echo "环境信息:"
echo " - Python版本: $(python --version)"
echo " - 工作目录: $(pwd)"
echo " - 时区: ${TZ:-未设置}"
echo " - 数据库路径: ${DB_PATH:-/app/data/xianyu_data.db}"
echo " - 日志级别: ${LOG_LEVEL:-INFO}"
# 禁用 core dumps 防止生成 core 文件
ulimit -c 0
echo "✓ 已禁用 core dumps"
# 创建必要的目录
echo "创建必要的目录..."
mkdir -p /app/data /app/logs /app/backups /app/static/uploads/images
mkdir -p /app/trajectory_history
echo "✓ 目录创建完成"
# 设置目录权限
echo "设置目录权限..."
chmod 777 /app/data /app/logs /app/backups /app/static/uploads /app/static/uploads/images
chmod 777 /app/trajectory_history 2>/dev/null || true
echo "✓ 权限设置完成"
# 检查关键文件
echo "检查关键文件..."
if [ ! -f "/app/global_config.yml" ]; then
echo "⚠ 警告: 全局配置文件不存在,将使用默认配置"
fi
if [ ! -f "/app/Start.py" ]; then
echo "✗ 错误: Start.py 文件不存在!"
exit 1
fi
echo "✓ 关键文件检查完成"
# 检查 Python 依赖
echo "检查 Python 依赖..."
python -c "import fastapi, uvicorn, loguru, websockets" 2>/dev/null || {
echo "⚠ 警告: 部分 Python 依赖可能未正确安装"
}
echo "✓ Python 依赖检查完成"
# 迁移数据库文件到data目录如果需要
echo "检查数据库文件位置..."
if [ -f "/app/xianyu_data.db" ] && [ ! -f "/app/data/xianyu_data.db" ]; then
echo "发现旧数据库文件迁移到data目录..."
mv /app/xianyu_data.db /app/data/xianyu_data.db
echo "✓ 主数据库已迁移"
elif [ -f "/app/xianyu_data.db" ] && [ -f "/app/data/xianyu_data.db" ]; then
echo "⚠ 检测到新旧数据库都存在使用data目录中的数据库"
echo " 旧文件: /app/xianyu_data.db"
echo " 新文件: /app/data/xianyu_data.db"
fi
if [ -f "/app/user_stats.db" ] && [ ! -f "/app/data/user_stats.db" ]; then
echo "迁移统计数据库到data目录..."
mv /app/user_stats.db /app/data/user_stats.db
echo "✓ 统计数据库已迁移"
fi
# 迁移备份文件
backup_count=$(ls /app/xianyu_data_backup_*.db 2>/dev/null | wc -l)
if [ "$backup_count" -gt 0 ]; then
echo "发现 $backup_count 个备份文件迁移到data目录..."
mv /app/xianyu_data_backup_*.db /app/data/ 2>/dev/null || true
echo "✓ 备份文件已迁移"
fi
echo "✓ 数据库文件位置检查完成"
# 启动虚拟显示(如果启用有头模式)
if [ "${USE_XVFB}" = "true" ] || [ "${ENABLE_HEADFUL}" = "true" ]; then
echo "========================================"
echo " 启动虚拟显示服务器Xvfb"
echo "========================================"
# 清理可能存在的旧锁文件和进程
echo "检查并清理旧的 Xvfb 进程..."
# 查找并杀死旧的 Xvfb 进程
pkill -9 Xvfb 2>/dev/null || true
pkill -9 x11vnc 2>/dev/null || true
# 清理锁文件
rm -f /tmp/.X*-lock 2>/dev/null || true
rm -f /tmp/.X11-unix/X* 2>/dev/null || true
# 等待进程完全退出
sleep 1
# 尝试多个显示编号(从 99 开始)
DISPLAY_NUM=99
MAX_ATTEMPTS=10
XVFB_STARTED=false
for i in $(seq 0 $MAX_ATTEMPTS); do
DISPLAY_NUM=$((99 + i))
echo "尝试启动 Xvfb :$DISPLAY_NUM ..."
# 尝试启动 Xvfb
Xvfb :$DISPLAY_NUM -screen 0 1920x1080x24 -ac +extension GLX +render -noreset > /tmp/xvfb.log 2>&1 &
XVFB_PID=$!
# 等待启动
sleep 2
# 检查是否启动成功
if ps -p $XVFB_PID > /dev/null 2>&1; then
export DISPLAY=:$DISPLAY_NUM
XVFB_STARTED=true
echo "✓ Xvfb 启动成功 (PID: $XVFB_PID, DISPLAY: $DISPLAY)"
break
else
echo " 显示 :$DISPLAY_NUM 启动失败,尝试下一个..."
# 清理这次尝试的锁文件
rm -f /tmp/.X${DISPLAY_NUM}-lock 2>/dev/null || true
fi
done
if [ "$XVFB_STARTED" = "true" ]; then
# 可选:启动 VNC 服务器用于远程查看(如果需要)
if [ "${ENABLE_VNC}" = "true" ]; then
echo "启动 VNC 服务器..."
x11vnc -display $DISPLAY -forever -shared -rfbport 5900 -nopw > /tmp/x11vnc.log 2>&1 &
VNC_PID=$!
sleep 1
if ps -p $VNC_PID > /dev/null 2>&1; then
echo "✓ VNC 服务器启动成功 (PID: $VNC_PID, 端口: 5900)"
echo " 可以通过 VNC 客户端连接到 <容器IP>:5900 查看浏览器界面"
else
echo "⚠ VNC 服务器启动失败,查看日志: /tmp/x11vnc.log"
fi
fi
else
echo "⚠ Xvfb 启动失败(尝试了 $MAX_ATTEMPTS 次),将使用无头模式"
echo " 查看详细日志: /tmp/xvfb.log"
unset DISPLAY
fi
echo "========================================"
fi
# 显示启动信息
echo "========================================"
echo " 系统启动参数:"
echo " - API端口: ${API_PORT:-8090}"
echo " - API主机: ${API_HOST:-0.0.0.0}"
echo " - Debug模式: ${DEBUG:-false}"
echo " - 自动重载: ${RELOAD:-false}"
echo " - 虚拟显示: ${USE_XVFB:-false}"
echo " - VNC服务: ${ENABLE_VNC:-false}"
echo " - DISPLAY: ${DISPLAY:-未设置}"
echo "========================================"
# 启动应用
echo "正在启动应用..."
echo ""
# 使用 exec 替换当前 shell这样 Python 进程可以接收信号
exec python Start.py