# 🌐 Настройка 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: Скопируйте файлы на сервер ```bash # На вашем компьютере scp nginx-minio.conf setup-minio-nginx.sh root@103.80.87.247:/root/ # Подключитесь к серверу ssh root@103.80.87.247 ``` ### Шаг 2: Отредактируйте email в скрипте ```bash nano setup-minio-nginx.sh # Измените строку: EMAIL="your-email@example.com" # <- Ваш email для Let's Encrypt ``` ### Шаг 3: Запустите скрипт ```bash chmod +x setup-minio-nginx.sh sudo ./setup-minio-nginx.sh ``` Скрипт автоматически: - ✅ Установит Nginx и Certbot - ✅ Получит SSL сертификаты от Let's Encrypt - ✅ Настроит Nginx конфигурацию - ✅ Настроит автообновление сертификатов ## Ручная установка ### Шаг 1: Установите Nginx ```bash sudo apt update sudo apt install -y nginx certbot python3-certbot-nginx ``` ### Шаг 2: Получите SSL сертификаты ```bash # Создайте директорию для 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: Установите конфигурацию ```bash # Скопируйте конфиг 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 ```bash sudo systemctl enable certbot.timer sudo systemctl start certbot.timer ``` ## Проверка работы ### 1. Проверьте SSL ```bash 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. Проверьте доступ к файлам ```bash # Загрузите тестовый файл через 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 ```bash 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 ```bash docker-compose restart backend # Проверьте логи docker-compose logs backend | grep -i minio ``` Должно быть: ``` ✅ MinIO успешно подключен endpoint: minio.glpshchn.ru:443 ssl: true ``` ## Устранение проблем ### Ошибка: "SSL certificate problem" **Причина:** Сертификат не доверенный или истёк. **Решение:** ```bash # Обновите сертификаты sudo certbot renew --force-renewal sudo systemctl reload nginx ``` ### Ошибка: "Connection refused" **Причина:** MinIO не запущен или порты закрыты. **Решение:** ```bash # Проверьте 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. **Решение:** ```bash # Проверьте что 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 добавлен. ## Мониторинг ### Проверка статуса ```bash # 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 ``` ### Статистика использования ```bash # Количество запросов за последний час 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. Проверка: ```bash # Статус таймера sudo systemctl list-timers certbot.timer # Тестовое обновление (dry-run) sudo certbot renew --dry-run # Ручное обновление (если нужно) sudo certbot renew sudo systemctl reload nginx ``` ## Бонус: Оптимизация производительности ### Кеширование статических файлов Добавьте в конфиг Nginx внутри `location /`: ```nginx # Кеш для изображений 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; } ``` ### Сжатие ```nginx # В 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! 🎉