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! 🎉
|
|||
|
|
|