501 lines
12 KiB
Markdown
501 lines
12 KiB
Markdown
# 🗄️ Настройка 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 при создании постов и публикациях в канал.
|
||
|