init commit
This commit is contained in:
422
docs/DOCKER_CELERY.md
Normal file
422
docs/DOCKER_CELERY.md
Normal file
@@ -0,0 +1,422 @@
|
||||
# Docker & Celery - Справочник
|
||||
|
||||
## Обзор
|
||||
|
||||
Проект использует Docker для контейнеризации и Celery для асинхронной обработки задач:
|
||||
|
||||
- **Bot** - основной Telegram бот
|
||||
- **Celery Workers** - для отправки сообщений и парсинга групп
|
||||
- **Celery Beat** - планировщик для расписания рассылок
|
||||
- **PostgreSQL** - база данных
|
||||
- **Redis** - кэш и message broker для Celery
|
||||
- **Flower** - веб-интерфейс для мониторинга Celery
|
||||
|
||||
## Быстрый Старт
|
||||
|
||||
### 1. Подготовка
|
||||
|
||||
```bash
|
||||
# Клонировать репо
|
||||
git clone <repo-url>
|
||||
cd TG_autoposter
|
||||
|
||||
# Скопировать и отредактировать конфигурацию
|
||||
cp .env.example .env
|
||||
# Отредактируйте .env с реальными значениями
|
||||
```
|
||||
|
||||
### 2. Запуск
|
||||
|
||||
```bash
|
||||
# Сделать скрипт исполняемым
|
||||
chmod +x docker.sh
|
||||
|
||||
# Запустить контейнеры
|
||||
./docker.sh up
|
||||
|
||||
# Или напрямую Docker Compose
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 3. Проверка
|
||||
|
||||
```bash
|
||||
# Показать статус контейнеров
|
||||
./docker.sh ps
|
||||
|
||||
# Показать логи
|
||||
./docker.sh logs
|
||||
|
||||
# Открыть веб-интерфейс Flower
|
||||
# Перейти на http://localhost:5555
|
||||
```
|
||||
|
||||
## Команды docker.sh
|
||||
|
||||
```bash
|
||||
./docker.sh up # Запустить контейнеры
|
||||
./docker.sh down # Остановить контейнеры
|
||||
./docker.sh build # Пересобрать образы
|
||||
./docker.sh logs [service] # Показать логи
|
||||
./docker.sh shell [service] # Подключиться к контейнеру
|
||||
./docker.sh ps # Показать статус
|
||||
./docker.sh restart [svc] # Перезагрузить сервис
|
||||
./docker.sh clean # Удалить контейнеры и volumes
|
||||
./docker.sh db-init # Инициализировать БД
|
||||
./docker.sh celery-status # Статус Celery
|
||||
./docker.sh help # Справка
|
||||
```
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Docker Network │
|
||||
├──────────────┬──────────────┬──────────────┬────────────┤
|
||||
│ │ │ │ │
|
||||
│ PostgreSQL │ Redis │ Flower │ Bot │
|
||||
│ (БД) │ (Cache & │ (Monitor) │ (Polling) │
|
||||
│ │ Broker) │ :5555 │ │
|
||||
│ │ │ │ │
|
||||
├──────────────┴──────────────┴──────────────┴────────────┤
|
||||
│ │
|
||||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||||
│ │ Celery │ │ Celery │ │ Celery │ │
|
||||
│ │ Worker │ │ Worker │ │ Beat │ │
|
||||
│ │ (Send) │ │ (Parse) │ │ (Schedule) │ │
|
||||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### .env Переменные
|
||||
|
||||
```env
|
||||
# Database
|
||||
DB_USER=autoposter
|
||||
DB_PASSWORD=secure_password
|
||||
DB_HOST=postgres # Использовать имя сервиса в docker-compose
|
||||
DB_PORT=5432
|
||||
DB_NAME=autoposter_db
|
||||
|
||||
# Redis
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
REDIS_DB=0
|
||||
# REDIS_PASSWORD=if_needed
|
||||
|
||||
# Telegram
|
||||
TELEGRAM_BOT_TOKEN=your_bot_token
|
||||
|
||||
# Telethon (опционально)
|
||||
USE_TELETHON=false
|
||||
TELETHON_API_ID=...
|
||||
TELETHON_API_HASH=...
|
||||
TELETHON_PHONE=+7...
|
||||
```
|
||||
|
||||
### docker-compose.yml
|
||||
|
||||
Сервисы:
|
||||
|
||||
| Сервис | Порт | Описание |
|
||||
|---|---|---|
|
||||
| postgres | 5432 | PostgreSQL БД |
|
||||
| redis | 6379 | Redis cache & broker |
|
||||
| bot | 8000 | Главный бот |
|
||||
| celery_worker_send | - | Worker для отправки |
|
||||
| celery_worker_parse | - | Worker для парсинга |
|
||||
| celery_worker_maintenance | - | Worker для обслуживания |
|
||||
| celery_beat | - | Планировщик |
|
||||
| flower | 5555 | Веб-мониторинг |
|
||||
|
||||
## Celery & Планировщик
|
||||
|
||||
### Задачи (Tasks)
|
||||
|
||||
```python
|
||||
from app.celery_tasks import (
|
||||
send_message_task,
|
||||
parse_group_members_task,
|
||||
broadcast_message_task,
|
||||
cleanup_old_messages_task
|
||||
)
|
||||
|
||||
# Отправить сообщение асинхронно
|
||||
result = send_message_task.delay(
|
||||
message_id=1,
|
||||
group_id=10,
|
||||
chat_id="-1001234567890",
|
||||
message_text="Hello"
|
||||
)
|
||||
```
|
||||
|
||||
### Расписание (Schedule)
|
||||
|
||||
```python
|
||||
from app.scheduler import schedule_broadcast
|
||||
|
||||
# Добавить расписание рассылки
|
||||
job_id = await schedule_broadcast(
|
||||
message_id=1,
|
||||
group_ids=[10, 20, 30],
|
||||
cron_expr='0 9 * * *' # Ежедневно в 9:00 UTC
|
||||
)
|
||||
|
||||
# Отменить расписание
|
||||
await cancel_broadcast(job_id)
|
||||
|
||||
# Список всех расписаний
|
||||
schedules = await list_broadcasts()
|
||||
```
|
||||
|
||||
### Cron Выражения
|
||||
|
||||
```
|
||||
Формат: minute hour day month day_of_week
|
||||
|
||||
Примеры:
|
||||
0 9 * * * - ежедневно в 9:00 UTC
|
||||
0 9 * * MON - по понедельникам в 9:00
|
||||
0 */6 * * * - каждые 6 часов
|
||||
0 9,14,18 * * * - в 9:00, 14:00, 18:00 UTC
|
||||
*/30 * * * * - каждые 30 минут
|
||||
0 0 * * * - ежедневно в полночь UTC
|
||||
0 0 1 * * - первого числа месяца
|
||||
0 0 * * 0 - по воскресеньям
|
||||
```
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Flower (Веб-интерфейс)
|
||||
|
||||
Откройте http://localhost:5555 для просмотра:
|
||||
- Active tasks - активные задачи
|
||||
- Scheduled tasks - запланированные задачи
|
||||
- Worker status - статус рабочих
|
||||
- Task history - история выполнения
|
||||
|
||||
### Логи
|
||||
|
||||
```bash
|
||||
# Все логи
|
||||
./docker.sh logs
|
||||
|
||||
# Логи конкретного сервиса
|
||||
./docker.sh logs bot
|
||||
./docker.sh logs celery_worker_send
|
||||
|
||||
# Следить в реальном времени
|
||||
docker-compose logs -f bot
|
||||
```
|
||||
|
||||
### CLI Команды Celery
|
||||
|
||||
```bash
|
||||
# Запущенные задачи
|
||||
docker-compose exec bot celery -A app.celery_config inspect active
|
||||
|
||||
# Зарегистрированные задачи
|
||||
docker-compose exec bot celery -A app.celery_config inspect registered
|
||||
|
||||
# Статистика worker'ов
|
||||
docker-compose exec bot celery -A app.celery_config inspect stats
|
||||
|
||||
# Очистить выполненные задачи
|
||||
docker-compose exec redis redis-cli FLUSHDB
|
||||
```
|
||||
|
||||
## Примеры Использования
|
||||
|
||||
### Отправить сообщение в несколько групп
|
||||
|
||||
```python
|
||||
from app.celery_tasks import broadcast_message_task
|
||||
|
||||
# Асинхронно отправить сообщение в список групп
|
||||
result = broadcast_message_task.delay(
|
||||
message_id=1, # ID сообщения в БД
|
||||
group_ids=[10, 20, 30] # Список ID групп
|
||||
)
|
||||
|
||||
# Получить результат (опционально, может ждать)
|
||||
# print(result.get(timeout=300))
|
||||
```
|
||||
|
||||
### Расписать рассылку на определенное время
|
||||
|
||||
```python
|
||||
from app.scheduler import schedule_broadcast
|
||||
|
||||
# Рассылать каждый день в 9:00 UTC
|
||||
job_id = await schedule_broadcast(
|
||||
message_id=1,
|
||||
group_ids=[10, 20, 30],
|
||||
cron_expr='0 9 * * *'
|
||||
)
|
||||
|
||||
print(f"Расписание создано: {job_id}")
|
||||
```
|
||||
|
||||
### Парсить участников группы
|
||||
|
||||
```python
|
||||
from app.celery_tasks import parse_group_members_task
|
||||
|
||||
# Асинхронно загрузить участников
|
||||
result = parse_group_members_task.delay(
|
||||
group_id=10,
|
||||
chat_id="-1001234567890",
|
||||
limit=1000
|
||||
)
|
||||
```
|
||||
|
||||
### Очистить старые сообщения
|
||||
|
||||
```python
|
||||
from app.celery_tasks import cleanup_old_messages_task
|
||||
|
||||
# Удалить сообщения старше 30 дней (выполнится автоматически)
|
||||
result = cleanup_old_messages_task.delay(days=30)
|
||||
```
|
||||
|
||||
## Устранение Проблем
|
||||
|
||||
### PostgreSQL не подключается
|
||||
|
||||
```bash
|
||||
# Проверить статус
|
||||
./docker.sh ps
|
||||
|
||||
# Проверить логи PostgreSQL
|
||||
./docker.sh logs postgres
|
||||
|
||||
# Убедиться, что переменные .env правильные
|
||||
cat .env | grep DB_
|
||||
```
|
||||
|
||||
### Redis не отвечает
|
||||
|
||||
```bash
|
||||
# Проверить Redis
|
||||
docker-compose exec redis redis-cli ping
|
||||
|
||||
# Очистить Redis
|
||||
docker-compose exec redis redis-cli FLUSHALL
|
||||
```
|
||||
|
||||
### Celery задачи не выполняются
|
||||
|
||||
```bash
|
||||
# Проверить рабочих
|
||||
docker-compose logs celery_worker_send
|
||||
|
||||
# Проверить очередь
|
||||
docker-compose exec bot celery -A app.celery_config inspect active
|
||||
|
||||
# Перезагрузить рабочих
|
||||
./docker.sh restart celery_worker_send
|
||||
./docker.sh restart celery_worker_parse
|
||||
```
|
||||
|
||||
### Бот не отвечает
|
||||
|
||||
```bash
|
||||
# Проверить логи бота
|
||||
./docker.sh logs bot
|
||||
|
||||
# Перезагрузить бота
|
||||
./docker.sh restart bot
|
||||
|
||||
# Проверить токен в .env
|
||||
grep TELEGRAM_BOT_TOKEN .env
|
||||
```
|
||||
|
||||
## Обновление и Развертывание
|
||||
|
||||
### Обновить код
|
||||
|
||||
```bash
|
||||
# Остановить контейнеры
|
||||
./docker.sh down
|
||||
|
||||
# Получить обновления
|
||||
git pull
|
||||
|
||||
# Пересобрать образы
|
||||
./docker.sh build
|
||||
|
||||
# Запустить снова
|
||||
./docker.sh up
|
||||
```
|
||||
|
||||
### Production Развертывание
|
||||
|
||||
1. **Используйте environment файлы**:
|
||||
```bash
|
||||
# .env.production
|
||||
cp .env.example .env.production
|
||||
# Отредактировать с production значениями
|
||||
```
|
||||
|
||||
2. **Используйте external volumes**:
|
||||
```yaml
|
||||
volumes:
|
||||
postgres_data:
|
||||
driver: local
|
||||
driver_opts:
|
||||
type: nfs
|
||||
o: addr=nfs-server,vers=4,soft,timeo=180,bg,tcp
|
||||
device: ":/export/postgres"
|
||||
```
|
||||
|
||||
3. **Настройте логирование**:
|
||||
```bash
|
||||
# Настроить логи для всех контейнеров
|
||||
docker-compose logs --tail=100 -f
|
||||
```
|
||||
|
||||
4. **Используйте reverse proxy** (Nginx):
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8000;
|
||||
}
|
||||
|
||||
location /flower {
|
||||
proxy_pass http://localhost:5555;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Полезные Команды
|
||||
|
||||
```bash
|
||||
# Создать резервную копию БД
|
||||
docker-compose exec postgres pg_dump -U autoposter autoposter_db > backup.sql
|
||||
|
||||
# Восстановить БД
|
||||
docker-compose exec -T postgres psql -U autoposter autoposter_db < backup.sql
|
||||
|
||||
# Масштабировать рабочих
|
||||
docker-compose up -d --scale celery_worker_send=3
|
||||
|
||||
# Просмотреть использование ресурсов
|
||||
docker stats
|
||||
|
||||
# Очистить неиспользуемые образы
|
||||
docker image prune -a
|
||||
```
|
||||
|
||||
## Документация
|
||||
|
||||
- [Docker Documentation](https://docs.docker.com/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/)
|
||||
- [Celery Documentation](https://docs.celeryproject.io/)
|
||||
- [APScheduler](https://apscheduler.readthedocs.io/)
|
||||
- [Flower Documentation](https://flower.readthedocs.io/)
|
||||
Reference in New Issue
Block a user