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