Udostępnianie witryny Data Editor za pomocą Nginx (Docker)

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.

Uwaga
W wersji dockerowej aplikacji Data Editor nie jest dostarczany gotowy obraz Nginx. Użytkownik zobowiązany jest do samodzielnego pobrania oficjalnego obrazu (np. nginx:latest) oraz przygotowania plików konfiguracyjnych.

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).

Nginx
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

Czy ten artykuł był pomocny?