85 lines
3.2 KiB
Plaintext
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: ethica.vaultnord.no -> ethica
|
|
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> · <a href="/_vaultnord/kilde.html">kildekode og lisens</a></div></body>';
|
|
}
|
|
}
|