# Vaultnord brand-proxy # # Ligger mellom Traefik og kundenes hvelv, og syr inn vår egen CSS, favicon og # en bunntekst med kildekodelenker - uten å røre Vaultwarden-imaget. # # Poenget er at oppgradering av hvelvene skal være å bytte en image-tag, ikke å # bygge en patchet web-vault på nytt. Alt vi legger til, legges til her. map $http_upgrade $connection_upgrade { default upgrade; '' close; } # Første ledd i vertsnavnet er kundens slug: firma.vaultnord.no -> firma map $host $tenant { default ""; "~^(?[a-z0-9-]+)\.vaultnord\.no$" $slug; } server { listen 80; server_name _; # Vedlegg kan være store. Cloudflare stopper uansett på 100 MB i gratisplanen. client_max_body_size 128m; # Docker sin interne DNS. Uten resolver kan vi ikke slå opp vw- # dynamisk, og nginx ville nektet å starte om en tenant var nede. resolver 127.0.0.11 valid=10s ipv6=off; # Er hvelvet nede - stoppet, under oppdatering, eller kunden er satt på pause # - skal brukeren møte noe som forklarer, ikke nginx sin 502-side. error_page 502 503 504 =503 /_vaultnord/utilgjengelig.html; # Gjelder bare våre egne 404-er (ukjent vertsnavn). 404 fra hvelvet selv # slipper gjennom urørt - proxy_intercept_errors er av. error_page 404 /_vaultnord/ukjent.html; location = /_vaultnord/health { access_log off; return 200 "ok\n"; } # Klientens egne ikoner byttes ut på filnivå. Da slipper vi å kjempe mot # manifest og Angular om hva som havner i fanen - de får rett og slett # aldri Bitwardens filer. location = /images/favicon-32x32.png { alias /brand/favicon.png; } location = /images/favicon-16x16.png { alias /brand/favicon-16.png; } location = /images/apple-touch-icon.png { alias /brand/apple-touch-icon.png; } location /_vaultnord/ { alias /brand/; expires 1h; add_header Cache-Control "public"; } location / { if ($tenant = "") { return 404; } proxy_pass http://vw-$tenant$request_uri; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header CF-Connecting-IP $http_cf_connecting_ip; # Live-synk mellom klientene går over websocket. proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 3600s; # sub_filter kan ikke røre en komprimert kropp. Vi ber om ukomprimert # fra hvelvet; Cloudflare komprimerer uansett ut mot brukeren. proxy_set_header Accept-Encoding ""; sub_filter_once on; sub_filter_types text/html; sub_filter '' ''; sub_filter '' ''; } }