---
url: https://flip-chart.ru/developers/on-premise/config/nginx.md
description: >-
  Настройка nginx для flip On-Premise: обратный прокси и терминация SSL, домены
  и сертификаты, маршруты и пример конфигурации.
---

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

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

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.ru` | MCP-сервер | `/etc/nginx/certificates/mcp-crt.pem`, `mcp-key.pem` |

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

## Маршруты

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

::: danger Примечание
Имена upstream (`flip-backend`, `flip-frontend`, `flip-minio`, `flip-mcp-server`) должны соответствовать именам контейнеров docker-compose или DNS-именам сервисов окружения. Порт backend должен совпадать с `Server.Port` в [конфигурации backend](/on-premise/config/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;
    }
}

```
