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