# 邮箱系统部署指南 本文档提供在生产环境中部署邮箱系统的详细步骤。 ## 系统要求 - Python 3.7+ - 公网IP地址 - 已配置MX记录的域名 - 开放的25端口(SMTP)和5000端口(API) ## 1. 服务器准备 ### 1.1 安装基础软件包 ```bash # 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 配置防火墙 ```bash # 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 获取代码 ```bash git clone /opt/email-system cd /opt/email-system ``` ### 2.2 创建虚拟环境并安装依赖 ```bash python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt ``` ### 2.3 配置系统 创建环境变量文件: ```bash 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`以适应生产环境: ```bash cat > local_settings.py << EOF """ 生产环境配置文件 """ # SMTP服务器配置 SMTP_HOST = '0.0.0.0' # 监听所有网络接口 SMTP_PORT = 25 # 使用标准SMTP端口 # 日志配置 LOG_LEVEL = 'INFO' EOF ``` ### 2.4 初始化数据库 ```bash mkdir -p db email_data logs python -c "from app.models import init_db; init_db()" ``` ## 3. 启动服务 ### 3.1 直接启动(测试用) ```bash python run.py --host 0.0.0.0 --port 5000 --smtp-port 25 ``` ### 3.2 使用Systemd服务(推荐用于生产) 创建服务文件: ```bash 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 ``` 启动服务: ```bash sudo systemctl daemon-reload sudo systemctl enable email-system sudo systemctl start email-system ``` ## 4. 验证部署 ### 4.1 检查服务状态 ```bash sudo systemctl status email-system netstat -tulpn | grep -E ':(25|5000)' curl http://localhost:5000/api/status ``` ### 4.2 检查日志 ```bash 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: ```bash # 安装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作为反向代理: ```bash # 安装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 备份 ```bash # 创建备份脚本 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 恢复 ```bash # 恢复数据 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 ```