5.5 KiB
5.5 KiB
邮箱系统部署指南
本文档提供在生产环境中部署邮箱系统的详细步骤。
系统要求
- 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 status或sudo 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