This commit is contained in:
Mike McFetridge
2026-07-20 09:23:17 -04:00
parent c1315882da
commit 72272e4006
3179 changed files with 562960 additions and 14 deletions
+56
View File
@@ -0,0 +1,56 @@
services:
<%- if socket_proxy_enabled %>
<< socket_proxy_service_name >>:
image: tecnativa/docker-socket-proxy:0.4.2
container_name: << socket_proxy_container_name >>
environment:
CONTAINERS: 1
EVENTS: 1
INFO: 1
NETWORKS: 1
PING: 1
POST: 0
SERVICES: 1
TASKS: 1
VERSION: 1
VOLUMES: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- << traefik_network >>
restart: << restart_policy >>
<%- endif %>
<%- if whoami_enabled %>
<< whoami_service_name >>:
image: traefik/whoami:v1.11.0
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< whoami_service_name >>.loadbalancer.server.port=80
- traefik.http.routers.<< whoami_service_name >>-http.rule=Host(`<< whoami_host >>.<< whoami_domain >>`)
- traefik.http.routers.<< whoami_service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if whoami_chain_middleware %>
- traefik.http.routers.<< whoami_service_name >>-http.middlewares=<< whoami_chain_middleware >>
<%- endif %>
<%- if whoami_tls_enabled %>
- traefik.http.routers.<< whoami_service_name >>-https.rule=Host(`<< whoami_host >>.<< whoami_domain >>`)
- traefik.http.routers.<< whoami_service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< whoami_service_name >>-https.tls=true
- traefik.http.routers.<< whoami_service_name >>-https.tls.certresolver=<< whoami_tls_certresolver >>
<%- if whoami_chain_middleware %>
- traefik.http.routers.<< whoami_service_name >>-https.middlewares=<< whoami_chain_middleware >>
<%- endif %>
<%- endif %>
networks:
- << traefik_network >>
restart: << restart_policy >>
<%- endif %>
networks:
<< traefik_network >>:
<%- if traefik_network_external %>
external: true
<%- else %>
driver: bridge
name: << traefik_network >>
<%- endif %>
@@ -0,0 +1,32 @@
http:
middlewares:
default-secured:
chain:
middlewares:
<%- if security_headers_enabled %>
- security-headers
<%- endif %>
<%- if ipallowlist_enabled %>
- default-ipallowlist
<%- endif %>
<%- if crowdsec_middleware_enabled %>
- crowdsec-bouncer
<%- endif %>
<%- if forwardauth_enabled %>
- forward-auth
<%- endif %>
dashboard-secured:
chain:
middlewares:
<%- if security_headers_enabled %>
- security-headers
<%- endif %>
<%- if dashboard_basicauth_enabled %>
- dashboard-basicauth
<%- endif %>
<%- if ipallowlist_enabled %>
- dashboard-ipallowlist
<%- endif %>
<%- if crowdsec_middleware_enabled %>
- crowdsec-bouncer
<%- endif %>
@@ -0,0 +1,78 @@
http:
middlewares:
<%- if security_headers_enabled %>
security-headers:
headers:
contentTypeNosniff: true
frameDeny: true
browserXssFilter: true
referrerPolicy: same-origin
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
customResponseHeaders:
X-Robots-Tag: none
<%- endif %>
<%- if dashboard_basicauth_enabled %>
dashboard-basicauth:
basicAuth:
users:
- << dashboard_basicauth_users >>
<%- endif %>
<%- if ipallowlist_enabled %>
dashboard-ipallowlist:
ipAllowList:
sourceRange:
- << ipallowlist_range_1 >>
<%- if ipallowlist_range_2 %>
- << ipallowlist_range_2 >>
<%- endif %>
<%- if ipallowlist_range_3 %>
- << ipallowlist_range_3 >>
<%- endif %>
default-ipallowlist:
ipAllowList:
sourceRange:
- << ipallowlist_range_1 >>
<%- if ipallowlist_range_2 %>
- << ipallowlist_range_2 >>
<%- endif %>
<%- if ipallowlist_range_3 %>
- << ipallowlist_range_3 >>
<%- endif %>
<%- endif %>
<%- if forwardauth_enabled %>
forward-auth:
forwardAuth:
address: "<< forwardauth_address >>"
trustForwardHeader: << forwardauth_trust_forward_header | lower >>
authResponseHeadersRegex: "<< forwardauth_response_headers_regex >>"
<%- endif %>
<%- if crowdsec_middleware_enabled %>
crowdsec-bouncer:
plugin:
crowdsec-bouncer-traefik-plugin:
enabled: true
crowdsecMode: << crowdsec_mode >>
crowdsecLapiScheme: http
crowdsecLapiHost: << crowdsec_lapi_host >>
crowdsecLapiKey: << crowdsec_bouncer_key >>
<%- if crowdsec_trusted_ip_1 or crowdsec_trusted_ip_2 or crowdsec_trusted_ip_3 %>
forwardedHeadersTrustedIPs:
<%- if crowdsec_trusted_ip_1 %>
- << crowdsec_trusted_ip_1 >>
<%- endif %>
<%- if crowdsec_trusted_ip_2 %>
- << crowdsec_trusted_ip_2 >>
<%- endif %>
<%- if crowdsec_trusted_ip_3 %>
- << crowdsec_trusted_ip_3 >>
<%- endif %>
<%- endif %>
crowdsecAppsecEnabled: << crowdsec_appsec_enabled | lower >>
<%- if crowdsec_appsec_enabled %>
crowdsecAppsecHost: << crowdsec_appsec_host >>
crowdsecAppsecFailureBlock: << crowdsec_appsec_failure_block | lower >>
crowdsecAppsecUnreachableBlock: << crowdsec_appsec_unreachable_block | lower >>
<%- endif %>
<%- endif %>
+524
View File
@@ -0,0 +1,524 @@
{
"slug": "traefik-addons",
"kind": "compose",
"metadata": {
"name": "Traefik Addons",
"description": "Companion Docker Compose stack for the main Traefik template, with a docker-socket-proxy, a whoami test app, and file-provider middleware examples for hardening and external auth.",
"tags": [
"traefik",
"security",
"docker"
],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "2026.04.13",
"source_dep_name": "manual/traefik-addons"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"items": [
{
"name": "traefik_network",
"type": "str",
"title": "Traefik Network",
"required": true,
"default": "traefik",
"description": "Shared Docker network used by the main Traefik stack.",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": true
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
},
"needs": [
"whoami_enabled=true"
]
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"whoami_enabled=true",
"whoami_tls_enabled=true"
]
}
]
},
{
"title": "Socket Proxy",
"toggle": "socket_proxy_enabled",
"name": "socket-proxy",
"items": [
{
"name": "socket_proxy_enabled",
"type": "bool",
"title": "Docker Socket Proxy",
"required": false,
"default": true,
"description": "Run a restricted Docker socket proxy for Traefik and companion tooling."
},
{
"name": "socket_proxy_service_name",
"type": "str",
"title": "Socket Proxy Service Name",
"required": true,
"default": "docker-socket-proxy",
"description": "Compose service name for the docker-socket-proxy.",
"needs": [
"socket_proxy_enabled=true"
],
"config": {
"placeholder": "docker-socket-proxy"
}
},
{
"name": "socket_proxy_container_name",
"type": "str",
"title": "Socket Proxy Container Name",
"required": true,
"default": "docker-socket-proxy",
"description": "Container name for the docker-socket-proxy service.",
"needs": [
"socket_proxy_enabled=true"
],
"config": {
"placeholder": "docker-socket-proxy"
}
}
]
},
{
"title": "Whoami",
"toggle": "whoami_enabled",
"name": "whoami",
"items": [
{
"name": "whoami_enabled",
"type": "bool",
"title": "Whoami Test App",
"required": false,
"default": true,
"description": "Deploy a small Traefik-routed test application."
},
{
"name": "whoami_service_name",
"type": "str",
"title": "Whoami Service Name",
"required": true,
"default": "whoami",
"description": "Compose service name for the whoami test container.",
"needs": [
"whoami_enabled=true"
],
"config": {
"placeholder": "whoami"
}
},
{
"name": "whoami_host",
"type": "str",
"title": "Whoami Host",
"required": true,
"default": "whoami",
"needs": [
"whoami_enabled=true"
],
"config": {
"placeholder": "whoami"
}
},
{
"name": "whoami_domain",
"type": "str",
"title": "Whoami Domain",
"required": true,
"default": "home.arpa",
"needs": [
"whoami_enabled=true"
],
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "whoami_tls_enabled",
"type": "bool",
"title": "Whoami TLS",
"required": false,
"default": false,
"description": "Create an HTTPS router for the whoami test route.",
"needs": [
"whoami_enabled=true"
]
},
{
"name": "whoami_tls_certresolver",
"type": "str",
"title": "Whoami Cert Resolver",
"required": true,
"default": "cloudflare",
"description": "Traefik certificate resolver used for the HTTPS whoami router.",
"needs": [
"whoami_enabled=true",
"whoami_tls_enabled=true"
],
"config": {
"placeholder": "cloudflare"
}
},
{
"name": "whoami_chain_middleware",
"type": "str",
"title": "Whoami Chain Middleware",
"required": false,
"default": "default-secured@file",
"description": "File-provider middleware chain attached to the whoami routers.",
"needs": [
"whoami_enabled=true"
],
"config": {
"placeholder": "default-secured@file"
}
}
]
},
{
"title": "Dashboard Hardening",
"name": "dashboard-hardening",
"items": [
{
"name": "security_headers_enabled",
"type": "bool",
"title": "Security Headers",
"required": false,
"default": true,
"description": "Render a reusable security-headers middleware."
},
{
"name": "dashboard_basicauth_enabled",
"type": "bool",
"title": "Dashboard BasicAuth",
"required": false,
"default": false,
"description": "Render a BasicAuth middleware suitable for dashboard protection."
},
{
"name": "dashboard_basicauth_users",
"type": "secret",
"title": "BasicAuth Users",
"required": true,
"description": "One htpasswd entry to render into the dashboard BasicAuth middleware.",
"needs": [
"dashboard_basicauth_enabled=true"
]
},
{
"name": "ipallowlist_enabled",
"type": "bool",
"title": "IP Allowlist",
"required": false,
"default": false,
"description": "Render IP allowlist middlewares for restricted dashboards or internal apps."
},
{
"name": "ipallowlist_range_1",
"type": "str",
"title": "Allowlist Range 1",
"required": true,
"default": "192.168.0.0/16",
"description": "Primary CIDR allowed through the IP allowlist middleware.",
"needs": [
"ipallowlist_enabled=true"
],
"config": {
"placeholder": "192.168.0.0/16"
}
},
{
"name": "ipallowlist_range_2",
"type": "str",
"title": "Allowlist Range 2",
"required": false,
"default": "10.0.0.0/8",
"description": "Optional second CIDR allowed through the IP allowlist middleware.",
"needs": [
"ipallowlist_enabled=true"
],
"config": {
"placeholder": "10.0.0.0/8"
}
},
{
"name": "ipallowlist_range_3",
"type": "str",
"title": "Allowlist Range 3",
"required": false,
"default": "",
"description": "Optional third CIDR allowed through the IP allowlist middleware.",
"needs": [
"ipallowlist_enabled=true"
],
"config": {
"placeholder": "fd00::/8"
}
}
]
},
{
"title": "ForwardAuth",
"toggle": "forwardauth_enabled",
"name": "forwardauth",
"items": [
{
"name": "forwardauth_enabled",
"type": "bool",
"title": "ForwardAuth",
"required": false,
"default": false,
"description": "Render a ForwardAuth middleware for Authentik, Authelia, or another auth proxy."
},
{
"name": "forwardauth_address",
"type": "str",
"title": "ForwardAuth Address",
"required": true,
"default": "https://auth.home.arpa/outpost.goauthentik.io/auth/traefik",
"description": "ForwardAuth endpoint Traefik should call for authentication.",
"needs": [
"forwardauth_enabled=true"
],
"config": {
"placeholder": "https://auth.home.arpa/outpost.goauthentik.io/auth/traefik"
}
},
{
"name": "forwardauth_trust_forward_header",
"type": "bool",
"title": "Trust Forwarded Headers",
"required": false,
"default": true,
"description": "Trust existing forwarded headers when calling the ForwardAuth endpoint.",
"needs": [
"forwardauth_enabled=true"
]
},
{
"name": "forwardauth_response_headers_regex",
"type": "str",
"title": "Auth Response Headers Regex",
"required": false,
"default": "^X-authentik-.*",
"description": "Regex of headers copied back from the auth response.",
"needs": [
"forwardauth_enabled=true"
],
"config": {
"placeholder": "^X-authentik-.*"
}
}
]
},
{
"title": "CrowdSec Middleware",
"toggle": "crowdsec_middleware_enabled",
"name": "crowdsec",
"items": [
{
"name": "crowdsec_middleware_enabled",
"type": "bool",
"title": "CrowdSec Middleware",
"required": false,
"default": false,
"description": "Render the Traefik CrowdSec plugin middleware example."
},
{
"name": "crowdsec_lapi_host",
"type": "str",
"title": "CrowdSec LAPI Host",
"required": true,
"default": "crowdsec:8080",
"description": "CrowdSec Local API host and port reachable from Traefik.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"placeholder": "crowdsec:8080"
}
},
{
"name": "crowdsec_bouncer_key",
"type": "secret",
"title": "CrowdSec Bouncer Key",
"required": true,
"description": "API key for the Traefik CrowdSec remediation component.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "crowdsec_mode",
"type": "enum",
"title": "CrowdSec Mode",
"required": true,
"default": "stream",
"description": "CrowdSec plugin mode used by Traefik.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"options": [
"live",
"stream",
"alone",
"appsec"
]
}
},
{
"name": "crowdsec_appsec_enabled",
"type": "bool",
"title": "CrowdSec AppSec",
"required": false,
"default": false,
"needs": [
"crowdsec_middleware_enabled=true"
]
},
{
"name": "crowdsec_appsec_host",
"type": "str",
"title": "CrowdSec AppSec Host",
"required": true,
"default": "crowdsec:7422",
"description": "CrowdSec AppSec host and port reachable from Traefik.",
"needs": [
"crowdsec_middleware_enabled=true",
"crowdsec_appsec_enabled=true"
],
"config": {
"placeholder": "crowdsec:7422"
}
},
{
"name": "crowdsec_appsec_failure_block",
"type": "bool",
"title": "Block On AppSec Failure",
"required": false,
"default": true,
"description": "Block requests if CrowdSec AppSec returns an internal error.",
"needs": [
"crowdsec_middleware_enabled=true",
"crowdsec_appsec_enabled=true"
]
},
{
"name": "crowdsec_appsec_unreachable_block",
"type": "bool",
"title": "Block When AppSec Unreachable",
"required": false,
"default": false,
"description": "Block requests if CrowdSec AppSec cannot be reached.",
"needs": [
"crowdsec_middleware_enabled=true",
"crowdsec_appsec_enabled=true"
]
},
{
"name": "crowdsec_trusted_ip_1",
"type": "str",
"title": "Trusted IP 1",
"required": false,
"default": "10.0.0.0/8",
"description": "Optional trusted upstream CIDR for forwarded headers.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"placeholder": "10.0.0.0/8"
}
},
{
"name": "crowdsec_trusted_ip_2",
"type": "str",
"title": "Trusted IP 2",
"required": false,
"default": "192.168.0.0/16",
"description": "Optional second trusted CIDR for forwarded headers.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"placeholder": "192.168.0.0/16"
}
},
{
"name": "crowdsec_trusted_ip_3",
"type": "str",
"title": "Trusted IP 3",
"required": false,
"default": "",
"description": "Optional third trusted CIDR for forwarded headers.",
"needs": [
"crowdsec_middleware_enabled=true"
],
"config": {
"placeholder": "fd00::/8"
}
}
]
}
]
}