Files
emailsystem/deploy_production.sh
2025-02-25 19:50:00 +08:00

248 lines
7.8 KiB
Bash
Raw Permalink 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
#
# 邮箱系统生产环境部署和启动脚本
# 使用前请确保已经阅读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}"