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:
- Automatické vystavení a obnovu HTTPS / SSL certifikátů (Let's Encrypt).
- Kriticky důležitou podporu WebSockets pro Elixir / Phoenix LiveView.
- 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>