#   ТЕСТОВОЕ ЗАДАНИЕ РОСМОРПОРТ
#  ==  Конфикурационный файл config/nginx/pet-clones--external-nginx.conf  ==

# Внешний nginx конфиг для проксирования к контейнеру petclones-site--backend
# Это конфиг для ХОСТА (не внутри контейнера)

# Upstream (группировка backends) для проксирования запросов в Django контейнер
upstream petclones-backend {
    # Контейнер слушает на 127.0.0.1:8040 согласно docker-compose.prod.yml
    server 127.0.0.1:8040;
    # Сохраняем persistent соединения (требует proxy_http_version 1.1 и proxy_set_header Connection "")
    keepalive 32;
}

# Основной server блок для обработки HTTP запросов
server {
    # Слушаем на стандартном HTTP порту (80) для IPv4 и IPv6
    listen 80;
    listen [::]:80;
    server_name pet-clones.cube2.ru;

    # Редирект HTTP → HTTPS (будет активирован после добавления SSL сертификата через certbot)
    # Раскомментируй эту строку после получения SSL сертификата:
    # return 301 https://$server_name$request_uri;

    # Логирование запросов и ошибок для этого виртуального хоста
    access_log /var/log/nginx/petclones.access.log;
    error_log  /var/log/nginx/petclones.error.log warn;

    # Rate-limiting для защиты от DDoS и автоматизированных запросов
    # Разрешаем максимум 100 запросов в секунду с одного IP адреса
    limit_req_zone $binary_remote_addr zone=petclones_limit:10m rate=100r/s;
    limit_req zone=petclones_limit burst=200 nodelay;

    # ОСНОВНОЙ БЛОК ПРОКСИРОВАНИЯ
    # Все запросы, кроме перехвачённых специфичными location'ами, проксируются сюда
    location / {
        # Проксируем все запросы в upstream контейнер
        proxy_pass http://petclones-backend;

        # --- ЗАГОЛОВКИ ДЛЯ КОРРЕКТНОЙ РАБОТЫ ПРИЛОЖЕНИЯ ---
        # Передаём оригинальный хост (важно для правильной работы Django и генерации URLs)
        proxy_set_header Host $host;
        # Передаём оригинальный IP клиента (для логирования и rate-limiting)
        proxy_set_header X-Real-IP $remote_addr;
        # Добавляем этот прокси в цепь X-Forwarded-For (если было несколько проксей)
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # Передаём оригинальный протокол (HTTP или HTTPS) - важно для правильной работы redirect'ов
        proxy_set_header X-Forwarded-Proto $scheme;
        # Передаём оригинальный хост (может отличаться от Host если используется load balancer)
        proxy_set_header X-Forwarded-Host $server_name;
        # Передаём порт если не стандартный
        proxy_set_header X-Forwarded-Port $server_port;

        # --- HTTP KEEP-ALIVE ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ ---
        # Используем HTTP 1.1 для поддержки keep-alive
        proxy_http_version 1.1;
        # Очищаем Connection header (иначе будет "Connection: close")
        proxy_set_header Connection "";

        # --- ТАЙМАУТЫ ДЛЯ ДЛИТЕЛЬНЫХ ЗАПРОСОВ ---
        # Время ожидания подключения к backend
        proxy_connect_timeout 60s;
        # Время ожидания отправки запроса на backend
        proxy_send_timeout 60s;
        # Время ожидания ответа от backend (может быть увеличено если есть долгие запросы)
        proxy_read_timeout 60s;

        # --- БУФЕРИЗАЦИЯ ОТВЕТОВ ---
        # Включаем буферизацию (nginx буферизирует ответ перед отправкой клиенту)
        # Это экономит память backend если клиент медленный
        proxy_buffering on;
        # Размер буфера для первой части ответа (заголовки)
        proxy_buffer_size 4k;
        # Количество и размер буферов для основного тела ответа
        proxy_buffers 8 4k;
    }

    # КЭШИРОВАНИЕ СТАТИЧЕСКИХ ФАЙЛОВ
    # Кэшируем: HTML, изображения, стили, скрипты, шрифты и иконки
    # ВАЖНО: WhiteNoise уже сжимает статику в контейнере (Gzip в nginx не нужен)
    location ~* \.(htm|html|gif|png|jpe?g|svg|ico|css|js|woff|woff2|ttf|eot)$ {
        # Проксируем запрос к backend (статика часть контейнера)
        proxy_pass http://petclones-backend;
        # Передаём хост в заголовке
        proxy_set_header Host $host;

        # --- КЭШИРОВАНИЕ В БРАУЗЕРЕ КЛИЕНТА ---
        # Если файлы имеют хеш в названии (например: app.abc123.js), то cache-control может быть очень долгой
        # "immutable" говорит браузеру что файл никогда не изменится (если изменится, то будет другой хеш)
        add_header Cache-Control "public, max-age=604800, immutable";  # 7 дней в секундах (604800 = 7*24*60*60)

        # ЛОГИРОВАНИЕ ВКЛЮЧЕНО для CrowdSec анализа подозрительных запросов к статике
        # CrowdSec может обнаруживать попытки доступа к несуществующим файлам (признак сканирования)
        # Отключаем логирование только найденных файлов (404 всё равно логируются в error_log)
        access_log /var/log/nginx/petclones.access.log main buffer=32k flush=5s;
        log_not_found off;  # Не логируем 404 статики (слишком много шума)
    }

    # КЭШИРОВАНИЕ МЕДИА ФАЙЛОВ
    # Медиа загруженные пользователями кэшируются меньше чем статика (на случай удаления или обновления)
    location ~* ^/media/.*\.(jpg|jpeg|png|gif|webp|svg|pdf|mp4|webm)$ {
        proxy_pass http://petclones-backend;
        proxy_set_header Host $host;
        # Кэшируем на 30 дней (можно менять в зависимости от политики)
        add_header Cache-Control "public, max-age=2592000";  # 30 дней в секундах (30*24*60*60)

        # ЛОГИРОВАНИЕ ВКЛЮЧЕНО для CrowdSec анализа
        # Подозрительные скачивания медиа файлов (боты, жесткие сканеры и т.п.) должны логироваться
        access_log /var/log/nginx/petclones.access.log main buffer=32k flush=5s;
    }
}

# HTTPS SERVER БЛОК (ДОБАВИТЬ ПОСЛЕ ПОЛУЧЕНИЯ SSL СЕРТИФИКАТА)
# После получения SSL сертификата через certbot, раскомментируй и настрой эту секцию:
#
# server {
#     listen 443 ssl http2;
#     listen [::]:443 ssl http2;
#     server_name pet-clones.cube2.ru;
#
#     # SSL сертификаты от certbot
#     ssl_certificate /etc/letsencrypt/live/pet-clones.cube2.ru/fullchain.pem;
#     ssl_certificate_key /etc/letsencrypt/live/pet-clones.cube2.ru/privkey.pem;
#
#     # Параметры безопасности SSL
#     ssl_protocols TLSv1.2 TLSv1.3;
#     ssl_ciphers HIGH:!aNULL:!MD5;
#     ssl_prefer_server_ciphers on;
#
#     # остальная конфигурация идентична HTTP блоку выше...
#     # (копируешь content из server блока выше и вставляешь сюда)
# }
#
# ТАКЖЕ НЕ ЗАБУДЬ:
# 1. Установи certbot: sudo apt-get install certbot python3-certbot-nginx
# 2. Получи сертификат: sudo certbot certonly --standalone -d pet-clones.cube2.ru
# 3. Перезагрузи nginx: sudo systemctl restart nginx
