260 lines
7.8 KiB
Bash
260 lines
7.8 KiB
Bash
#!/bin/bash
|
||
|
||
# MIP广告自动点击系统 - 生产环境启动脚本
|
||
# 适用于 Ubuntu/Debian 系统
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
echo "============================================================"
|
||
echo "MIP广告自动点击系统 - 生产环境启动"
|
||
echo "============================================================"
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 项目目录(脚本所在目录)
|
||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
cd "$PROJECT_DIR"
|
||
|
||
echo -e "${GREEN}项目目录: $PROJECT_DIR${NC}"
|
||
|
||
# 检查Python版本
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "检查Python环境"
|
||
echo "============================================================"
|
||
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo -e "${RED}错误: 未找到 python3${NC}"
|
||
echo "请安装Python 3.8+: sudo apt-get install python3 python3-pip python3-venv"
|
||
exit 1
|
||
fi
|
||
|
||
PYTHON_VERSION=$(python3 --version | awk '{print $2}')
|
||
echo -e "${GREEN}Python版本: $PYTHON_VERSION${NC}"
|
||
|
||
# 检查Python版本是否 >= 3.8
|
||
PYTHON_MAJOR=$(echo $PYTHON_VERSION | cut -d. -f1)
|
||
PYTHON_MINOR=$(echo $PYTHON_VERSION | cut -d. -f2)
|
||
|
||
if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 8 ]); then
|
||
echo -e "${RED}错误: Python版本过低,需要 3.8+${NC}"
|
||
echo "当前版本: $PYTHON_VERSION"
|
||
exit 1
|
||
fi
|
||
|
||
# 虚拟环境目录
|
||
VENV_DIR="$PROJECT_DIR/venv"
|
||
|
||
# 创建虚拟环境(如果不存在)
|
||
if [ ! -d "$VENV_DIR" ]; then
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "创建Python虚拟环境"
|
||
echo "============================================================"
|
||
|
||
# 检查是否安装了 venv 模块
|
||
if ! python3 -m venv --help &> /dev/null; then
|
||
echo -e "${YELLOW}警告: python3-venv 未安装,正在尝试安装...${NC}"
|
||
|
||
# 尝试安装(需要sudo权限)
|
||
if command -v apt-get &> /dev/null; then
|
||
sudo apt-get update
|
||
sudo apt-get install -y python3-venv
|
||
else
|
||
echo -e "${RED}错误: 无法自动安装 python3-venv${NC}"
|
||
echo "请手动执行: sudo apt-get install python3-venv"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo -e "${GREEN}正在创建虚拟环境...${NC}"
|
||
python3 -m venv "$VENV_DIR"
|
||
echo -e "${GREEN}✓ 虚拟环境创建成功${NC}"
|
||
else
|
||
echo ""
|
||
echo -e "${GREEN}✓ 虚拟环境已存在: $VENV_DIR${NC}"
|
||
fi
|
||
|
||
# 激活虚拟环境
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "激活虚拟环境"
|
||
echo "============================================================"
|
||
|
||
source "$VENV_DIR/bin/activate"
|
||
|
||
if [ "$VIRTUAL_ENV" != "" ]; then
|
||
echo -e "${GREEN}✓ 虚拟环境已激活: $VIRTUAL_ENV${NC}"
|
||
echo -e "${GREEN}Python路径: $(which python)${NC}"
|
||
else
|
||
echo -e "${RED}错误: 虚拟环境激活失败${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 升级pip
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "升级pip"
|
||
echo "============================================================"
|
||
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||
|
||
# 安装依赖
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "安装项目依赖"
|
||
echo "============================================================"
|
||
|
||
if [ -f "requirements.txt" ]; then
|
||
echo -e "${GREEN}从 requirements.txt 安装依赖...${NC}"
|
||
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||
else
|
||
echo -e "${YELLOW}警告: requirements.txt 不存在${NC}"
|
||
echo "手动安装核心依赖..."
|
||
pip install flask playwright requests loguru apscheduler python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||
|
||
# 安装Playwright浏览器
|
||
echo "安装Playwright浏览器驱动..."
|
||
playwright install chromium
|
||
fi
|
||
|
||
# 检查配置文件
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "检查配置文件"
|
||
echo "============================================================"
|
||
|
||
if [ ! -f ".env.production" ]; then
|
||
echo -e "${YELLOW}警告: .env.production 不存在${NC}"
|
||
|
||
if [ -f ".env.example" ]; then
|
||
echo "从 .env.example 创建配置文件..."
|
||
cp .env.example .env.production
|
||
echo -e "${GREEN}✓ 已创建 .env.production${NC}"
|
||
echo -e "${RED}请编辑 .env.production 配置文件后重新启动${NC}"
|
||
exit 1
|
||
else
|
||
echo -e "${RED}错误: 缺少配置文件模板${NC}"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo -e "${GREEN}✓ 配置文件存在: .env.production${NC}"
|
||
fi
|
||
|
||
# 初始化数据库
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "初始化数据库"
|
||
echo "============================================================"
|
||
|
||
if [ ! -f "db/ai_mip_prod.db" ]; then
|
||
echo -e "${YELLOW}数据库不存在,正在初始化...${NC}"
|
||
|
||
if [ -f "db/init_databases.py" ]; then
|
||
# 自动创建生产数据库(跳过交互)
|
||
python << EOF
|
||
from pathlib import Path
|
||
import sqlite3
|
||
|
||
db_dir = Path('db')
|
||
db_path = db_dir / 'ai_mip_prod.db'
|
||
|
||
if not db_path.exists():
|
||
print(f"创建数据库: {db_path}")
|
||
|
||
# 读取并执行SQL脚本
|
||
init_sql = db_dir / 'init_sqlite.sql'
|
||
if init_sql.exists():
|
||
with open(init_sql, 'r', encoding='utf-8') as f:
|
||
sql_script = f.read()
|
||
|
||
conn = sqlite3.connect(str(db_path))
|
||
conn.executescript(sql_script)
|
||
conn.commit()
|
||
conn.close()
|
||
print("✓ 数据库初始化完成")
|
||
else:
|
||
print("错误: 找不到 init_sqlite.sql")
|
||
exit(1)
|
||
EOF
|
||
echo -e "${GREEN}✓ 数据库初始化成功${NC}"
|
||
else
|
||
echo -e "${RED}错误: 找不到数据库初始化脚本${NC}"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo -e "${GREEN}✓ 数据库已存在: db/ai_mip_prod.db${NC}"
|
||
fi
|
||
|
||
# 创建必要的目录
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "创建必要目录"
|
||
echo "============================================================"
|
||
|
||
mkdir -p logs data
|
||
echo -e "${GREEN}✓ 目录创建完成${NC}"
|
||
|
||
# 检查AdsPower连接
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "检查AdsPower连接"
|
||
echo "============================================================"
|
||
|
||
python << EOF
|
||
import os
|
||
os.environ['ENV'] = 'production'
|
||
|
||
try:
|
||
from adspower_client import AdsPowerClient
|
||
client = AdsPowerClient()
|
||
profiles = client.list_profiles()
|
||
|
||
if profiles:
|
||
print("\033[0;32m✓ AdsPower连接正常\033[0m")
|
||
profile_count = len(profiles.get('data', {}).get('list', []))
|
||
print(f"\033[0;32m Profile数量: {profile_count}\033[0m")
|
||
else:
|
||
print("\033[1;33m警告: AdsPower连接失败,请检查配置\033[0m")
|
||
except Exception as e:
|
||
print(f"\033[1;33m警告: AdsPower连接异常: {str(e)}\033[0m")
|
||
print("\033[1;33m 请确保AdsPower客户端已启动\033[0m")
|
||
EOF
|
||
|
||
# 启动服务
|
||
echo ""
|
||
echo "============================================================"
|
||
echo "启动Flask服务"
|
||
echo "============================================================"
|
||
|
||
export ENV=production
|
||
|
||
# 检查端口是否被占用
|
||
PORT=5000
|
||
if command -v netstat &> /dev/null; then
|
||
if netstat -tuln | grep ":$PORT " > /dev/null; then
|
||
echo -e "${YELLOW}警告: 端口 $PORT 已被占用${NC}"
|
||
echo "尝试查找占用进程..."
|
||
lsof -i :$PORT || true
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${GREEN}启动服务中...${NC}"
|
||
echo "访问地址: http://127.0.0.1:5000"
|
||
echo "按 Ctrl+C 停止服务"
|
||
echo ""
|
||
|
||
# 使用nohup在后台运行(可选)
|
||
# nohup python app.py > logs/app.log 2>&1 &
|
||
# echo $! > app.pid
|
||
# echo -e "${GREEN}✓ 服务已启动(后台运行)${NC}"
|
||
# echo "PID: $(cat app.pid)"
|
||
# echo "日志: logs/app.log"
|
||
|
||
# 前台运行(便于调试)
|
||
python app.py
|