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` для подробной документации!
|
||
|