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

283 lines
5.5 KiB
Markdown
Raw 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.

# 邮箱系统部署指南
本文档提供在生产环境中部署邮箱系统的详细步骤。
## 系统要求
- 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 <repository-url> /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
```