diff --git a/README.md b/README.md index a01ed4c..763e479 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,161 @@ sudo systemctl restart nginx - 邮件发送时间 - 收件人邮箱 +## Celery 定时发送邮件任务配置 + +### 1. 邮件配置设置 + +在系统配置页面设置完邮件信息后,还需要在 Django 项目的 settings.py 中添加基础邮件配置: + +```python +# 邮件基础配置 +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_PORT = 587 # 或根据你的 SMTP 服务器设置 +EMAIL_USE_TLS = True # 或根据你的 SMTP 服务器设置 +``` + +### 2. 启动 Celery Worker 和 Beat + +#### 开发环境 + +```bash +# 启动 Celery Worker +celery -A diary_family worker -l info + +# 启动 Celery Beat(用于定时任务调度) +celery -A diary_family beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler +``` + +#### 生产环境 + +建议使用 supervisor 管理 Celery 进程。创建两个 supervisor 配置文件: + +1. **celery_worker.conf** + ```ini + [program:celery_worker] + command=/path/to/venv/bin/celery -A diary_family worker -l info + directory=/path/to/diary-family + user=www-data + group=www-data + autostart=true + autorestart=true + stdout_logfile=/var/log/celery/worker.log + stderr_logfile=/var/log/celery/worker_error.log + ``` + +2. **celery_beat.conf** + ```ini + [program:celery_beat] + command=/path/to/venv/bin/celery -A diary_family beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler + directory=/path/to/diary-family + user=www-data + group=www-data + autostart=true + autorestart=true + stdout_logfile=/var/log/celery/beat.log + stderr_logfile=/var/log/celery/beat_error.log + ``` + +启动 supervisor 服务: +```bash +sudo supervisorctl reread +sudo supervisorctl update +sudo supervisorctl start celery_worker +sudo supervisorctl start celery_beat +``` + +### 3. 配置定时任务 + +系统使用 `django_celery_beat` 进行定时任务管理,支持两种方式配置: + +#### 方式一:通过 Django 管理后台(推荐) + +1. 登录 Django 管理后台(/houtai) +2. 找到 **Periodic tasks**(周期性任务) +3. 点击 **Add** 按钮添加新任务 +4. 配置任务: + - **Name**: 任务名称(如:每日报告发送) + - **Task (registered)**: 选择 `core.tasks.send_daily_report` + - **Interval**: 设置执行间隔(如:每天) + - **Enabled**: 勾选启用 +5. 点击 **Save** 保存 + +#### 方式二:通过代码配置 + +在 `core/tasks.py` 中添加定时任务配置: + +```python +from celery import shared_task +from django_celery_beat.models import PeriodicTask, IntervalSchedule + +# 创建或更新定时任务 +def setup_daily_report_task(): + # 创建每天执行的间隔 + schedule, created = IntervalSchedule.objects.get_or_create( + every=1, + period=IntervalSchedule.DAYS, + ) + + # 创建或更新定时任务 + task, created = PeriodicTask.objects.update_or_create( + name='Daily Report Task', + defaults={ + 'interval': schedule, + 'task': 'core.tasks.send_daily_report', + }, + ) + return task +``` + +然后在 Django 启动时调用此函数(如在 `core/apps.py` 中)。 + +### 4. 验证任务执行 + +- 查看 Celery 日志:`tail -f /var/log/celery/worker.log` +- 检查邮件是否正常发送 +- 在 Django 管理后台查看任务执行记录 + +### 5. 常见问题排查 + +1. **任务不执行** + - 检查 Celery worker 和 beat 是否正常运行 + - 检查 Redis 服务是否正常 + - 检查任务是否已启用 + - 检查系统时间是否正确 + +2. **邮件发送失败** + - 检查 SMTP 服务器配置是否正确 + - 检查邮箱账号密码是否正确 + - 检查收件人邮箱格式是否正确 + - 查看 Celery 日志中的错误信息 + +3. **任务执行延迟** + - 检查系统负载是否过高 + - 考虑增加 Celery worker 数量 + - 检查 Redis 性能 + +### 6. 生产环境优化建议 + +- 使用独立的 Redis 服务器 +- 配置合适的 worker 数量(建议:CPU 核心数 × 2) +- 定期清理 Celery 任务结果 +- 配置监控系统(如 Prometheus + Grafana) +- 启用 Celery 监控工具(如 Flower) + +## Celery 监控(可选) + +使用 Flower 监控 Celery 任务: + +```bash +# 安装 Flower +pip install flower + +# 启动 Flower +celery -A diary_family flower --port=5555 +``` + +访问 http://your-server:5555 查看任务监控界面。 + ## 注意事项 1. 定期备份数据库