# ================================================
# КОНФИГУРАЦИЯ NGINX С ПОДДЕРЖКОЙ SSL
# Основные задачи:
# 1. Перенаправление HTTP → HTTPS
# 2. Обслуживание статических файлов
# 3. Проксирование к backend сервисам
# 4. Поддержка нескольких доменов
# ================================================

# ================================================
# БЛОК 1: HTTP СЕРВЕР (ПОРТ 80)
# ================================================
server {
    # Прослушивание порта 80 для всех входящих HTTP соединений
    listen 80;
    
    # Список доменов, которые обслуживает этот сервер
    # Все запросы к этим доменам по HTTP будут обработаны здесь
    server_name yalarba.ru www.yalarba.ru 
               valitovgaziz.ru www.valitovgaziz.ru 
               easysite102.ru www.easysite102.ru 
               begushiybashkir.ru 
               xn--80abahjtcfl5d0a8di.xn--p1ai;  # Punycode для IDN домена

    # ============================================
    # ЛОКАЦИЯ: Проверочные файлы для Certbot
    # ============================================
    # Этот блок КРИТИЧЕСКИ ВАЖЕН для получения SSL сертификатов
    # Certbot (Let's Encrypt) размещает здесь временные файлы
    # для подтверждения владения доменом
    location /.well-known/acme-challenge/ {
        # Директория, где Certbot хранит проверочные файлы
        root /var/www/certbot;
        
        # Дополнительные настройки не нужны - nginx просто отдает файлы
    }

    # ============================================
    # ЛОКАЦИЯ: Основное перенаправление
    # ============================================
    # Все HTTP запросы перенаправляются на HTTPS
    # Это обеспечивает безопасность и правильную SEO-практику
    location / {
        # 301 - постоянный редирект (лучше для SEO, кэшируется браузерами)
        # https://$host$request_uri - сохраняет домен и полный путь запроса
        return 301 https://$host$request_uri;
        
        # Пример: 
        # HTTP:  http://example.com/page?param=1
        # ↓ перенаправление ↓
        # HTTPS: https://example.com/page?param=1
    }

    # ============================================
    # ЛОКАЦИЯ: Загруженные файлы
    # ============================================
    # Обслуживание статических файлов (загрузок) по HTTP
    # Может быть полезно для прямых ссылок или кэширования
    location /uploads/ {
        # Псевдоним пути - запросы к /uploads/ обслуживаются из /uploads/ на диске
        alias /uploads/;
        
        # Кэширование в браузере на 1 год
        expires 1y;
        
        # Заголовки кэширования:
        # "public" - может кэшироваться прокси-серверами
        # "immutable" - файлы никогда не меняются, браузер не проверяет обновления
        add_header Cache-Control "public, immutable";
        
        # Если файл не найден - вернуть 404 ошибку
        try_files $uri =404;
    }
}

# ================================================
# БЛОК 2: HTTPS СЕРВЕР ДЛЯ YALARBA.RU
# ================================================
server {
    # Прослушивание порта 443 с SSL/TLS шифрованием
    listen 443 ssl;
    
    # Домены для этого сервера
    server_name yalarba.ru www.yalarba.ru;

    # ============================================
    # НАСТРОЙКИ SSL СЕРТИФИКАТОВ
    # ============================================
    # Пути к SSL сертификатам, сгенерированным Certbot
    ssl_certificate /etc/letsencrypt/live/yalarba.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yalarba.ru/privkey.pem;

    # ============================================
    # НАСТРОЙКИ БЕЗОПАСНОСТИ SSL
    # ============================================
    # Разрешенные протоколы - только современные безопасные версии
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # Сервер выбирает шифры (не клиент)
    ssl_prefer_server_ciphers on;
    
    # Список безопасных шифров
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    # ============================================
    # ЛОКАЦИЯ: Корневая (SPA приложение)
    # ============================================
    location / {
        # Директория со скомпилированным Vue/React приложением
        root /usr/share/nginx/yalarba/html;
        
        # Файл по умолчанию
        index index.html;
        
        # Логика SPA роутинга:
        # 1. Пробуем найти точный файл ($uri)
        # 2. Пробуем найти директорию ($uri/)
        # 3. Если не нашли - отдаем index.html
        # Это позволяет клиентскому роутингу работать корректно
        try_files $uri $uri/ /index.html;
    }

    # ============================================
    # ЛОКАЦИЯ: REST API Backend
    # ============================================
    location /api/ {
        # Проксирование всех запросов к API на Golang сервис
        proxy_pass http://api_tp/;  # Контейнер Docker
        
        # Передача оригинальных заголовков от клиента
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Увеличенные таймауты для длительных операций (10 минут)
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
    }

    location /auth/ {
        # Проксирование всех запросов к API на Golang сервис
        proxy_pass http://api_yal/;  # Контейнер Docker
        
        # Передача оригинальных заголовков от клиента
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Увеличенные таймауты для длительных операций (10 минут)
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
    }
}

