Files
TG_autoposter/docs/DOCKER_CELERY.md
2025-12-18 05:55:32 +09:00

423 lines
12 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.

# 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/)