init commit

This commit is contained in:
2025-12-18 05:55:32 +09:00
commit a6817e487e
72 changed files with 13847 additions and 0 deletions

422
docs/DOCKER_CELERY.md Normal file
View File

@@ -0,0 +1,422 @@
# 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/)