nakama/MINIO_NGINX_SETUP.md

8.5 KiB
Raw Permalink Blame History

🌐 Настройка Nginx для MinIO с доменом

Обзор

Эта инструкция поможет настроить Nginx reverse proxy для MinIO с SSL сертификатами.

Результат:

  • MinIO API: https://minio.glpshchn.ru
  • MinIO Console: https://admin.minio.glpshchn.ru

Предварительные требования

  1. MinIO запущен на порту 9000 (API) и 9001 (Console)
  2. DNS записи настроены:
    minio.glpshchn.ru       A    103.80.87.247
    admin.minio.glpshchn.ru A    103.80.87.247
    
  3. Порты 80 и 443 открыты в firewall

Быстрая установка (автоматически)

Шаг 1: Скопируйте файлы на сервер

# На вашем компьютере
scp nginx-minio.conf setup-minio-nginx.sh root@103.80.87.247:/root/

# Подключитесь к серверу
ssh root@103.80.87.247

Шаг 2: Отредактируйте email в скрипте

nano setup-minio-nginx.sh

# Измените строку:
EMAIL="your-email@example.com"  # <- Ваш email для Let's Encrypt

Шаг 3: Запустите скрипт

chmod +x setup-minio-nginx.sh
sudo ./setup-minio-nginx.sh

Скрипт автоматически:

  • Установит Nginx и Certbot
  • Получит SSL сертификаты от Let's Encrypt
  • Настроит Nginx конфигурацию
  • Настроит автообновление сертификатов

Ручная установка

Шаг 1: Установите Nginx

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

Шаг 2: Получите SSL сертификаты

# Создайте директорию для certbot
sudo mkdir -p /var/www/certbot

# Временный конфиг для получения сертификатов
sudo tee /etc/nginx/sites-available/minio-temp > /dev/null << 'EOF'
server {
    listen 80;
    server_name minio.glpshchn.ru admin.minio.glpshchn.ru;
    
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
}
EOF

# Активируйте конфиг
sudo ln -sf /etc/nginx/sites-available/minio-temp /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

# Получите сертификаты
sudo certbot certonly --webroot \
    -w /var/www/certbot \
    -d minio.glpshchn.ru \
    -d admin.minio.glpshchn.ru \
    --email your-email@example.com \
    --agree-tos \
    --non-interactive

Шаг 3: Установите конфигурацию

# Скопируйте конфиг
sudo cp nginx-minio.conf /etc/nginx/sites-available/minio.glpshchn.ru

# Активируйте
sudo ln -sf /etc/nginx/sites-available/minio.glpshchn.ru /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/minio-temp

# Проверьте и перезагрузите
sudo nginx -t
sudo systemctl reload nginx

Шаг 4: Настройте автообновление SSL

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Проверка работы

1. Проверьте SSL

curl https://minio.glpshchn.ru/minio/health/live
# Должен вернуть: пустой ответ (это нормально)

# Проверьте сертификат
echo | openssl s_client -connect minio.glpshchn.ru:443 -servername minio.glpshchn.ru 2>/dev/null | openssl x509 -noout -dates

2. Проверьте доступ к файлам

# Загрузите тестовый файл через mc
mc cp test.txt myminio/nakama-media/test.txt

# Проверьте доступность через HTTPS
curl -I https://minio.glpshchn.ru/nakama-media/test.txt
# Должен вернуть: HTTP/2 200

3. Откройте Console

Откройте в браузере:

https://admin.minio.glpshchn.ru

Должен открыться веб-интерфейс MinIO.

Обновите Nakama

Шаг 1: Обновите .env

nano .env

# Измените MinIO настройки:
MINIO_ENABLED=true
MINIO_ENDPOINT=minio.glpshchn.ru   # <- Теперь домен!
MINIO_PORT=443                      # <- HTTPS порт
MINIO_USE_SSL=true                  # <- Включаем SSL
MINIO_ACCESS_KEY=ваш_ключ
MINIO_SECRET_KEY=ваш_секрет
MINIO_BUCKET=nakama-media
MINIO_PUBLIC_URL=https://minio.glpshchn.ru  # <- Публичный URL
MINIO_PUBLIC_BUCKET=true

Шаг 2: Обновите S3 клиент

В backend/utils/minio.js - уже настроено автоматически!
Код использует config.minio.useSSL для выбора протокола.

Шаг 3: Перезапустите backend

docker-compose restart backend

# Проверьте логи
docker-compose logs backend | grep -i minio

Должно быть:

✅ MinIO успешно подключен
   endpoint: minio.glpshchn.ru:443
   ssl: true

Устранение проблем

Ошибка: "SSL certificate problem"

Причина: Сертификат не доверенный или истёк.

Решение:

# Обновите сертификаты
sudo certbot renew --force-renewal
sudo systemctl reload nginx

Ошибка: "Connection refused"

Причина: MinIO не запущен или порты закрыты.

Решение:

# Проверьте MinIO
curl http://127.0.0.1:9000/minio/health/live

# Проверьте Nginx
sudo nginx -t
sudo systemctl status nginx

# Проверьте firewall
sudo ufw status

Ошибка: "502 Bad Gateway"

Причина: Nginx не может подключиться к MinIO.

Решение:

# Проверьте что MinIO слушает на 127.0.0.1:9000
netstat -tulpn | grep 9000

# Проверьте логи Nginx
sudo tail -f /var/log/nginx/minio-error.log

# Проверьте логи MinIO
journalctl -u minio -f

CORS ошибки в браузере

Причина: CORS заголовки не настроены.

Решение: Конфиг уже содержит все необходимые CORS заголовки.
Если проблема остаётся, проверьте что домен frontend добавлен.

Мониторинг

Проверка статуса

# Nginx
sudo systemctl status nginx

# Certbot timer
sudo systemctl status certbot.timer

# Логи доступа
sudo tail -f /var/log/nginx/minio-access.log

# Логи ошибок
sudo tail -f /var/log/nginx/minio-error.log

Статистика использования

# Количество запросов за последний час
sudo grep "$(date '+%d/%b/%Y:%H')" /var/log/nginx/minio-access.log | wc -l

# Топ IP адресов
sudo awk '{print $1}' /var/log/nginx/minio-access.log | sort | uniq -c | sort -rn | head -10

Автообновление SSL

Сертификаты обновляются автоматически через systemd timer.

Проверка:

# Статус таймера
sudo systemctl list-timers certbot.timer

# Тестовое обновление (dry-run)
sudo certbot renew --dry-run

# Ручное обновление (если нужно)
sudo certbot renew
sudo systemctl reload nginx

Бонус: Оптимизация производительности

Кеширование статических файлов

Добавьте в конфиг Nginx внутри location /:

# Кеш для изображений
location ~* \.(jpg|jpeg|png|gif|webp)$ {
    proxy_pass http://127.0.0.1:9000;
    proxy_cache_valid 200 7d;
    add_header X-Cache-Status $upstream_cache_status;
    expires 7d;
}

Сжатие

# В http блоке /etc/nginx/nginx.conf
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

Итоговые URLs

После настройки:

  • MinIO API: https://minio.glpshchn.ru
  • MinIO Console: https://admin.minio.glpshchn.ru
  • Пример файла: https://minio.glpshchn.ru/nakama-media/posts/example.jpg

Теперь все изображения будут загружаться через HTTPS! 🎉