Skip to content

Конфигурация nginx ​

Скачать пример файла конфигурации

Nginx используется как обратный прокси и точка терминации SSL для всех компонентов приложения. В Standalone-установке nginx запускается контейнером из docker-compose; в HA-установке и в Kubernetes роль прокси выполняет внешний веб-сервер или Ingress-контроллер.

Домены и сертификаты ​

ДоменНазначениеСертификат
example.flip-chart.ruПриложение (frontend, API, WebSocket, S3)/etc/nginx/certificates/crt.pem, key.pem
mcp.example.flip-chart.ruMCP-сервер/etc/nginx/certificates/mcp-crt.pem, mcp-key.pem

При использовании одного сертификата на оба домена (wildcard или SAN) в обоих блоках server указываются одни и те же файлы.

Маршруты ​

МаршрутНазначениеUpstreamОсобенности
/Редирект на /app—
/app/api/v1/wsWebSocketflip-backend:9000proxy_read_timeout 86400s
/app/api/v1/flip/backup/uploadИмпорт досок из резервных копийflip-backend:9000client_max_body_size 6G, тайм-ауты 3600s
/app/apiREST APIflip-backend:9000
/app/s3/Проксирование S3-хранилищаflip-minio:9000префикс /app/s3/ удаляется
/appFrontendflip-frontend:80
mcp.example.flip-chart.ru/MCP-серверflip-mcp-server:8090отдельный server

Примечание

Имена upstream (flip-backend, flip-frontend, flip-minio, flip-mcp-server) должны соответствовать именам контейнеров docker-compose или DNS-именам сервисов окружения. Порт backend должен совпадать с Server.Port в конфигурации backend.

Пример конфигурации ​

nginx
# Обратный прокси flip (on-premise)
# example.flip-chart.ru, mcp.example.flip-chart.ru — заменить на домены установки.

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# DNS Docker: повторное разрешение адресов upstream при перезапуске контейнеров
resolver 127.0.0.11 valid=10s ipv6=off;

# HTTP -> HTTPS
server {
    listen                          80;
    listen                          [::]:80;
    server_name                     example.flip-chart.ru mcp.example.flip-chart.ru;

    location / {
        return 301 https://$host$request_uri;
    }
}

# Основное приложение
server {
    listen                          443 ssl;
    listen                          [::]:443 ssl;
    http2                           on;
    server_name                     example.flip-chart.ru;

    ssl_certificate                 /etc/nginx/certificates/crt.pem;
    ssl_certificate_key             /etc/nginx/certificates/key.pem;

    client_max_body_size            500M;

    set $backend   http://flip-backend:9000;
    set $frontend  http://flip-frontend:80;
    set $minio     http://flip-minio:9000;

    location = / {
        return 302 https://$host/app;
    }

    # WebSocket
    location = /app/api/v1/ws {
        proxy_pass                  $backend;
        proxy_http_version          1.1;
        proxy_set_header            Upgrade             $http_upgrade;
        proxy_set_header            Connection          $connection_upgrade;
        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-Host    $host;
        proxy_read_timeout          86400s;
        proxy_send_timeout          86400s;
        proxy_connect_timeout       60s;
    }

    # Импорт резервных копий досок (.board)
    location = /app/api/v1/flip/backup/upload {
        proxy_pass                  $backend;
        proxy_http_version          1.1;
        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-Host    $host;
        client_max_body_size        6G;
        proxy_request_buffering     off;
        proxy_read_timeout          3600s;
        proxy_send_timeout          3600s;
        proxy_connect_timeout       3600s;
    }

    # REST API
    location /app/api {
        proxy_pass                  $backend;
        proxy_http_version          1.1;
        proxy_set_header            Connection          "";
        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-Host    $host;
        proxy_read_timeout          120s;
        proxy_send_timeout          60s;
        proxy_connect_timeout       60s;
    }

    # S3-хранилище через домен приложения
    location /app/s3/ {
        rewrite                     ^/app/s3/(.*)$ /$1 break;
        proxy_pass                  $minio;
        proxy_http_version          1.1;
        proxy_redirect              off;
        proxy_set_header            Connection          "";
        proxy_set_header            Authorization       "";
        proxy_set_header            X-Real-IP           $remote_addr;
        proxy_set_header            X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_hide_header           Set-Cookie;
        proxy_ignore_headers        Set-Cookie;
        proxy_buffering             off;
        proxy_max_temp_file_size    0;
        add_header                  Cache-Control       max-age=31536000;
    }

    # Frontend
    location /app {
        proxy_pass                  $frontend;
        proxy_http_version          1.1;
        proxy_set_header            Connection          "";
        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_read_timeout          240s;
        proxy_send_timeout          60s;
        proxy_connect_timeout       60s;
    }
}

# MCP-сервер — отдельный домен
server {
    listen                          443 ssl;
    listen                          [::]:443 ssl;
    http2                           on;
    server_name                     mcp.example.flip-chart.ru;

    ssl_certificate                 /etc/nginx/certificates/mcp-crt.pem;
    ssl_certificate_key             /etc/nginx/certificates/mcp-key.pem;

    set $mcp http://flip-mcp-server:8090;

    location / {
        proxy_pass                  $mcp;
        proxy_http_version          1.1;
        proxy_set_header            Connection          "";
        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-Host    $host;
        proxy_buffering             off;
        proxy_read_timeout          120s;
        proxy_send_timeout          60s;
        proxy_connect_timeout       60s;
    }
}

Документация flip On-Premise и Cloud