nakama/MINIO_SETUP.md

501 lines
12 KiB
Markdown
Raw Normal View History

2025-11-20 22:07:37 +00:00
# 🗄️ Настройка 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 при создании постов и публикациях в канал.