# ================================================
# БЛОК 3: HTTPS СЕРВЕР ДЛЯ VALITOVGAZIZ.RU
# ================================================
server {
    listen 443 ssl;
    server_name valitovgaziz.ru www.valitovgaziz.ru;

    # Свой SSL сертификат для этого домена
    ssl_certificate /etc/letsencrypt/live/valitovgaziz.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valitovgaziz.ru/privkey.pem;

    # Те же настройки безопасности SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    # ============================================
    # ЛОКАЦИЯ: Статический сайт
    # ============================================
    location / {
        # Статические HTML файлы
        root /usr/share/nginx/valitovgaziz/html;
        index index.html;
        
        # Стандартная логика для статических сайтов
        try_files $uri $uri/ /index.html;
    }

    # ============================================
    # ЛОКАЦИЯ: API для аналитики
    # ============================================
    location /api/ {
        # Проксирование на Node.js сервис аналитики
        proxy_pass http://analytics:3000/;
        
        # Базовые заголовки прокси
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # ========================================
        # НАСТРОЙКИ CORS (Cross-Origin Resource Sharing)
        # ========================================
        # Разрешаем запросы с ЛЮБОГО домена (*)
        # Внимание: "*" может быть небезопасно в production
        add_header Access-Control-Allow-Origin "*" always;
        add_header Access-Control-Allow-Methods "POST, GET, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
        add_header Access-Control-Allow-Credentials "true" always;

        # Обработка предварительных OPTIONS запросов (preflight)
        # Браузеры отправляют такие запросы перед основными
        if ($request_method = OPTIONS) {
            # 204 - No Content (успешный пустой ответ)
            return 204;
        }

        # Стандартные таймауты для API аналитики
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
}

# ================================================
# БЛОК 4: HTTPS СЕРВЕР ДЛЯ EASYSITE102.RU
# ================================================
server {
    listen 443 ssl;
    server_name easysite102.ru www.easysite102.ru;

    # Свой SSL сертификат
    ssl_certificate /etc/letsencrypt/live/easysite102.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/easysite102.ru/privkey.pem;

    # Безопасные настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    # ============================================
    # ЛОКАЦИЯ: Проксирование к Nuxt.js приложению
    # ============================================
    location / {
        # ВСЕ запросы проксируются к Nuxt.js серверу
        proxy_pass http://easysite:3000;
        
        # Полный набор заголовков для корректной работы приложения
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Длинные таймауты для работы приложения
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
    }

    # ============================================
    # ЛОКАЦИЯ: API Backend для Easysite
    # ============================================
    location /api/ {
        # Отдельный API endpoint для backend
        proxy_pass http://api_es:8088/;
        
        # Заголовки прокси
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Таймауты как у основного приложения
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;

        # ========================================
        # ДЕТАЛЬНЫЕ НАСТРОЙКИ CORS ДЛЯ OPTIONS
        # ========================================
        if ($request_method = OPTIONS ) {
            # Динамический заголовок Origin из запроса
            add_header 'Access-Control-Allow-Origin' "$http_origin";
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE';
            
            # Подробный список разрешенных заголовков
            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            
            # Время кэширования preflight ответа (20 дней)
            add_header 'Access-Control-Max-Age' 1728000;
            
            # Пустой ответ для OPTIONS
            add_header 'Content-Length' 0;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            
            # Возвращаем 204 без тела ответа
            return 204;
        }
    }
}

# ================================================
# БЛОК 5: HTTPS СЕРВЕР ДЛЯ IDN ДОМЕНА
# (Punycode для "бегущийбашкир.рф")
# ================================================
server {
    listen 443 ssl;
    
    # Punycode представление кириллического домена
    server_name xn--80abahjtcfl5d0a8di.xn--p1ai 
               www.xn--80abahjtcfl5d0a8di.xn--p1ai;

    # Отдельный сертификат для IDN домена
    ssl_certificate /etc/letsencrypt/live/xn--80abahjtcfl5d0a8di.xn--p1ai/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xn--80abahjtcfl5d0a8di.xn--p1ai/privkey.pem;

    # Стандартные SSL настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    # ============================================
    # ЛОКАЦИЯ: SPA приложение (такое же как begushiybashkir.ru)
    # ============================================
    location / {
        root /usr/share/nginx/begushiybashkir/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # ============================================
    # ЛОКАЦИЯ: API для "Бегущий Башкир"
    # ============================================
    location /api/ {
        proxy_pass http://api_bb:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;

        # Те же CORS настройки что и у Easysite
        if ($request_method = OPTIONS ) {
            add_header 'Access-Control-Allow-Origin' "$http_origin";
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Length' 0;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            return 204;
        }
    }

    # ============================================
    # ЛОКАЦИЯ: Загруженные файлы (статическое обслуживание)
    # ============================================
    location /uploads/ {
        # Обслуживание файлов загрузок напрямую из файловой системы
        alias /uploads/;
        
        # Долгое кэширование - файлы загрузок редко меняются
        expires 1y;
        add_header Cache-Control "public, immutable";
        
        # try_files не нужен - nginx сам проверит существование файла
    }
}

# ================================================
# БЛОК 6: HTTPS СЕРВЕР ДЛЯ BEGUSHIYBASHKIR.RU
# (ДУБЛИРУЕТ БЛОК 5 С ДРУГИМ ДОМЕНОМ)
# ================================================
server {
    listen 443 ssl;
    server_name begushiybashkir.ru www.begushiybashkir.ru;

    # Свой SSL сертификат для этого домена
    ssl_certificate /etc/letsencrypt/live/begushiybashkir.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/begushiybashkir.ru/privkey.pem;

    # Стандартные SSL настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    # ВНИМАНИЕ: Весь контент ниже ДОСЛОВНО ДУБЛИРУЕТ 
    # предыдущий серверный блок для IDN домена
    
    # ============================================
    # ЛОКАЦИЯ: SPA приложение
    # ============================================
    location / {
        root /usr/share/nginx/begushiybashkir/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # ============================================
    # ЛОКАЦИЯ: API для "Бегущий Башкир"
    # ============================================
    location /api/ {
        proxy_pass http://api_bb:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;

        # Копия CORS настроек
        if ($request_method = OPTIONS ) {
            add_header 'Access-Control-Allow-Origin' "$http_origin";
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Length' 0;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            return 204;
        }
    }

    # ============================================
    # ЛОКАЦИЯ: Загруженные файлы
    # ============================================
    location /uploads/ {
        alias /uploads/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
# ================================================
# КОНЕЦ КОНФИГУРАЦИИ
# ================================================