Files
vaultnord-brand/brand-proxy/conf.d/default.conf
T
2026-08-30 02:05:16 +02:00

85 lines
3.2 KiB
Plaintext

# 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 "";
"~^(?<slug>[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-<slug>
# 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 '</head>'
'<link rel="stylesheet" href="/_vaultnord/brand.css"><link rel="icon" href="/_vaultnord/favicon.png"></head>';
sub_filter '</body>'
'<div id="vaultnord-footer">Driftet av <a href="https://vaultnord.no">Vaultnord</a> &middot; <a href="/_vaultnord/kilde.html">kildekode og lisens</a></div></body>';
}
}