248 lines
7.8 KiB
Bash
248 lines
7.8 KiB
Bash
#!/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}" |