uploader-bot/docs/MIGRATION_GUIDE.md

11 KiB
Raw Permalink Blame History

Руководство по миграции на асинхронную архитектуру с Redis

Это руководство поможет вам безопасно обновить существующую систему My Uploader Bot до новой асинхронной архитектуры с поддержкой Redis кэширования, сохранив полную совместимость с текущими данными и настройками.

⚠️ ВАЖНО: Резервное копирование

Перед началом миграции обязательно создайте резервные копии:

# Остановите существующие контейнеры
docker-compose down

# Создайте резервную копию базы данных
docker run --rm \
  -v my-uploader-bot_sqlStorage:/var/lib/mysql \
  -v $(pwd)/backup:/backup \
  mariadb:11.2 \
  mysqldump -h maria_db -u myuploader -p myuploader > /backup/database_backup_$(date +%Y%m%d_%H%M%S).sql

# Создайте резервную копию файлов
cp -r /Storage /Storage_backup_$(date +%Y%m%d_%H%M%S)

# Создайте резервную копию конфигурации
cp docker-compose.yml docker-compose.yml.backup
cp .env .env.backup

Шаг 1: Обновление конфигурационных файлов

1.1 Обновите docker-compose.yml

Замените ваш текущий docker-compose.yml на совместимую версию:

# Переименуйте существующий файл
mv docker-compose.yml docker-compose.yml.old

# Скопируйте новую совместимую версию
cp docker-compose.compatible.yml docker-compose.yml

1.2 Обновите .env файл

# Переименуйте существующий .env
mv .env .env.old

# Скопируйте новую совместимую версию
cp .env.compatible .env

# Перенесите ваши существующие настройки
# Отредактируйте .env и добавьте ваши текущие значения:
# - MYSQL_PASSWORD (ваш текущий пароль)
# - SECRET_KEY (ваш текущий ключ)
# - JWT_SECRET_KEY (ваш текущий JWT ключ)
# - Другие специфичные настройки

1.3 Обновите requirements.txt

# Переименуйте существующий файл
mv requirements.txt requirements.txt.old

# Скопируйте новую совместимую версию
cp requirements.compatible.txt requirements.txt

Шаг 2: Добавление новых модулей

2.1 Обновите core модули

Замените существующие модули на совместимые версии:

# Создайте резервные копии существующих модулей
mkdir -p app/core/backup
cp app/core/database.py app/core/backup/database.py.old
cp app/core/config.py app/core/backup/config.py.old

# Используйте новые совместимые модули
cp app/core/database_compatible.py app/core/database.py
cp app/core/config_compatible.py app/core/config.py

2.2 Добавьте систему кэширования

# Добавьте новый модуль кэширования
# Файл app/core/cache.py уже создан

# Добавьте совместимые модели
cp app/core/models/base_compatible.py app/core/models/base.py
cp app/core/models/user_compatible.py app/core/models/user.py
cp app/core/models/content_compatible.py app/core/models/content.py

Шаг 3: Постепенное обновление

3.1 Запуск с Redis (рекомендуется)

# Запустите только Redis для тестирования
docker-compose up -d redis

# Проверьте, что Redis работает
docker-compose exec redis redis-cli ping
# Должно вернуть: PONG

3.2 Запуск основных сервисов

# Запустите MariaDB
docker-compose up -d maria_db

# Дождитесь готовности базы данных
docker-compose logs -f maria_db
# Ждите сообщения: "mysqld: ready for connections"

# Запустите основное приложение
docker-compose up -d app

# Проверьте логи
docker-compose logs -f app

3.3 Запуск дополнительных сервисов

# Запустите остальные сервисы поочередно
docker-compose up -d indexer
docker-compose up -d ton_daemon
docker-compose up -d license_index
docker-compose up -d convert_process

# Проверьте статус всех сервисов
docker-compose ps

Шаг 4: Проверка работоспособности

4.1 Проверка API

# Проверьте основной API
curl http://localhost:15100/health

# Проверьте подключение к базе данных
curl http://localhost:15100/api/v1/health/database

# Проверьте Redis подключение
curl http://localhost:15100/api/v1/health/cache

4.2 Проверка существующих данных

# Войдите в контейнер приложения
docker-compose exec app python3 -c "
from app.core.database_compatible import init_database, get_async_session
from app.core.models.user_compatible import User
import asyncio

