# Docker & Celery - Справочник ## Обзор Проект использует Docker для контейнеризации и Celery для асинхронной обработки задач: - **Bot** - основной Telegram бот - **Celery Workers** - для отправки сообщений и парсинга групп - **Celery Beat** - планировщик для расписания рассылок - **PostgreSQL** - база данных - **Redis** - кэш и message broker для Celery - **Flower** - веб-интерфейс для мониторинга Celery ## Быстрый Старт ### 1. Подготовка ```bash # Клонировать репо git clone 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/)