nakama/MINIO_MIGRATION_SUMMARY.md

8.8 KiB
Raw Blame History

MinIO интеграция завершена!

🎉 Что было сделано

1. Добавлен MinIO клиент

  • Установлен пакет minio в package.json
  • Создана утилита /backend/utils/minio.js с полным API
  • Поддержка загрузки, удаления, получения URL файлов

2. Создан универсальный middleware загрузки

  • /backend/middleware/upload.js - автоматически выбирает MinIO или локальное хранилище
  • Поддержка изображений и видео
  • Валидация типов файлов
  • Автоматическая очистка при ошибках

3. Обновлены роуты

  • /backend/routes/posts.js - использует новый middleware
  • /backend/routes/modApp.js - публикация в канал через MinIO
  • Fallback на локальное хранилище если MinIO недоступен

4. Обновлена конфигурация

  • /backend/config/index.js - добавлены MinIO настройки
  • /backend/server.js - автоматическая инициализация MinIO
  • docker-compose.yml - добавлен MinIO сервис

5. Создана документация

  • MINIO_SETUP.md - полное руководство по настройке
  • ENV_EXAMPLE.txt - пример конфигурации
  • Инструкции по миграции существующих файлов

🚀 Быстрый старт

Шаг 1: Установите зависимости

cd /Users/glpshchn/Desktop/nakama
npm install

Шаг 2: Обновите .env файл

nano .env

Добавьте MinIO настройки:

# MinIO Configuration
MINIO_ENABLED=true
MINIO_ENDPOINT=minio
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=your_secure_password_here
MINIO_BUCKET=nakama-media

Шаг 3: Запустите Docker

docker-compose down
docker-compose build
docker-compose up -d

Шаг 4: Проверьте MinIO

Откройте в браузере:

Шаг 5: Создайте тестовый пост

Создайте пост с изображением в приложении. Файл автоматически загрузится в MinIO!

Проверьте в MinIO Console:

  • Object Browser → nakama-media → posts/

📊 Варианты использования

Вариант 1: MinIO в Docker (для начала)

Преимущества:

  • Быстрая настройка
  • Всё в одном месте
  • Удобно для разработки

Настройка:

MINIO_ENABLED=true
MINIO_ENDPOINT=minio              # Имя сервиса в Docker
MINIO_PORT=9000

Вариант 2: MinIO на отдельном сервере (рекомендуется)

Преимущества:

  • Централизованное хранилище
  • Легко масштабировать
  • Независимость от основного сервера

Настройка:

# На сервере 103.80.87.247 установите MinIO
# (см. MINIO_SETUP.md раздел "Отдельный сервер")

# В .env приложения:
MINIO_ENABLED=true
MINIO_ENDPOINT=103.80.87.247
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=nakama_app
MINIO_SECRET_KEY=secure_key_here
MINIO_BUCKET=nakama-media

Вариант 3: MinIO + CDN (для продакшена)

Преимущества:

  • Максимальная производительность
  • Глобальное кэширование
  • Экономия трафика

Настройка:

MINIO_ENABLED=true
MINIO_ENDPOINT=103.80.87.247
MINIO_PORT=9000
MINIO_USE_SSL=true
MINIO_ACCESS_KEY=nakama_app
MINIO_SECRET_KEY=secure_key_here
MINIO_BUCKET=nakama-media
MINIO_PUBLIC_URL=https://cdn.yourdomain.com

🔄 Миграция существующих файлов

Если у вас уже есть файлы в backend/uploads/:

# Установите MinIO Client
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc

# Настройте подключение
./mc alias set myminio http://localhost:9000 minioadmin your_password

# Синхронизируйте файлы
./mc mirror backend/uploads/posts myminio/nakama-media/posts/
./mc mirror backend/uploads/avatars myminio/nakama-media/avatars/

# Проверьте
./mc ls myminio/nakama-media/

🎯 Как это работает

До (локальное хранилище):

Пользователь загружает фото
    ↓
Multer сохраняет в backend/uploads/
    ↓
URL: /uploads/posts/12345.jpg

После (с MinIO):

Пользователь загружает фото
    ↓
Multer → buffer в памяти
    ↓
MinIO middleware загружает в S3
    ↓
URL: http://minio:9000/nakama-media/posts/12345.jpg

Fallback (если MinIO недоступен):

Пользователь загружает фото
    ↓
Multer → buffer в памяти
    ↓
MinIO недоступен → fallback
    ↓
Сохранение в backend/uploads/
    ↓
URL: /uploads/posts/12345.jpg

🛡️ Безопасность

Важно изменить для продакшена:

# ❌ НЕ используйте в продакшене:
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin

# ✅ Используйте:
MINIO_ACCESS_KEY=nakama_app_$(openssl rand -hex 8)
MINIO_SECRET_KEY=$(openssl rand -hex 32)

Настройка HTTPS:

# На сервере MinIO:
mkdir -p ~/.minio/certs
cp cert.pem ~/.minio/certs/public.crt
cp key.pem ~/.minio/certs/private.key
systemctl restart minio
# В .env:
MINIO_USE_SSL=true

📊 Мониторинг

Проверить подключение:

# В логах backend:
docker-compose logs backend | grep -i minio

# Должны увидеть:
# ✅ MinIO подключен: minio:9000
# Bucket: nakama-media

Веб-консоль MinIO:

  1. Откройте: http://localhost:9001
  2. Мониторинг → Metrics
  3. Просмотр файлов: Object Browser → nakama-media

Статистика через API:

// В коде backend:
const { getBucketStats } = require('./utils/minio');

const stats = await getBucketStats();
console.log(stats);
// {
//   totalFiles: 1234,
//   totalSize: 52428800,
//   totalSizeMB: "50.00",
//   bucket: "nakama-media"
// }

🔧 Устранение проблем

Проблема: "MinIO недоступен"

# Проверьте статус контейнера
docker-compose ps minio

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

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

Проблема: "Bucket не найден"

# Войдите в MinIO Console
http://localhost:9001

# Object Browser → Create Bucket
# Имя: nakama-media

Проблема: "Access Denied"

Проверьте credentials в .env:

docker-compose logs backend | grep MINIO

📝 Структура файлов в MinIO

nakama-media/               ← Bucket
├── posts/                  ← Посты пользователей
│   ├── 1700000000-123.jpg
│   ├── 1700000001-456.png
│   └── ...
├── avatars/                ← Аватары (будущее)
│   └── ...
└── channel/                ← Публикации в канал
    ├── 1700000002-789.jpg
    └── ...

🎉 Готово!

Теперь все медиа файлы автоматически сохраняются в MinIO!

Что дальше:

  1. Прочитайте MINIO_SETUP.md для детальной настройки
  2. Измените стандартные credentials
  3. Настройте HTTPS для продакшена
  4. Настройте резервное копирование
  5. Рассмотрите использование CDN

📚 Полезные ссылки


Вопросы? Смотрите MINIO_SETUP.md для подробной документации!