Use traefik_tags template

This commit is contained in:
Daniel Berteaud 2024-01-27 00:11:39 +01:00
parent 9cef0d414f
commit c942ed6442
4 changed files with 39 additions and 31 deletions

View File

@ -34,7 +34,7 @@ RUN set -euxo pipefail &&\
mv web-vault / &&\
chown -R root:root /web-vault
FROM danielberteaud/alpine:24.1-6
FROM danielberteaud/alpine:24.1-8
MAINTAINER Daniel Berteaud <dbd@ehtrace.com>
ENV ROCKET_PROFILE=release \

View File

@ -38,6 +38,18 @@ job "vaultwarden" {
}
}
sidecar_task {
config {
args = [
"-c",
"${NOMAD_SECRETS_DIR}/envoy_bootstrap.json",
"-l",
"${meta.connect.log_level}",
"--concurrency",
"${meta.connect.proxy_concurrency}",
"--disable-hot-restart"
]
}
resources {
cpu = 50
memory = 64
@ -61,19 +73,21 @@ job "vaultwarden" {
}
tags = [
"traefik.enable=true",
# Admin interface
"traefik.http.routers.vaultwarden-admin.rule=Host(`vaultwarden.example.org`) && PathPrefix(`/admin`)",
"traefik.http.routers.vaultwarden-admin.rule=Host(`vaultwarden.example.org`) && PathPrefix(`//admin`)",
"traefik.http.routers.vaultwarden-admin.entrypoints=https",
"traefik.http.routers.vaultwarden-admin.priority=200",
"traefik.http.routers.vaultwarden.middlewares=rate-limit-std@file,inflight-std@file,security-headers@file,hsts@file,compression@file,csp-relaxed@file",
"traefik.http.routers.vaultwarden-admin.middlewares=rate-limit-std@file,inflight-std@file,security-headers@file,hsts@file",
# Main interface
"traefik.enable=true",
"traefik.http.routers.vaultwarden.rule=Host(`vaultwarden.example.org`)",
"traefik.http.routers.vaultwarden.entrypoints=https",
"traefik.http.routers.vaultwarden.priority=100",
"traefik.http.middlewares.vaultwarden-csp.headers.contentSecurityPolicy=default-src 'self'; img-src 'self' data: https://www.gravatar.com; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self' data:; connect-src 'self' https://api.pwnedpasswords.com https://api.2fa.directory",
"traefik.http.routers.vaultwarden.middlewares=vaultwarden-csp,rate-limit-std@file,inflight-std@file,security-headers@file,hsts@file,compression@file,csp-relaxed@file",
"traefik.http.middlewares.vaultwarden-csp.headers.contentsecuritypolicy=connect-src 'self' https://api.pwnedpasswords.com https://api.2fa.directory;default-src 'self';font-src 'self' data:;img-src 'self' data: https://www.gravatar.com;script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';",
"traefik.http.routers.vaultwarden.middlewares=vaultwarden-csp,rate-limit-std@file,inflight-std@file,security-headers@file,hsts@file",
]
}
@ -172,6 +186,7 @@ _EOT
destination = "/data"
}
resources {
cpu = 300
memory = 128

View File

@ -66,13 +66,26 @@ vaultwarden:
public_url: https://vaultwarden.example.org/
# Traefik settings
traefik: {}
traefik:
# Makes sure
priority: 100
csp:
default-src: "'self'"
img-src: "'self' data: https://www.gravatar.com"
script-src: "'self' 'unsafe-inline' 'unsafe-eval'"
style-src: "'self' 'unsafe-inline'"
font-src: "'self' data:"
connect-src: "'self' https://api.pwnedpasswords.com https://api.2fa.directory"
# Settings for the /admin interface
# Note that this interface is disabled unless ADMIN_TOKEN env var is set
admin:
public_url: '[[ .vaultwarden.server.public_url ]]/admin'
# If enabled, we can set specific Traefik middlewares
traefik: {}
traefik:
strip_prefix: false
router: '[[ .instance ]]-admin[[ .consul.suffix ]]'
priority: 200
# Volumes for data persistance
volumes:

View File

@ -33,28 +33,8 @@ job "[[ .instance ]]" {
tags = [
[[- $a := merge .vaultwarden.admin .vaultwarden . ]]
"[[ $c.traefik.instance ]].enable=true",
[[- if ne $c.traefik.instance $a.traefik.instance ]]
"[[ $a.traefik.instance ]].enable=true",
[[- end ]]
# Admin interface
"[[ $a.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]]-admin.rule=Host(`[[ (urlParse $c.public_url).Hostname ]]`) && PathPrefix(`[[ (urlParse $c.public_url).Path | regexp.Replace "/$" "" ]]/admin`)",
"[[ $a.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]]-admin.entrypoints=[[ join $a.traefik.entrypoints "," ]]",
"[[ $a.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]]-admin.priority=200",
"[[ $a.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].middlewares=[[ template "common/traefik_middlewares" $a.traefik ]]",
# Main interface
"[[ $c.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].rule=Host(`[[ (urlParse $c.public_url).Hostname ]]`)
[[- if not ((urlParse $c.public_url).Path | regexp.Match "^/?$") ]] && PathPrefix(`[[ (urlParse $c.public_url).Path ]]`)[[ end ]]",
"[[ $c.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].entrypoints=[[ join $c.traefik.entrypoints "," ]]",
"[[ $c.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].priority=100",
"[[ $c.traefik.instance ]].http.middlewares.[[ .instance ]]-csp[[ .consul.suffix ]].headers.contentSecurityPolicy=default-src 'self'; img-src 'self' data: https://www.gravatar.com; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self' data:; connect-src 'self' https://api.pwnedpasswords.com https://api.2fa.directory",
[[- if not ((urlParse $c.public_url).Path | regexp.Match "^/?$") ]]
"[[ $c.traefik.instance ]].http.middlewares.[[ .instance ]][[ .consul.suffix ]]-prefix.stripprefix.prefixes=[[ (urlParse $c.public_url).Path ]]",
"[[ $c.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].middlewares=[[ .instance ]]-csp[[ .consul.suffix ]],[[ template "common/traefik_middlewares" $c.traefik ]],[[ .instance ]][[ .consul.suffix ]]-prefix",
[[- else ]]
"[[ $c.traefik.instance ]].http.routers.[[ .instance ]][[ .consul.suffix ]].middlewares=[[ .instance ]]-csp[[ .consul.suffix ]],[[ template "common/traefik_middlewares" $c.traefik ]]",
[[- end ]]
[[ template "common/traefik_tags" $a ]]
[[ template "common/traefik_tags" $c ]]
]
}