Files
emailsystem/DEPLOYMENT_GUIDE.md
2025-02-25 19:50:00 +08:00

5.5 KiB
Raw Permalink Blame History

邮箱系统部署指南

本文档提供在生产环境中部署邮箱系统的详细步骤。

系统要求

  • Python 3.7+
  • 公网IP地址
  • 已配置MX记录的域名
  • 开放的25端口SMTP和5000端口API

1. 服务器准备

1.1 安装基础软件包

# Ubuntu/Debian
sudo apt update
sudo apt install -y python3 python3-pip python3-venv git ufw

# CentOS/RHEL
sudo yum update -y
sudo yum install -y python3 python3-pip git

1.2 配置防火墙

# Ubuntu/Debian (ufw)
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 25/tcp    # SMTP
sudo ufw allow 5000/tcp  # API
sudo ufw enable

# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=25/tcp
sudo firewall-cmd --permanent --add-port=5000/tcp
sudo firewall-cmd --reload

2. 部署系统

2.1 获取代码

git clone <repository-url> /opt/email-system
cd /opt/email-system

2.2 创建虚拟环境并安装依赖

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

2.3 配置系统

创建环境变量文件:

cat > .env << EOF
FLASK_ENV=production
SECRET_KEY=$(python -c 'import secrets; print(secrets.token_hex(16))')
MAIL_DOMAINS=yourdomain.com,anotherdomain.com
DATABASE_URL=sqlite:///db/email_system.db
EOF

修改local_settings.py以适应生产环境:

cat > local_settings.py << EOF
"""
生产环境配置文件
"""
# SMTP服务器配置
SMTP_HOST = '0.0.0.0'  # 监听所有网络接口
SMTP_PORT = 25        # 使用标准SMTP端口

# 日志配置
LOG_LEVEL = 'INFO'
EOF

2.4 初始化数据库

mkdir -p db email_data logs
python -c "from app.models import init_db; init_db()"

3. 启动服务

3.1 直接启动(测试用)

python run.py --host 0.0.0.0 --port 5000 --smtp-port 25

3.2 使用Systemd服务推荐用于生产

创建服务文件:

sudo cat > /etc/systemd/system/email-system.service << EOF
[Unit]
Description=Email System
After=network.target

[Service]
User=root
WorkingDirectory=/opt/email-system
ExecStart=/opt/email-system/venv/bin/python run.py --host 0.0.0.0 --port 5000 --smtp-port 25
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

启动服务:

sudo systemctl daemon-reload
sudo systemctl enable email-system
sudo systemctl start email-system

4. 验证部署

4.1 检查服务状态

sudo systemctl status email-system
netstat -tulpn | grep -E ':(25|5000)'
curl http://localhost:5000/api/status

4.2 检查日志

tail -f logs/email_system.log

5. 故障排除

5.1 服务无法启动

  • 检查日志文件: cat logs/email_system.log
  • 确认端口未被占用: netstat -tulpn | grep -E ':(25|5000)'
  • 检查Python依赖: pip install -r requirements.txt

5.2 无法接收外部邮件

  • 验证MX记录配置: dig MX yourdomain.com
  • 检查25端口是否开放: telnet your-server-ip 25
  • 确认SMTP服务已启动: ps aux | grep smtp
  • 检查防火墙规则: sudo ufw statussudo firewall-cmd --list-all

5.3 常见ISP限制

许多ISP会阻止25端口的出站流量。如果遇到此问题:

  • 联系ISP要求解除25端口限制
  • 使用备用端口如587并在防火墙中转发到25端口
  • 考虑使用云服务提供商如AWS、GCP、阿里云等的VM实例

6. 性能优化

6.1 数据库优化

对于大规模部署考虑从SQLite迁移到PostgreSQL:

# 安装PostgreSQL
sudo apt install -y postgresql postgresql-contrib
# 创建数据库和用户
sudo -u postgres psql -c "CREATE USER email_system WITH PASSWORD 'your_password';"
sudo -u postgres psql -c "CREATE DATABASE email_system_db OWNER email_system;"

然后更新.env文件中的DATABASE_URL:

DATABASE_URL=postgresql://email_system:your_password@localhost/email_system_db

6.2 使用反向代理

对于生产环境建议使用Nginx作为反向代理:

# 安装Nginx
sudo apt install -y nginx

# 配置Nginx
sudo cat > /etc/nginx/sites-available/email-system << EOF
server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/email-system /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

7. 安全建议

  • 启用HTTPS (使用Let's Encrypt)
  • 限制API访问 (IP白名单、API密钥等)
  • 定期备份数据库
  • 监控系统资源使用情况
  • 实现基本的邮件过滤功能

8. 备份与恢复

8.1 备份

# 创建备份脚本
cat > backup.sh << EOF
#!/bin/bash
TIMESTAMP=\$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/opt/email-system/backups/\$TIMESTAMP

mkdir -p \$BACKUP_DIR

# 停止服务
systemctl stop email-system

# 备份数据库
cp db/email_system.db \$BACKUP_DIR/

# 备份邮件数据
cp -r email_data \$BACKUP_DIR/

# 备份配置
cp .env \$BACKUP_DIR/
cp local_settings.py \$BACKUP_DIR/

# 重启服务
systemctl start email-system

echo "备份完成: \$BACKUP_DIR"
EOF

chmod +x backup.sh

8.2 恢复

# 恢复数据
BACKUP_DIR=/opt/email-system/backups/20220101_120000

# 停止服务
systemctl stop email-system

# 恢复数据库
cp $BACKUP_DIR/email_system.db db/

# 恢复邮件数据
cp -r $BACKUP_DIR/email_data ./

# 恢复配置
cp $BACKUP_DIR/.env ./
cp $BACKUP_DIR/local_settings.py ./

# 重启服务
systemctl start email-system