nakama/MINIO_NGINX_SETUP.md

324 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🌐 Настройка 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! 🎉