nakama/MINIO_SETUP.md

501 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🗄️ Настройка MinIO для Nakama
## Что такое MinIO?
MinIO - это высокопроизводительное объектное хранилище, совместимое с Amazon S3 API. Оно идеально подходит для хранения медиа файлов в распределенных системах.
**Преимущества:**
- ✅ S3-совместимый API
- ✅ Высокая производительность
- ✅ Встроенное резервное копирование
-Веб-консоль для управления
- ✅ Масштабируемость
- ✅ Open Source
---
## 🚀 Быстрый старт
### Вариант 1: С Docker Compose (рекомендуется)
MinIO уже включен в `docker-compose.yml`:
```bash
# Обновите .env файл
nano .env
```
Добавьте MinIO настройки:
```env
# MinIO Configuration
MINIO_ENABLED=true
MINIO_ENDPOINT=minio # В Docker используется имя сервиса
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin # Измените на свой
MINIO_SECRET_KEY=minioadmin_secure_pwd # Измените на свой
MINIO_BUCKET=nakama-media
MINIO_PUBLIC_URL= # Оставьте пустым или укажите CDN URL
```
Запустите:
```bash
docker-compose up -d
```
Проверьте:
- MinIO API: http://localhost:9000
- MinIO Console: http://localhost:9001
- Логин: minioadmin / minioadmin_secure_pwd
---
### Вариант 2: Отдельный сервер MinIO (103.80.87.247)
#### Установка на удаленном сервере:
```bash
# Подключитесь к серверу
ssh root@103.80.87.247
# Скачайте MinIO
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/
# Создайте директорию для данных
mkdir -p /var/minio/data
# Создайте systemd сервис
nano /etc/systemd/system/minio.service
```
Добавьте в файл:
```ini
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
User=root
Group=root
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
```
Создайте файл конфигурации:
```bash
nano /etc/default/minio
```
Добавьте:
```bash
# MinIO local volumes configuration
MINIO_VOLUMES="/var/minio/data"
# MinIO root credentials
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=your_secure_password_here
# MinIO options
MINIO_OPTS="--console-address :9001"
```
Запустите MinIO:
```bash
systemctl enable minio
systemctl start minio
systemctl status minio
```
Откройте порты:
```bash
ufw allow 9000/tcp # API
ufw allow 9001/tcp # Console
```
#### Обновите .env на сервере приложения:
```env
MINIO_ENABLED=true
MINIO_ENDPOINT=103.80.87.247
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=your_secure_password_here
MINIO_BUCKET=nakama-media
```
---
## 🔧 Настройка через веб-консоль
1. Откройте: http://localhost:9001 (или http://103.80.87.247:9001)
2. Войдите с учетными данными (minioadmin / your_password)
3. Создайте bucket:
- Object Browser → Create Bucket
- Имя: `nakama-media`
- Создайте
4. Настройте публичный доступ (опционально):
- Выберите bucket → Access → Add Access Rule
- Prefix: `*`
- Access: `readonly`
---
## 🔑 Создание отдельного пользователя (рекомендуется)
В MinIO Console:
1. **Identity → Users → Create User**
- Access Key: `nakama_app`
- Secret Key: `secure_secret_key_here`
2. **Identity → Policies → Create Policy**
Имя: `nakama-media-policy`
Policy JSON:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::nakama-media",
"arn:aws:s3:::nakama-media/*"
]
}
]
}
```
3. **Назначьте policy пользователю**
- Identity → Users → nakama_app
- Policies → Assign Policy → nakama-media-policy
4. **Обновите .env:**
```env
MINIO_ACCESS_KEY=nakama_app
MINIO_SECRET_KEY=secure_secret_key_here
```
---
## 📊 Проверка работы
### Тест 1: Создание поста с изображением
```bash
# В приложении создайте пост с изображением
# Проверьте в MinIO Console: Object Browser → nakama-media → posts/
```
### Тест 2: Через MinIO Client (mc)
```bash
# Установите mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/
# Настройте alias
mc alias set nakama http://103.80.87.247:9000 minioadmin your_password
# Проверьте bucket
mc ls nakama/nakama-media
# Загрузите тестовый файл
mc cp test.jpg nakama/nakama-media/test/
# Удалите файл
mc rm nakama/nakama-media/test/test.jpg
```
### Тест 3: Через API (curl)
```bash
# Получить список объектов
curl -X GET \
http://localhost:9000/nakama-media/ \
--user minioadmin:your_password
```
---
## 🔄 Миграция существующих файлов в MinIO
Если у вас уже есть файлы в `backend/uploads/`:
```bash
# На сервере с файлами
cd /path/to/nakama
# Установите mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
# Настройте подключение
./mc alias set nakama http://103.80.87.247:9000 minioadmin your_password
# Синхронизируйте файлы
./mc mirror backend/uploads/posts nakama/nakama-media/posts/
./mc mirror backend/uploads/avatars nakama/nakama-media/avatars/
# Проверьте
./mc ls nakama/nakama-media/posts/
```
---
## 🔐 Безопасность
### 1. Измените стандартные учетные данные
```bash
# В /etc/default/minio:
MINIO_ROOT_USER=your_admin_username
MINIO_ROOT_PASSWORD=very_secure_password_123
# Перезапустите
systemctl restart minio
```
### 2. Настройте HTTPS (рекомендуется для продакшена)
```bash
# Создайте директорию для сертификатов
mkdir -p /root/.minio/certs
# Скопируйте SSL сертификаты
cp cert.pem /root/.minio/certs/public.crt
cp key.pem /root/.minio/certs/private.key
# Перезапустите MinIO
systemctl restart minio
```
Обновите .env:
```env
MINIO_USE_SSL=true
MINIO_PUBLIC_URL=https://minio.yourdomain.com
```
### 3. Firewall
```bash
# Разрешить только с IP приложения
ufw allow from YOUR_APP_SERVER_IP to any port 9000
# Или ограничить консоль
ufw allow from YOUR_IP to any port 9001
```
---
## 📈 Мониторинг
### Prometheus метрики
MinIO поддерживает Prometheus:
```bash
# Метрики доступны на:
curl http://localhost:9000/minio/v2/metrics/cluster
```
### Веб-консоль
Мониторинг в реальном времени:
- Monitoring → Metrics
- Bandwidth
- Storage Usage
- API Calls
---
## 🔧 Устранение проблем
### Проблема: "MinIO недоступен"
```bash
# Проверьте статус
systemctl status minio
# Проверьте логи
journalctl -u minio -f
# Проверьте подключение
telnet 103.80.87.247 9000
```
### Проблема: "Bucket does not exist"
```bash
# Создайте через mc
mc mb nakama/nakama-media
```
### Проблема: "Access Denied"
```bash
# Проверьте credentials
mc admin user list nakama
# Проверьте policy
mc admin policy info nakama nakama-media-policy
```
---
## 🔄 Резервное копирование MinIO
### Автоматический бекап с mc
```bash
# Создайте скрипт
nano /usr/local/bin/backup-minio.sh
```
```bash
#!/bin/bash
BACKUP_DIR="/var/backups/minio"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
mkdir -p "$BACKUP_DIR"
# Синхронизировать все файлы
/usr/local/bin/mc mirror nakama/nakama-media "$BACKUP_DIR/$DATE/"
# Удалить старые бекапы (> 30 дней)
find "$BACKUP_DIR" -type d -mtime +30 -exec rm -rf {} \;
echo "Backup completed: $DATE"
```
```bash
chmod +x /usr/local/bin/backup-minio.sh
# Добавьте в cron (еженедельно)
crontab -e
# Добавьте: 0 3 * * 0 /usr/local/bin/backup-minio.sh >> /var/log/minio-backup.log 2>&1
```
---
## 📝 Конфигурация для разных сценариев
### Локальная разработка:
```env
MINIO_ENABLED=true
MINIO_ENDPOINT=localhost
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET=nakama-media-dev
```
### Продакшен с одним сервером:
```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
```
### Продакшен с CDN:
```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
MINIO_PUBLIC_URL=https://cdn.yourdomain.com # Cloudflare/другой CDN
```
---
## 🎯 Рекомендации
1. **Безопасность:**
- Измените стандартные credentials
- Используйте HTTPS в продакшене
- Настройте firewall
- Создайте отдельного пользователя для приложения
2. **Производительность:**
- Используйте CDN для раздачи файлов
- Настройте кэширование
- Включите compression
3. **Надежность:**
- Настройте резервное копирование
- Мониторьте место на диске
- Регулярно проверяйте integrity
4. **Масштабирование:**
- Рассмотрите distributed mode для больших нагрузок
- Используйте lifecycle policies для старых файлов
- Настройте репликацию между серверами
---
**MinIO готов к использованию!** 🚀
Файлы автоматически будут загружаться в MinIO при создании постов и публикациях в канал.