async def check_data():
    await init_database()
    async with get_async_session() as session:
        from sqlalchemy import select
        result = await session.execute(select(User))
        users = result.scalars().all()
        print(f'Found {len(users)} users in database')

asyncio.run(check_data())
"

4.3 Проверка кэширования

# Проверьте работу Redis кэша
docker-compose exec app python3 -c "
from app.core.cache import init_cache, cache
import asyncio

async def test_cache():
    await init_cache()
    await cache.set('test_key', 'test_value', 60)
    value = await cache.get('test_key')
    print(f'Cache test: {value}')

asyncio.run(test_cache())
"

Шаг 5: Настройка для продакшена

5.1 Обновите переменные окружения

В файле .env убедитесь, что настроены:

# Безопасность
SECRET_KEY=your-production-secret-key
JWT_SECRET_KEY=your-production-jwt-key

# База данных
MYSQL_PASSWORD=your-secure-database-password

# Redis (если используете внешний Redis)
REDIS_HOST=redis
REDIS_PASSWORD=your-redis-password  # Если нужен

# Кэширование
CACHE_ENABLED=true
REDIS_ENABLED=true

# Производительность
DATABASE_POOL_SIZE=20
DATABASE_MAX_OVERFLOW=30
REDIS_MAX_CONNECTIONS=50

# Логирование
LOG_LEVEL=INFO
LOG_FORMAT=json

5.2 Настройте мониторинг

# Добавьте мониторинг Redis
docker-compose exec redis redis-cli info memory

# Добавьте мониторинг MariaDB
docker-compose exec maria_db mysql -u root -p -e "SHOW PROCESSLIST;"

# Проверьте использование ресурсов
docker stats

Откат изменений

Если что-то пошло не так, вы можете быстро откатиться:

# Остановите новые контейнеры
docker-compose down

# Восстановите старые конфигурации
mv docker-compose.yml.old docker-compose.yml
mv .env.old .env
mv requirements.txt.old requirements.txt

# Восстановите старые модули
cp app/core/backup/database.py.old app/core/database.py
cp app/core/backup/config.py.old app/core/config.py

# Запустите старую версию
docker-compose up -d

Производительность и мониторинг

Мониторинг Redis

# Мониторинг использования памяти Redis
docker-compose exec redis redis-cli info memory

# Мониторинг команд Redis
docker-compose exec redis redis-cli monitor

# Статистика кэша
docker-compose exec redis redis-cli info stats

Мониторинг MariaDB

# Проверка подключений
docker-compose exec maria_db mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"

# Проверка производительности
docker-compose exec maria_db mysql -u root -p -e "SHOW STATUS LIKE 'Queries';"

# Размер базы данных
docker-compose exec maria_db mysql -u root -p -e "
SELECT 
  table_schema as 'Database', 
  ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) as 'Size (MB)' 
FROM information_schema.tables 
WHERE table_schema = 'myuploader' 
GROUP BY table_schema;
"

Возможные проблемы и решения

Проблема: Redis не запускается

# Проверьте порты
netstat -tulpn | grep 6379

# Проверьте логи Redis
docker-compose logs redis

# Очистите данные Redis если нужно
docker volume rm my-uploader-bot_redis_data

Проблема: Ошибки подключения к базе данных

# Проверьте статус MariaDB
docker-compose exec maria_db mysqladmin -u root -p status

# Проверьте переменные окружения
docker-compose exec app env | grep MYSQL

# Пересоздайте подключение
docker-compose restart app

Проблема: Высокое использование памяти

# Настройте лимиты Redis в .env
REDIS_MAX_CONNECTIONS=30
DATABASE_POOL_SIZE=10

# Перезапустите сервисы
docker-compose restart

Заключение

После успешной миграции ваша система получит:

  1. Асинхронную архитектуру - лучшая производительность
  2. Redis кэширование - быстрый доступ к данным
  3. Обратная совместимость - все данные сохранены
  4. Улучшенный мониторинг - больше метрик
  5. Масштабируемость - готовность к росту нагрузки

Система остается полностью совместимой с существующими данными и конфигурациями, но получает современную асинхронную архитектуру и кэширование для лучшей производительности.

Рекомендация: Проводите миграцию в нерабочее время и тщательно тестируйте каждый шаг.