Конфигурация 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.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 |
Примечание
Имена 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;
}
}