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

View File

@@ -0,0 +1,302 @@
# 🐳 Docker & Celery - Что Было Добавлено
## 📦 Новые Файлы
### Docker & Контейнеризация
1. **Dockerfile** - Конфигурация Docker образа для бота
2. **docker-compose.yml** - Оркестрация всех сервисов
3. **.dockerignore** - Файлы, исключаемые из Docker образа
4. **docker.sh** - Bash скрипт для управления контейнерами
5. **Makefile** - Make команды для удобства
### Celery & Планировщик
6. **app/celery_config.py** - Конфигурация Celery
7. **app/celery_tasks.py** - Определение асинхронных задач
8. **app/scheduler.py** - Планировщик для расписаний
9. **app/handlers/schedule.py** - Обработчик команд расписания
### Документация
10. **docs/DOCKER_CELERY.md** - Полное руководство по Docker и Celery
11. **DOCKER_QUICKSTART.md** - Быстрый старт
## 🔄 Обновленные Файлы
1. **requirements.txt**
- ✅ Добавлены: celery, redis, croniter, APScheduler, alembic
2. **app/settings.py**
- ✅ Redis конфигурация (REDIS_HOST, REDIS_PORT, etc)
- ✅ Celery URLs для broker и backend
3. **.env.example**
- ✅ Redis переменные
- ✅ Комментарии для Docker
4. **app/__main__.py**
- ✅ Новый файл для запуска как модуля (`python -m app`)
## 🎯 Возможности
### Celery Задачи
```python
# Отправка сообщений асинхронно
send_message_task(message_id, group_id, chat_id, message_text)
# Парсинг участников группы
parse_group_members_task(group_id, chat_id, limit)
# Массовая рассылка
broadcast_message_task(message_id, group_ids)
# Очистка старых сообщений
cleanup_old_messages_task(days)
```
### Планировщик Рассылок
```
/schedule list - Показать расписания
/schedule add 1 10 "0 9 * * *" - Добавить расписание
/schedule remove <job_id> - Удалить расписание
```
### Мониторинг
- **Flower** на http://localhost:5555
- Реальное время выполнения задач
- Статус рабочих
- История выполнения
## 🚀 Быстрый Старт
### 1. Подготовка
```bash
cp .env.example .env
# Отредактировать .env
```
### 2. Запуск
```bash
# Способ 1: Через docker.sh
chmod +x docker.sh
./docker.sh up
# Способ 2: Через Makefile
make up
# Способ 3: Docker Compose напрямую
docker-compose up -d
```
### 3. Проверка
```bash
# Статус
docker-compose ps
# Логи
docker-compose logs -f
# Flower
open http://localhost:5555
```
## 📊 Архитектура
```
┌─────────────────────────────────────────┐
│ Docker Network (Bridge) │
├──────────────┬──────────────┬───────────┤
│ │ │ │
│ PostgreSQL │ Redis │ Flower │
│ :5432 │ :6379 │ :5555 │
│ │ │ │
├──────────────┴──────────────┴───────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────┐ │
│ │ Bot │ │ Celery │ │ Celery│ │
│ │ (Polling)│ │ Workers │ │ Beat │ │
│ └──────────┘ └──────────┘ └───────┘ │
│ │
└─────────────────────────────────────────┘
```
## 📝 Cron Выражения
```
Формат: minute hour day month day_of_week
Примеры:
0 9 * * * - ежедневно в 9:00 UTC
0 9 * * MON - по понедельникам в 9:00 UTC
0 */6 * * * - каждые 6 часов
0 9,14,18 * * * - в 9:00, 14:00, 18:00 UTC
*/30 * * * * - каждые 30 минут
0 0 * * * - в полночь UTC ежедневно
```
## 🛠️ Основные Команды
### Управление
```bash
./docker.sh up # Запустить
./docker.sh down # Остановить
./docker.sh build # Пересобрать
./docker.sh logs [service] # Логи
./docker.sh shell [service] # Bash в контейнере
./docker.sh ps # Статус
./docker.sh restart [svc] # Перезагрузить
./docker.sh clean # Удалить контейнеры
```
### Celery
```bash
# Активные задачи
docker-compose exec bot celery -A app.celery_config inspect active
# Статистика рабочих
docker-compose exec bot celery -A app.celery_config inspect stats
# Зарегистрированные задачи
docker-compose exec bot celery -A app.celery_config inspect registered
```
### База Данных
```bash
# Backup
docker-compose exec postgres pg_dump -U autoposter autoposter_db > backup.sql
# Restore
docker-compose exec -T postgres psql -U autoposter autoposter_db < backup.sql
```
## 🔧 Конфигурация .env
```env
# Database (PostgreSQL)
DB_USER=autoposter
DB_PASSWORD=secure_password
DB_HOST=postgres
DB_PORT=5432
DB_NAME=autoposter_db
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
# Telegram
TELEGRAM_BOT_TOKEN=your_token
# Telethon (опционально)
USE_TELETHON=false
TELETHON_API_ID=...
TELETHON_API_HASH=...
TELETHON_PHONE=+7...
```
## 📊 Сервисы
| Сервис | Порт | Описание |
|--------|------|---------|
| postgres | 5432 | PostgreSQL БД |
| redis | 6379 | Redis cache & broker |
| bot | 8000 | Главный Telegram бот |
| celery_worker_send | - | Worker для отправки |
| celery_worker_parse | - | Worker для парсинга |
| celery_worker_maintenance | - | Worker для обслуживания |
| celery_beat | - | Планировщик задач |
| flower | 5555 | Веб-интерфейс мониторинга |
## 🎓 Примеры
### Отправить сообщение в группу асинхронно
```python
from app.celery_tasks import send_message_task
task = send_message_task.delay(
message_id=1,
group_id=10,
chat_id="-1001234567890",
message_text="Hello!"
)
# Получить результат (опционально)
# result = task.get(timeout=30)
```
### Расписать рассылку
```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
)
```
### Отменить расписание
```python
from app.scheduler import cancel_broadcast
await cancel_broadcast(job_id)
```
## 🚨 Важные Замечания
### Безопасность
⚠️ **Никогда** не коммитьте .env с реальными данными!
```bash
# Добавить в .gitignore
echo ".env" >> .gitignore
echo "*.env" >> .gitignore
```
### Production
1. Используйте external volumes для БД
2. Настройте reverse proxy (Nginx)
3. Используйте SSL/TLS
4. Масштабируйте workers при необходимости
5. Мониторьте через Flower
## 📚 Документация
- [Полное руководство Docker & Celery](docs/DOCKER_CELERY.md)
- [Telethon справочник](docs/TELETHON.md)
- [Быстрый старт](DOCKER_QUICKSTART.md)
## 🔗 Полезные Ссылки
- [Docker Docs](https://docs.docker.com/)
- [Celery Docs](https://docs.celeryproject.io/)
- [APScheduler Docs](https://apscheduler.readthedocs.io/)
- [Flower Docs](https://flower.readthedocs.io/)
## ✅ Что Дальше?
1. ✅ Запустить docker-compose
2. ✅ Проверить Flower на :5555
3. ✅ Создать сообщение через /start
4. ✅ Расписать рассылку через /schedule
5. ✅ Мониторить в реальном времени
---
**Готово к использованию!** 🎉