Konfigurace Reverse Proxy (Nginx, Caddy, Traefik, Apache)

Při produkčním nasazení LockMyCal doporučujeme umístit aplikaci za reverzní proxy server (např. Caddy, Nginx, Traefik nebo Apache). Reverzní proxy zajišťuje:

  1. Automatické vystavení a obnovu HTTPS / SSL certifikátů (Let's Encrypt).
  2. Kriticky důležitou podporu WebSockets pro Elixir / Phoenix LiveView.
  3. Předávání správných klientských IP adres (X-Forwarded-For).

Important

LockMyCal využívá Phoenix LiveView pro reaktivní rozhraní v reálném čase. Vaše reverzní proxy MUSÍ mít správně nakonfigurováno předávání WebSocket spojení (hlavičky Upgrade a Connection).

Tip

Provozujete aplikaci pod více hostnamy? Uveďte je všechny v WS_ALLOWED_ORIGINS. Je-li instance dostupná jen z interní sítě a návštěvníci mají privátní IP adresy, nastavte TRUST_PRIVATE_CLIENT_IPS=true – jinak by všichni sdíleli jeden limit požadavků. Na veřejně dostupné instanci tuto volbu nezapínejte.


Možnost A: Caddy (Doporučeno pro jednoduchost)

Caddy automaticky spravuje SSL certifikáty a nativně podporuje WebSockets bez speciální konfigurace:

rezervace.vasedomena.cz {
    reverse_proxy localhost:4000
}

Možnost B: Nginx

Kompletní konfigurace virtuálního hostitele pro Nginx s podporou WebSockets a HTTP/2:

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

server {
    listen 80;
    server_name rezervace.vasedomena.cz;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name rezervace.vasedomena.cz;

    ssl_certificate /etc/letsencrypt/live/rezervace.vasedomena.cz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/rezervace.vasedomena.cz/privkey.pem;

    client_max_body_size 20M;

    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;

        # WebSocket podpora
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # Hlavičky pro správnou identifikaci klienta a protokolu
        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_set_header X-Forwarded-Port $server_port;

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

Možnost C: Traefik (Docker Labely)

V souboru docker-compose.yml přidejte k servise LockMyCal:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.lockmycal.rule=Host(`rezervace.vasedomena.cz`)"
  - "traefik.http.routers.lockmycal.entrypoints=websecure"
  - "traefik.http.routers.lockmycal.tls.certresolver=myresolver"
  - "traefik.http.services.lockmycal.loadbalancer.server.port=4000"

Možnost D: Apache HTTP Server

Aktivujte moduly: a2enmod proxy proxy_http proxy_wstunnel ssl rewrite headers

<VirtualHost *:443>
    ServerName rezervace.vasedomena.cz

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/rezervace.vasedomena.cz/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/rezervace.vasedomena.cz/privkey.pem

    # WebSocket forwarding
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "ws://127.0.0.1:4000/$1" [P,L]

    ProxyPass / http://127.0.0.1:4000/
    ProxyPassReverse / http://127.0.0.1:4000/

    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>