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 при создании постов и публикациях в канал.
|
|||
|
|
|