423 lines
12 KiB
Markdown
423 lines
12 KiB
Markdown
# 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/)
|