8.8 KiB
8.8 KiB
✅ 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
Откройте в браузере:
- MinIO Console: http://localhost:9001
- Логин: minioadmin / your_secure_password_here
Шаг 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:
- Откройте: http://localhost:9001
- Мониторинг → Metrics
- Просмотр файлов: 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!
Что дальше:
- Прочитайте
MINIO_SETUP.mdдля детальной настройки - Измените стандартные credentials
- Настройте HTTPS для продакшена
- Настройте резервное копирование
- Рассмотрите использование CDN
📚 Полезные ссылки
- MinIO Documentation: https://min.io/docs/minio/linux/index.html
- MinIO Client (mc): https://min.io/docs/minio/linux/reference/minio-mc.html
- S3 API Reference: https://docs.aws.amazon.com/s3/
Вопросы? Смотрите MINIO_SETUP.md для подробной документации!