Настроил сеелери, начал привязку lyngsat

This commit is contained in:
2025-11-11 17:23:36 +03:00
parent 65e6c9a323
commit 4f21c9d7c8
110 changed files with 34270 additions and 33631 deletions

View File

@@ -1,396 +1,396 @@
# Сводка изменений: Асинхронная обработка данных Lyngsat
## Обзор
Реализована полная асинхронная обработка данных Lyngsat с использованием Celery, Redis и детальным логированием.
## Ключевые улучшения
### 1. ✅ Асинхронная обработка
- Задачи выполняются в фоновом режиме
- Веб-интерфейс не блокируется
- Можно обрабатывать несколько задач одновременно
### 2. ✅ Отслеживание прогресса
- Прогресс-бар в реальном времени
- Текущий статус обработки
- Процент выполнения
### 3. ✅ Детальное логирование
- Логи на уровне задачи
- Логи на уровне спутника
- Логи на уровне источника
- Все ошибки записываются в лог
### 4. ✅ Результаты и статистика
- Количество обработанных спутников
- Количество обработанных источников
- Количество созданных/обновленных записей
- Список всех ошибок
## Новые файлы
### Backend
1. **dbapp/dbapp/celery.py** - конфигурация Celery
2. **dbapp/dbapp/__init__.py** - инициализация Celery app
3. **dbapp/lyngsatapp/tasks.py** - асинхронная задача заполнения данных
4. **dbapp/start_celery_worker.sh** - скрипт запуска worker
### Frontend
5. **dbapp/mainapp/templates/mainapp/lyngsat_task_status.html** - страница отслеживания прогресса
### Документация
6. **ASYNC_LYNGSAT_GUIDE.md** - полное руководство
7. **QUICKSTART_ASYNC.md** - быстрый старт
8. **ASYNC_CHANGES_SUMMARY.md** - этот файл
## Измененные файлы
### Конфигурация
1. **dbapp/requirements.txt**
- Добавлено: `celery>=5.4.0`
- Добавлено: `django-celery-results>=2.5.1`
2. **dbapp/dbapp/settings/base.py**
- Добавлено: `django_celery_results` в INSTALLED_APPS
- Добавлено: полная конфигурация Celery (брокер, результаты, таймауты, логирование)
3. **docker-compose.yaml**
- Добавлено: сервис Redis
- Добавлено: сервис FlareSolver
- Добавлено: volume для Redis
### Backend логика
4. **dbapp/lyngsatapp/utils.py**
- Добавлено: параметр `task_id` для логирования
- Добавлено: параметр `update_progress` для обновления прогресса
- Добавлено: детальное логирование на всех уровнях
- Добавлено: логирование каждые 10 источников
- Улучшено: обработка ошибок с логированием
5. **dbapp/mainapp/views.py**
- Изменено: `FillLyngsatDataView` теперь запускает асинхронную задачу
- Добавлено: `LyngsatTaskStatusView` - страница отслеживания
- Добавлено: `LyngsatTaskStatusAPIView` - API для проверки статуса
6. **dbapp/mainapp/urls.py**
- Добавлено: `/lyngsat-task-status/` - страница статуса
- Добавлено: `/lyngsat-task-status/<task_id>/` - статус конкретной задачи
- Добавлено: `/api/lyngsat-task-status/<task_id>/` - API endpoint
## Технические детали
### Архитектура
```
User Request → Django View → Celery Task → Redis Broker
Celery Worker
┌───────────┴───────────┐
↓ ↓
LyngSat Parser PostgreSQL
↓ ↓
FlareSolver Save Results
```
### Поток данных
1. **Пользователь отправляет форму**
- Django view получает данные
- Создается асинхронная задача Celery
- Возвращается task_id
- Перенаправление на страницу статуса
2. **Celery Worker обрабатывает задачу**
- Логирует начало обработки
- Вызывает `fill_lyngsat_data` с callback
- Обновляет прогресс через `update_state`
- Логирует каждый шаг
- Сохраняет результат в кеш
3. **Страница статуса отслеживает прогресс**
- JavaScript опрашивает API каждые 2 секунды
- Обновляет прогресс-бар
- Показывает текущий статус
- Отображает результаты при завершении
### Логирование
#### Уровни логирования
- **INFO**: Основные события (начало, завершение, прогресс)
- **DEBUG**: Детальная информация (каждая запись)
- **WARNING**: Некритичные ошибки (спутник не найден)
- **ERROR**: Критичные ошибки (с traceback)
#### Формат логов
```
[Timestamp: Level/Process][Task Name(Task ID)] [Task ID] Message
```
Пример:
```
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Начало обработки данных Lyngsat
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Спутники: Astra 4A, Hotbird 13G
[2024-01-15 10:30:46: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Получено данных по 2 спутникам
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработка спутника 1/2: Astra 4A
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Найдено 150 источников для Astra 4A
[2024-01-15 10:31:05: DEBUG/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Создана запись для Astra 4A 11766.0 МГц
[2024-01-15 10:31:10: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработано 10/150 источников для Astra 4A
```
### API Endpoints
#### GET /api/lyngsat-task-status/<task_id>/
**Ответ при выполнении:**
```json
{
"task_id": "abc123",
"state": "PROGRESS",
"status": "Обработка Astra 4A...",
"current": 1,
"total": 2,
"percent": 50
}
```
**Ответ при успехе:**
```json
{
"task_id": "abc123",
"state": "SUCCESS",
"status": "Задача завершена успешно",
"result": {
"total_satellites": 2,
"total_sources": 300,
"created": 250,
"updated": 50,
"errors": []
}
}
```
**Ответ при ошибке:**
```json
{
"task_id": "abc123",
"state": "FAILURE",
"status": "Ошибка при выполнении задачи",
"error": "Connection timeout"
}
```
## Настройки Celery
### Основные параметры
```python
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60 # 30 минут
```
### Переменные окружения
Можно переопределить через `.env`:
```bash
CELERY_BROKER_URL=redis://redis:6379/0
```
## Зависимости
### Обязательные сервисы
1. **Redis** - брокер сообщений Celery
2. **FlareSolver** - обход Cloudflare
3. **PostgreSQL** - хранение данных и результатов
### Python пакеты
- `celery>=5.4.0` - асинхронная обработка
- `django-celery-results>=2.5.1` - хранение результатов
- `redis>=6.4.0` - клиент Redis
## Команды для работы
### Запуск сервисов
```bash
# Redis и FlareSolver
docker-compose up -d redis flaresolverr
# Celery Worker
celery -A dbapp worker --loglevel=info
# Celery Worker в фоне
celery -A dbapp worker --loglevel=info --logfile=logs/celery_worker.log --detach
```
### Мониторинг
```bash
# Просмотр логов
tail -f dbapp/logs/celery_worker.log
# Flower (веб-интерфейс)
pip install flower
celery -A dbapp flower
# Откройте http://localhost:5555
```
### Отладка
```bash
# Проверка Redis
redis-cli ping
# Проверка FlareSolver
curl http://localhost:8191/v1
# Django shell
python manage.py shell
>>> from celery.result import AsyncResult
>>> task = AsyncResult('task_id')
>>> print(task.state, task.info)
```
## Производственное развертывание
### Systemd сервис
```bash
sudo systemctl enable celery-worker
sudo systemctl start celery-worker
sudo systemctl status celery-worker
```
### Supervisor
```bash
sudo supervisorctl start celery-worker
sudo supervisorctl status celery-worker
```
### Docker
Можно добавить Celery worker в docker-compose.yaml:
```yaml
celery-worker:
build: ./dbapp
command: celery -A dbapp worker --loglevel=info
depends_on:
- redis
- db
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
```
## Тестирование
### Проверка системы
```bash
# 1. Проверка Django
python manage.py check
# 2. Проверка миграций
python manage.py migrate --check
# 3. Проверка Celery
celery -A dbapp inspect ping
# 4. Проверка Redis
redis-cli ping
# 5. Проверка FlareSolver
curl http://localhost:8191/v1
```
### Тестовый запуск
```python
# Django shell
python manage.py shell
from lyngsatapp.tasks import fill_lyngsat_data_task
# Запуск задачи
task = fill_lyngsat_data_task.delay(['Astra 4A'], ['europe'])
print(f"Task ID: {task.id}")
# Проверка статуса
print(task.state)
print(task.info)
```
## Метрики и мониторинг
### Что отслеживать
- Количество активных workers
- Количество задач в очереди
- Среднее время выполнения задачи
- Количество ошибок
- Использование памяти Redis
### Инструменты
- **Flower** - веб-интерфейс для Celery
- **Redis Commander** - GUI для Redis
- **Prometheus + Grafana** - метрики и дашборды
## Безопасность
### Рекомендации
1. Используйте пароль для Redis в production
2. Ограничьте доступ к Redis только для localhost
3. Используйте SSL для Redis в production
4. Ограничьте время выполнения задач
5. Логируйте все действия
### Пример конфигурации Redis с паролем
```python
CELERY_BROKER_URL = 'redis://:password@localhost:6379/0'
```
## Масштабирование
### Горизонтальное масштабирование
Запустите несколько workers:
```bash
# Worker 1
celery -A dbapp worker --loglevel=info -n worker1@%h
# Worker 2
celery -A dbapp worker --loglevel=info -n worker2@%h
# Worker 3
celery -A dbapp worker --loglevel=info -n worker3@%h
```
### Приоритеты задач
Можно настроить разные очереди для разных типов задач:
```python
@shared_task(queue='high_priority')
def urgent_task():
pass
@shared_task(queue='low_priority')
def background_task():
pass
```
## Следующие шаги
1. ✅ Применить миграции
2. ✅ Запустить Redis и FlareSolver
3. ✅ Запустить Celery Worker
4. ✅ Протестировать через веб-интерфейс
5. ⏳ Настроить production окружение
6. ⏳ Добавить периодические задачи (Celery Beat)
7. ⏳ Настроить email уведомления
8. ⏳ Настроить мониторинг (Flower)
## Заключение
Система асинхронной обработки данных Lyngsat обеспечивает:
- ✅ Неблокирующий веб-интерфейс
- ✅ Отслеживание прогресса в реальном времени
- ✅ Детальное логирование всех операций
- ✅ Масштабируемость (несколько workers)
- ✅ Надежность (retry при ошибках)
- ✅ Мониторинг и отладка
- ✅ Production-ready решение
Для получения дополнительной помощи:
- Полное руководство: `ASYNC_LYNGSAT_GUIDE.md`
- Быстрый старт: `QUICKSTART_ASYNC.md`
- Документация Celery: https://docs.celeryproject.org/
# Сводка изменений: Асинхронная обработка данных Lyngsat
## Обзор
Реализована полная асинхронная обработка данных Lyngsat с использованием Celery, Redis и детальным логированием.
## Ключевые улучшения
### 1. ✅ Асинхронная обработка
- Задачи выполняются в фоновом режиме
- Веб-интерфейс не блокируется
- Можно обрабатывать несколько задач одновременно
### 2. ✅ Отслеживание прогресса
- Прогресс-бар в реальном времени
- Текущий статус обработки
- Процент выполнения
### 3. ✅ Детальное логирование
- Логи на уровне задачи
- Логи на уровне спутника
- Логи на уровне источника
- Все ошибки записываются в лог
### 4. ✅ Результаты и статистика
- Количество обработанных спутников
- Количество обработанных источников
- Количество созданных/обновленных записей
- Список всех ошибок
## Новые файлы
### Backend
1. **dbapp/dbapp/celery.py** - конфигурация Celery
2. **dbapp/dbapp/__init__.py** - инициализация Celery app
3. **dbapp/lyngsatapp/tasks.py** - асинхронная задача заполнения данных
4. **dbapp/start_celery_worker.sh** - скрипт запуска worker
### Frontend
5. **dbapp/mainapp/templates/mainapp/lyngsat_task_status.html** - страница отслеживания прогресса
### Документация
6. **ASYNC_LYNGSAT_GUIDE.md** - полное руководство
7. **QUICKSTART_ASYNC.md** - быстрый старт
8. **ASYNC_CHANGES_SUMMARY.md** - этот файл
## Измененные файлы
### Конфигурация
1. **dbapp/requirements.txt**
- Добавлено: `celery>=5.4.0`
- Добавлено: `django-celery-results>=2.5.1`
2. **dbapp/dbapp/settings/base.py**
- Добавлено: `django_celery_results` в INSTALLED_APPS
- Добавлено: полная конфигурация Celery (брокер, результаты, таймауты, логирование)
3. **docker-compose.yaml**
- Добавлено: сервис Redis
- Добавлено: сервис FlareSolver
- Добавлено: volume для Redis
### Backend логика
4. **dbapp/lyngsatapp/utils.py**
- Добавлено: параметр `task_id` для логирования
- Добавлено: параметр `update_progress` для обновления прогресса
- Добавлено: детальное логирование на всех уровнях
- Добавлено: логирование каждые 10 источников
- Улучшено: обработка ошибок с логированием
5. **dbapp/mainapp/views.py**
- Изменено: `FillLyngsatDataView` теперь запускает асинхронную задачу
- Добавлено: `LyngsatTaskStatusView` - страница отслеживания
- Добавлено: `LyngsatTaskStatusAPIView` - API для проверки статуса
6. **dbapp/mainapp/urls.py**
- Добавлено: `/lyngsat-task-status/` - страница статуса
- Добавлено: `/lyngsat-task-status/<task_id>/` - статус конкретной задачи
- Добавлено: `/api/lyngsat-task-status/<task_id>/` - API endpoint
## Технические детали
### Архитектура
```
User Request → Django View → Celery Task → Redis Broker
Celery Worker
┌───────────┴───────────┐
↓ ↓
LyngSat Parser PostgreSQL
↓ ↓
FlareSolver Save Results
```
### Поток данных
1. **Пользователь отправляет форму**
- Django view получает данные
- Создается асинхронная задача Celery
- Возвращается task_id
- Перенаправление на страницу статуса
2. **Celery Worker обрабатывает задачу**
- Логирует начало обработки
- Вызывает `fill_lyngsat_data` с callback
- Обновляет прогресс через `update_state`
- Логирует каждый шаг
- Сохраняет результат в кеш
3. **Страница статуса отслеживает прогресс**
- JavaScript опрашивает API каждые 2 секунды
- Обновляет прогресс-бар
- Показывает текущий статус
- Отображает результаты при завершении
### Логирование
#### Уровни логирования
- **INFO**: Основные события (начало, завершение, прогресс)
- **DEBUG**: Детальная информация (каждая запись)
- **WARNING**: Некритичные ошибки (спутник не найден)
- **ERROR**: Критичные ошибки (с traceback)
#### Формат логов
```
[Timestamp: Level/Process][Task Name(Task ID)] [Task ID] Message
```
Пример:
```
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Начало обработки данных Lyngsat
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Спутники: Astra 4A, Hotbird 13G
[2024-01-15 10:30:46: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Получено данных по 2 спутникам
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработка спутника 1/2: Astra 4A
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Найдено 150 источников для Astra 4A
[2024-01-15 10:31:05: DEBUG/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Создана запись для Astra 4A 11766.0 МГц
[2024-01-15 10:31:10: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработано 10/150 источников для Astra 4A
```
### API Endpoints
#### GET /api/lyngsat-task-status/<task_id>/
**Ответ при выполнении:**
```json
{
"task_id": "abc123",
"state": "PROGRESS",
"status": "Обработка Astra 4A...",
"current": 1,
"total": 2,
"percent": 50
}
```
**Ответ при успехе:**
```json
{
"task_id": "abc123",
"state": "SUCCESS",
"status": "Задача завершена успешно",
"result": {
"total_satellites": 2,
"total_sources": 300,
"created": 250,
"updated": 50,
"errors": []
}
}
```
**Ответ при ошибке:**
```json
{
"task_id": "abc123",
"state": "FAILURE",
"status": "Ошибка при выполнении задачи",
"error": "Connection timeout"
}
```
## Настройки Celery
### Основные параметры
```python
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60 # 30 минут
```
### Переменные окружения
Можно переопределить через `.env`:
```bash
CELERY_BROKER_URL=redis://redis:6379/0
```
## Зависимости
### Обязательные сервисы
1. **Redis** - брокер сообщений Celery
2. **FlareSolver** - обход Cloudflare
3. **PostgreSQL** - хранение данных и результатов
### Python пакеты
- `celery>=5.4.0` - асинхронная обработка
- `django-celery-results>=2.5.1` - хранение результатов
- `redis>=6.4.0` - клиент Redis
## Команды для работы
### Запуск сервисов
```bash
# Redis и FlareSolver
docker-compose up -d redis flaresolverr
# Celery Worker
celery -A dbapp worker --loglevel=info
# Celery Worker в фоне
celery -A dbapp worker --loglevel=info --logfile=logs/celery_worker.log --detach
```
### Мониторинг
```bash
# Просмотр логов
tail -f dbapp/logs/celery_worker.log
# Flower (веб-интерфейс)
pip install flower
celery -A dbapp flower
# Откройте http://localhost:5555
```
### Отладка
```bash
# Проверка Redis
redis-cli ping
# Проверка FlareSolver
curl http://localhost:8191/v1
# Django shell
python manage.py shell
>>> from celery.result import AsyncResult
>>> task = AsyncResult('task_id')
>>> print(task.state, task.info)
```
## Производственное развертывание
### Systemd сервис
```bash
sudo systemctl enable celery-worker
sudo systemctl start celery-worker
sudo systemctl status celery-worker
```
### Supervisor
```bash
sudo supervisorctl start celery-worker
sudo supervisorctl status celery-worker
```
### Docker
Можно добавить Celery worker в docker-compose.yaml:
```yaml
celery-worker:
build: ./dbapp
command: celery -A dbapp worker --loglevel=info
depends_on:
- redis
- db
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
```
## Тестирование
### Проверка системы
```bash
# 1. Проверка Django
python manage.py check
# 2. Проверка миграций
python manage.py migrate --check
# 3. Проверка Celery
celery -A dbapp inspect ping
# 4. Проверка Redis
redis-cli ping
# 5. Проверка FlareSolver
curl http://localhost:8191/v1
```
### Тестовый запуск
```python
# Django shell
python manage.py shell
from lyngsatapp.tasks import fill_lyngsat_data_task
# Запуск задачи
task = fill_lyngsat_data_task.delay(['Astra 4A'], ['europe'])
print(f"Task ID: {task.id}")
# Проверка статуса
print(task.state)
print(task.info)
```
## Метрики и мониторинг
### Что отслеживать
- Количество активных workers
- Количество задач в очереди
- Среднее время выполнения задачи
- Количество ошибок
- Использование памяти Redis
### Инструменты
- **Flower** - веб-интерфейс для Celery
- **Redis Commander** - GUI для Redis
- **Prometheus + Grafana** - метрики и дашборды
## Безопасность
### Рекомендации
1. Используйте пароль для Redis в production
2. Ограничьте доступ к Redis только для localhost
3. Используйте SSL для Redis в production
4. Ограничьте время выполнения задач
5. Логируйте все действия
### Пример конфигурации Redis с паролем
```python
CELERY_BROKER_URL = 'redis://:password@localhost:6379/0'
```
## Масштабирование
### Горизонтальное масштабирование
Запустите несколько workers:
```bash
# Worker 1
celery -A dbapp worker --loglevel=info -n worker1@%h
# Worker 2
celery -A dbapp worker --loglevel=info -n worker2@%h
# Worker 3
celery -A dbapp worker --loglevel=info -n worker3@%h
```
### Приоритеты задач
Можно настроить разные очереди для разных типов задач:
```python
@shared_task(queue='high_priority')
def urgent_task():
pass
@shared_task(queue='low_priority')
def background_task():
pass
```
## Следующие шаги
1. ✅ Применить миграции
2. ✅ Запустить Redis и FlareSolver
3. ✅ Запустить Celery Worker
4. ✅ Протестировать через веб-интерфейс
5. ⏳ Настроить production окружение
6. ⏳ Добавить периодические задачи (Celery Beat)
7. ⏳ Настроить email уведомления
8. ⏳ Настроить мониторинг (Flower)
## Заключение
Система асинхронной обработки данных Lyngsat обеспечивает:
- ✅ Неблокирующий веб-интерфейс
- ✅ Отслеживание прогресса в реальном времени
- ✅ Детальное логирование всех операций
- ✅ Масштабируемость (несколько workers)
- ✅ Надежность (retry при ошибках)
- ✅ Мониторинг и отладка
- ✅ Production-ready решение
Для получения дополнительной помощи:
- Полное руководство: `ASYNC_LYNGSAT_GUIDE.md`
- Быстрый старт: `QUICKSTART_ASYNC.md`
- Документация Celery: https://docs.celeryproject.org/