12 KiB
🗄️ Настройка MinIO для Nakama
Что такое MinIO?
MinIO - это высокопроизводительное объектное хранилище, совместимое с Amazon S3 API. Оно идеально подходит для хранения медиа файлов в распределенных системах.
Преимущества:
- ✅ S3-совместимый API
- ✅ Высокая производительность
- ✅ Встроенное резервное копирование
- ✅ Веб-консоль для управления
- ✅ Масштабируемость
- ✅ Open Source
🚀 Быстрый старт
Вариант 1: С Docker Compose (рекомендуется)
MinIO уже включен в docker-compose.yml:
# Обновите .env файл
nano .env
Добавьте MinIO настройки:
# 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
Запустите:
docker-compose up -d
Проверьте:
- MinIO API: http://localhost:9000
- MinIO Console: http://localhost:9001
- Логин: minioadmin / minioadmin_secure_pwd
Вариант 2: Отдельный сервер MinIO (103.80.87.247)
Установка на удаленном сервере:
# Подключитесь к серверу
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
Добавьте в файл:
[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
Создайте файл конфигурации:
nano /etc/default/minio
Добавьте:
# 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:
systemctl enable minio
systemctl start minio
systemctl status minio
Откройте порты:
ufw allow 9000/tcp # API
ufw allow 9001/tcp # Console
Обновите .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
🔧 Настройка через веб-консоль
-
Откройте: http://localhost:9001 (или http://103.80.87.247:9001)
-
Войдите с учетными данными (minioadmin / your_password)
-
Создайте bucket:
- Object Browser → Create Bucket
- Имя:
nakama-media - Создайте
-
Настройте публичный доступ (опционально):
- Выберите bucket → Access → Add Access Rule
- Prefix:
* - Access:
readonly
🔑 Создание отдельного пользователя (рекомендуется)
В MinIO Console:
-
Identity → Users → Create User
- Access Key:
nakama_app - Secret Key:
secure_secret_key_here
- Access Key:
-
Identity → Policies → Create Policy
Имя:
nakama-media-policyPolicy 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/*" ] } ] } -
Назначьте policy пользователю
- Identity → Users → nakama_app
- Policies → Assign Policy → nakama-media-policy
-
Обновите .env:
MINIO_ACCESS_KEY=nakama_app MINIO_SECRET_KEY=secure_secret_key_here
📊 Проверка работы
Тест 1: Создание поста с изображением
# В приложении создайте пост с изображением
# Проверьте в MinIO Console: Object Browser → nakama-media → posts/
Тест 2: Через MinIO Client (mc)
# Установите 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)
# Получить список объектов
curl -X GET \
http://localhost:9000/nakama-media/ \
--user minioadmin:your_password
🔄 Миграция существующих файлов в MinIO
Если у вас уже есть файлы в backend/uploads/:
# На сервере с файлами
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. Измените стандартные учетные данные
# В /etc/default/minio:
MINIO_ROOT_USER=your_admin_username
MINIO_ROOT_PASSWORD=very_secure_password_123
# Перезапустите
systemctl restart minio
2. Настройте HTTPS (рекомендуется для продакшена)
# Создайте директорию для сертификатов
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:
MINIO_USE_SSL=true
MINIO_PUBLIC_URL=https://minio.yourdomain.com
3. Firewall
# Разрешить только с IP приложения
ufw allow from YOUR_APP_SERVER_IP to any port 9000
# Или ограничить консоль
ufw allow from YOUR_IP to any port 9001
📈 Мониторинг
Prometheus метрики
MinIO поддерживает Prometheus:
# Метрики доступны на:
curl http://localhost:9000/minio/v2/metrics/cluster
Веб-консоль
Мониторинг в реальном времени:
- Monitoring → Metrics
- Bandwidth
- Storage Usage
- API Calls
🔧 Устранение проблем
Проблема: "MinIO недоступен"
# Проверьте статус
systemctl status minio
# Проверьте логи
journalctl -u minio -f
# Проверьте подключение
telnet 103.80.87.247 9000
Проблема: "Bucket does not exist"
# Создайте через mc
mc mb nakama/nakama-media
Проблема: "Access Denied"
# Проверьте credentials
mc admin user list nakama
# Проверьте policy
mc admin policy info nakama nakama-media-policy
🔄 Резервное копирование MinIO
Автоматический бекап с mc
# Создайте скрипт
nano /usr/local/bin/backup-minio.sh
#!/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"
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
📝 Конфигурация для разных сценариев
Локальная разработка:
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
Продакшен с одним сервером:
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:
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
🎯 Рекомендации
-
Безопасность:
- Измените стандартные credentials
- Используйте HTTPS в продакшене
- Настройте firewall
- Создайте отдельного пользователя для приложения
-
Производительность:
- Используйте CDN для раздачи файлов
- Настройте кэширование
- Включите compression
-
Надежность:
- Настройте резервное копирование
- Мониторьте место на диске
- Регулярно проверяйте integrity
-
Масштабирование:
- Рассмотрите distributed mode для больших нагрузок
- Используйте lifecycle policies для старых файлов
- Настройте репликацию между серверами
MinIO готов к использованию! 🚀
Файлы автоматически будут загружаться в MinIO при создании постов и публикациях в канал.