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

12 KiB
Raw Permalink Blame History

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 Развертывание

  1. Используйте environment файлы:
# .env.production
cp .env.example .env.production
# Отредактировать с production значениями
  1. Используйте 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"
  1. Настройте логирование:
# Настроить логи для всех контейнеров
docker-compose logs --tail=100 -f
  1. Используйте 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

Документация