W środowisku Linux, przy wdrażaniu aplikacji za pomocą kontenerów Docker, zalecanym sposobem wystawienia aplikacji (Reverse Proxy) jest użycie serwera Nginx. Pozwala to na obsługę domen, certyfikatów SSL oraz zarządzanie ruchem sieciowym przed dotarciem do samej aplikacji Data Editor.
Kluczowym elementem konfiguracji jest dodanie do definicji serwisu Data Editor w pliku compose.yaml zmiennej środowiskowej: Configuration__ReverseProxy__Enabled: true
Bez tego ustawienia aplikacja nie będzie poprawnie obsługiwać ruchu przekazywanego przez proxy (np. nieprawidłowe generowanie linków, pętle przekierowań).
Przykładowa konfiguracja
Poniżej przedstawiono gotowe pliki konfiguracyjne dla środowiska obsługującego SSL (HTTPS). Aby uruchomić środowisko, należy utworzyć dwa pliki: default.conf (konfiguracja Nginx) oraz compose.yaml (definicja kontenerów), a także zapewnić obecność certyfikatów w odpowiednim katalogu.
1. Plik konfiguracyjny Nginx
Plik ten definiuje zasady przekierowania ruchu, obsługę certyfikatów SSL oraz nagłówki wymagane przez Data Editor (w tym obsługę WebSocket).
resolver 127.0.0.11 valid=5s;
server {
set $backend_dataeditor "http://dataeditor:8000";
listen 443 ssl;
listen 80;
server_name nazwa.serwera;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
ssl_certificate /certs/certyfikat.crt;
ssl_certificate_key /certs/certyfikat.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
location / {
proxy_pass $backend_dataeditor;
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_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
2. Plik Docker Compose
Plik ten spina wszystkie usługi: aplikację Data Editor, bazę danych Meta oraz serwer Proxy. Proszę zwrócić uwagę na mapowanie wolumenów dla certyfikatów oraz wspomnianą wcześniej zmienną:Configuration__ReverseProxy__Enabled: true
YAML
volumes:
meta_data:
data_protection:
file_repositories:
certificates:
driver: local
driver_opts:
o: bind
type: none
device: /home/dataeditor/certs
networks:
proxy:
name: dataeditor_proxy
services:
dataeditor:
image: dataeditor-v2025.1.0-wip-reverse-proxy-730dc912:latest
depends_on:
meta:
condition: service_healthy
restart: true
restart: always
expose:
- "8000"
environment:
ASPNETCORE_ENVIRONMENT: "Docker"
Configuration__Meta__ConnectionString__Password: "haslo"
Configuration__Auth__SigningKey: "kluczRS256"
Configuration__Auth__Issuer: "https://adres_serwera_keycloak:port/realms/master"
Configuration__Auth__Audience: "account"
Configuration__Auth__Keycloak__Authority: "https://adres_serwera_keycloak:port/realms/master"
Configuration__Auth__Keycloak__ClientId: "DataEditor"
Configuration__Auth__Keycloak__Realm: "master"
Configuration__Auth__Keycloak__Url: "https://adres_serwera_keycloak:port"
Configuration__License__Product: "DataEditor"
Configuration__License__Server: "serwer_klucza"
Configuration__License__Port: "port"
Configuration__License__Key: "numer_klucza"
Configuration__ReverseProxy__Enabled: true
#Kestrel__Endpoints__Http__Url: "http://0.0.0.0:8000"
#Kestrel__Endpoints__Https__Url: "https://0.0.0.0:443"
#Ssl__SslMode: 'Custom'
#Ssl__Custom__CustomCertificateMode: 'FileAndKey' # or 'File' when using file with password
#Ssl__Custom__File__Path: <path to certificate>
#Ssl__Custom__File__KeyPath: <path to key>
#Ssl__Custom__File__Password: <password for certificate>
volumes:
- data_protection:/root/.aspnet/DataProtection-Keys
- file_repositories:/file_repositories
healthcheck:
test: ["CMD-SHELL", "curl --fail http://localhost:8000/health || exit 1" ]
interval: 30s
timeout: 60s
retries: 5
start_period: 60s
proxy:
image: docker.io/library/nginx:latest
# container_name: proxy
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- certificates:/certs
- ./default.conf:/etc/nginx/conf.d/default.conf
environment:
- SERVER_HOST=adres.serwera
- UPSTREAM_NAME=dataeditor
- UPSTREAM_PORT=8000
- PROXY_PROTOCOL=https
meta:
image: public.ecr.aws/docker/library/postgres:alpine3.21
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: "haslo"
POSTGRES_USER: "dataeditor"
POSTGRES_DB: "postgres"
volumes:
- meta_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "export PGPASSWORD=$$POSTGRES_PASSWORD; psql -U $$POSTGRES_USER -d $$POSTGRES_DB -c 'SELECT 1' || exit 1"]
interval: 30s
timeout: 60s
retries: 5
start_period: 40s