#!/bin/bash # # 邮箱系统生产环境部署和启动脚本 # 使用前请确保已经阅读DEPLOYMENT_GUIDE.md和DNS_CONFIGURATION.md文档 # # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' # 无颜色 # 显示标题 echo -e "${BLUE}=======================================================${NC}" echo -e "${BLUE} 邮箱系统生产环境部署脚本 ${NC}" echo -e "${BLUE}=======================================================${NC}" echo "" # 检查是否为root用户 if [ "$EUID" -ne 0 ]; then echo -e "${YELLOW}警告: 此脚本未以root用户运行,可能无法绑定25端口${NC}" read -p "是否继续? (y/n): " continue_without_root if [ "$continue_without_root" != "y" ]; then echo "退出部署" exit 1 fi fi # 检查Python版本 echo -e "${BLUE}[1/7]${NC} 检查Python版本..." if command -v python3 &>/dev/null; then python_version=$(python3 --version) echo -e "${GREEN}检测到 $python_version${NC}" # 检查Python版本是否符合要求 (>= 3.7) python_major=$(python3 -c "import sys; print(sys.version_info.major)") python_minor=$(python3 -c "import sys; print(sys.version_info.minor)") if [ "$python_major" -ge 3 ] && [ "$python_minor" -ge 7 ]; then echo -e "${GREEN}Python版本满足要求${NC}" else echo -e "${RED}错误: 需要Python 3.7或更高版本${NC}" exit 1 fi else echo -e "${RED}错误: 未找到Python 3${NC}" echo "请安装Python 3.7或更高版本" exit 1 fi # 检查必要的目录 echo -e "${BLUE}[2/7]${NC} 创建必要的目录..." mkdir -p logs email_data db echo -e "${GREEN}目录创建完成${NC}" # 检查依赖 echo -e "${BLUE}[3/7]${NC} 检查并安装依赖..." if [ -f "requirements.txt" ]; then pip3 install --no-cache-dir -r requirements.txt if [ $? -eq 0 ]; then echo -e "${GREEN}依赖安装成功${NC}" else echo -e "${RED}依赖安装失败${NC}" exit 1 fi else echo -e "${RED}错误: requirements.txt文件不存在${NC}" exit 1 fi # 设置配置文件 echo -e "${BLUE}[4/7]${NC} 配置系统..." # 创建.env文件 if [ ! -f ".env" ]; then echo "创建.env文件..." # 生成随机密钥 SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(16))') read -p "请输入邮件域名,多个域名用逗号分隔 (默认: example.com): " mail_domains mail_domains=${mail_domains:-example.com} cat > .env << EOF FLASK_ENV=production SECRET_KEY=${SECRET_KEY} MAIL_DOMAINS=${mail_domains} DATABASE_URL=sqlite:///db/email_system.db EOF echo -e "${GREEN}.env文件创建成功${NC}" else echo -e "${YELLOW}注意: .env文件已存在,跳过创建${NC}" fi # 设置生产环境配置 if [ -f "production_local_settings.py" ]; then if [ -f "local_settings.py" ]; then echo "备份现有local_settings.py..." mv local_settings.py local_settings.py.bak fi echo "复制生产环境配置..." cp production_local_settings.py local_settings.py echo -e "${GREEN}生产环境配置设置完成${NC}" else echo -e "${YELLOW}警告: production_local_settings.py不存在,无法设置生产环境配置${NC}" fi # 检查端口 echo -e "${BLUE}[5/7]${NC} 检查系统端口..." # 检查25端口 nc -z -w5 127.0.0.1 25 &>/dev/null if [ $? -eq 0 ]; then echo -e "${YELLOW}警告: 端口25已被占用${NC}" echo "要使用标准SMTP端口25,您需要停止现有服务或修改配置使用其他端口" read -p "是否使用备用端口3825? (y/n): " use_alt_port if [ "$use_alt_port" = "y" ]; then # 修改local_settings.py中的SMTP端口 sed -i 's/SMTP_PORT = 25/SMTP_PORT = 3825/g' local_settings.py echo -e "${GREEN}已修改配置使用端口3825${NC}" smtp_port=3825 else echo "请手动修改local_settings.py中的SMTP_PORT配置" smtp_port=25 fi else echo -e "${GREEN}端口25可用${NC}" smtp_port=25 fi # 检查5000端口 nc -z -w5 127.0.0.1 5000 &>/dev/null if [ $? -eq 0 ]; then echo -e "${YELLOW}警告: 端口5000已被占用${NC}" echo "请确保端口5000未被其他服务使用" read -p "是否使用备用端口5001? (y/n): " use_alt_api_port if [ "$use_alt_api_port" = "y" ]; then api_port=5001 else echo "继续使用端口5000,可能导致启动失败" api_port=5000 fi else echo -e "${GREEN}端口5000可用${NC}" api_port=5000 fi # 初始化数据库 echo -e "${BLUE}[6/7]${NC} 初始化数据库..." python3 -c "from app.models import init_db; init_db()" if [ $? -eq 0 ]; then echo -e "${GREEN}数据库初始化成功${NC}" else echo -e "${RED}数据库初始化失败${NC}" exit 1 fi # 创建systemd服务文件 echo -e "${BLUE}[7/7]${NC} 创建系统服务..." if [ "$EUID" -eq 0 ]; then # 获取当前工作目录的绝对路径 WORKING_DIR=$(pwd) cat > /etc/systemd/system/email-system.service << EOF [Unit] Description=Email System Service After=network.target [Service] User=root WorkingDirectory=${WORKING_DIR} ExecStart=$(which python3) run.py --host 0.0.0.0 --port ${api_port} --smtp-port ${smtp_port} Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable email-system echo -e "${GREEN}系统服务创建并启用成功${NC}" else echo -e "${YELLOW}注意: 未以root用户运行,跳过创建系统服务${NC}" echo "您可以使用以下命令手动创建系统服务:" echo "sudo bash -c 'cat > /etc/systemd/system/email-system.service << EOF" echo "[Unit]" echo "Description=Email System Service" echo "After=network.target" echo "" echo "[Service]" echo "User=root" echo "WorkingDirectory=$(pwd)" echo "ExecStart=$(which python3) run.py --host 0.0.0.0 --port ${api_port} --smtp-port ${smtp_port}" echo "Restart=always" echo "RestartSec=10" echo "" echo "[Install]" echo "WantedBy=multi-user.target" echo "EOF'" echo "sudo systemctl daemon-reload" echo "sudo systemctl enable email-system" fi # 部署总结 echo "" echo -e "${BLUE}=======================================================${NC}" echo -e "${BLUE} 部署完成 ${NC}" echo -e "${BLUE}=======================================================${NC}" echo "" echo -e "API服务端口: ${GREEN}${api_port}${NC}" echo -e "SMTP服务端口: ${GREEN}${smtp_port}${NC}" echo -e "工作目录: ${GREEN}$(pwd)${NC}" echo -e "日志文件: ${GREEN}$(pwd)/logs/email_system.log${NC}" echo "" # 启动服务 if [ "$EUID" -eq 0 ]; then echo -e "${BLUE}正在启动邮箱系统服务...${NC}" systemctl start email-system sleep 2 systemctl status email-system --no-pager echo "" echo -e "${GREEN}邮箱系统已启动并运行${NC}" echo "您可以使用以下命令管理服务:" echo " 查看状态: sudo systemctl status email-system" echo " 停止服务: sudo systemctl stop email-system" echo " 重启服务: sudo systemctl restart email-system" echo " 查看日志: sudo journalctl -u email-system -f" else echo -e "${YELLOW}服务未启动,您可以使用以下命令手动启动服务:${NC}" echo "sudo systemctl start email-system" echo "" echo "或者直接运行应用:" echo "python3 run.py --host 0.0.0.0 --port ${api_port} --smtp-port ${smtp_port}" fi echo "" echo -e "${BLUE}部署后检查事项:${NC}" echo "1. 确认您的DNS记录已正确配置 (请参考DNS_CONFIGURATION.md)" echo "2. 验证邮件接收功能 (执行 python3 test_smtp_server.py)" echo "3. 检查防火墙是否允许${api_port}和${smtp_port}端口的流量" echo "" echo -e "${GREEN}如有任何问题,请查看日志文件或联系系统管理员${NC}"