348 lines
8.8 KiB
Markdown
348 lines
8.8 KiB
Markdown
|
|
# ✅ 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: Установите зависимости
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /Users/glpshchn/Desktop/nakama
|
|||
|
|
npm install
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Шаг 2: Обновите .env файл
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
nano .env
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Добавьте MinIO настройки:
|
|||
|
|
|
|||
|
|
```env
|
|||
|
|
# 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
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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 (для начала)
|
|||
|
|
|
|||
|
|
**Преимущества:**
|
|||
|
|
- ✅ Быстрая настройка
|
|||
|
|
- ✅ Всё в одном месте
|
|||
|
|
- ✅ Удобно для разработки
|
|||
|
|
|
|||
|
|
**Настройка:**
|
|||
|
|
```env
|
|||
|
|
MINIO_ENABLED=true
|
|||
|
|
MINIO_ENDPOINT=minio # Имя сервиса в Docker
|
|||
|
|
MINIO_PORT=9000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Вариант 2: MinIO на отдельном сервере (рекомендуется)
|
|||
|
|
|
|||
|
|
**Преимущества:**
|
|||
|
|
- ✅ Централизованное хранилище
|
|||
|
|
- ✅ Легко масштабировать
|
|||
|
|
- ✅ Независимость от основного сервера
|
|||
|
|
|
|||
|
|
**Настройка:**
|
|||
|
|
```bash
|
|||
|
|
# На сервере 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 (для продакшена)
|
|||
|
|
|
|||
|
|
**Преимущества:**
|
|||
|
|
- ✅ Максимальная производительность
|
|||
|
|
- ✅ Глобальное кэширование
|
|||
|
|
- ✅ Экономия трафика
|
|||
|
|
|
|||
|
|
**Настройка:**
|
|||
|
|
```env
|
|||
|
|
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/`:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Установите 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
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🛡️ Безопасность
|
|||
|
|
|
|||
|
|
### Важно изменить для продакшена:
|
|||
|
|
|
|||
|
|
```env
|
|||
|
|
# ❌ НЕ используйте в продакшене:
|
|||
|
|
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:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# На сервере MinIO:
|
|||
|
|
mkdir -p ~/.minio/certs
|
|||
|
|
cp cert.pem ~/.minio/certs/public.crt
|
|||
|
|
cp key.pem ~/.minio/certs/private.key
|
|||
|
|
systemctl restart minio
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```env
|
|||
|
|
# В .env:
|
|||
|
|
MINIO_USE_SSL=true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Мониторинг
|
|||
|
|
|
|||
|
|
### Проверить подключение:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# В логах 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:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// В коде backend:
|
|||
|
|
const { getBucketStats } = require('./utils/minio');
|
|||
|
|
|
|||
|
|
const stats = await getBucketStats();
|
|||
|
|
console.log(stats);
|
|||
|
|
// {
|
|||
|
|
// totalFiles: 1234,
|
|||
|
|
// totalSize: 52428800,
|
|||
|
|
// totalSizeMB: "50.00",
|
|||
|
|
// bucket: "nakama-media"
|
|||
|
|
// }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Устранение проблем
|
|||
|
|
|
|||
|
|
### Проблема: "MinIO недоступен"
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Проверьте статус контейнера
|
|||
|
|
docker-compose ps minio
|
|||
|
|
|
|||
|
|
# Проверьте логи
|
|||
|
|
docker-compose logs minio
|
|||
|
|
|
|||
|
|
# Перезапустите
|
|||
|
|
docker-compose restart minio
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Проблема: "Bucket не найден"
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Войдите в MinIO Console
|
|||
|
|
http://localhost:9001
|
|||
|
|
|
|||
|
|
# Object Browser → Create Bucket
|
|||
|
|
# Имя: nakama-media
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Проблема: "Access Denied"
|
|||
|
|
|
|||
|
|
Проверьте credentials в .env:
|
|||
|
|
```bash
|
|||
|
|
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 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` для подробной документации!
|
|||
|
|
|