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