初始化提交,包含完整的邮件系统代码

This commit is contained in:
huangzhenpc
2025-02-25 19:50:00 +08:00
commit aeffc4f8b8
52 changed files with 6673 additions and 0 deletions

248
deploy_production.sh Normal file
View File

@@ -0,0 +1,248 @@
#!/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}"