12 KiB
12 KiB
Docker & Celery - Справочник
Обзор
Проект использует Docker для контейнеризации и Celery для асинхронной обработки задач:
- Bot - основной Telegram бот
- Celery Workers - для отправки сообщений и парсинга групп
- Celery Beat - планировщик для расписания рассылок
- PostgreSQL - база данных
- Redis - кэш и message broker для Celery
- Flower - веб-интерфейс для мониторинга Celery
Быстрый Старт
1. Подготовка
# Клонировать репо
git clone <repo-url>
cd TG_autoposter
# Скопировать и отредактировать конфигурацию
cp .env.example .env
# Отредактируйте .env с реальными значениями
2. Запуск
# Сделать скрипт исполняемым
chmod +x docker.sh
# Запустить контейнеры
./docker.sh up
# Или напрямую Docker Compose
docker-compose up -d
3. Проверка
# Показать статус контейнеров
./docker.sh ps
# Показать логи
./docker.sh logs
# Открыть веб-интерфейс Flower
# Перейти на http://localhost:5555
Команды docker.sh
./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 Переменные
# 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)
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)
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 - история выполнения
Логи
# Все логи
./docker.sh logs
# Логи конкретного сервиса
./docker.sh logs bot
./docker.sh logs celery_worker_send
# Следить в реальном времени
docker-compose logs -f bot
CLI Команды Celery
# Запущенные задачи
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
Примеры Использования
Отправить сообщение в несколько групп
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))
Расписать рассылку на определенное время
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}")
Парсить участников группы
from app.celery_tasks import parse_group_members_task
# Асинхронно загрузить участников
result = parse_group_members_task.delay(
group_id=10,
chat_id="-1001234567890",
limit=1000
)
Очистить старые сообщения
from app.celery_tasks import cleanup_old_messages_task
# Удалить сообщения старше 30 дней (выполнится автоматически)
result = cleanup_old_messages_task.delay(days=30)
Устранение Проблем
PostgreSQL не подключается
# Проверить статус
./docker.sh ps
# Проверить логи PostgreSQL
./docker.sh logs postgres
# Убедиться, что переменные .env правильные
cat .env | grep DB_
Redis не отвечает
# Проверить Redis
docker-compose exec redis redis-cli ping
# Очистить Redis
docker-compose exec redis redis-cli FLUSHALL
Celery задачи не выполняются
# Проверить рабочих
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
Бот не отвечает
# Проверить логи бота
./docker.sh logs bot
# Перезагрузить бота
./docker.sh restart bot
# Проверить токен в .env
grep TELEGRAM_BOT_TOKEN .env
Обновление и Развертывание
Обновить код
# Остановить контейнеры
./docker.sh down
# Получить обновления
git pull
# Пересобрать образы
./docker.sh build
# Запустить снова
./docker.sh up
Production Развертывание
- Используйте environment файлы:
# .env.production
cp .env.example .env.production
# Отредактировать с production значениями
- Используйте external volumes:
volumes:
postgres_data:
driver: local
driver_opts:
type: nfs
o: addr=nfs-server,vers=4,soft,timeo=180,bg,tcp
device: ":/export/postgres"
- Настройте логирование:
# Настроить логи для всех контейнеров
docker-compose logs --tail=100 -f
- Используйте reverse proxy (Nginx):
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8000;
}
location /flower {
proxy_pass http://localhost:5555;
}
}
Полезные Команды
# Создать резервную копию БД
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