182 lines
7.4 KiB
YAML
182 lines
7.4 KiB
YAML
version: "3.8"
|
|
|
|
services:
|
|
traefik:
|
|
image: traefik:v3
|
|
container_name: traefik
|
|
restart: unless-stopped
|
|
command:
|
|
- "--providers.docker=true"
|
|
- "--providers.docker.exposedbydefault=false"
|
|
- "--providers.docker.network=dns-net"
|
|
- "--providers.file.directory=/etc/traefik/dynamic"
|
|
- "--providers.file.watch=true"
|
|
|
|
- "--entrypoints.web.address=:80"
|
|
- "--entrypoints.websecure.address=:443"
|
|
- "--entrypoints.websecure.http3"
|
|
- "--entrypoints.dot.address=:853"
|
|
- "--entrypoints.doq.address=:853/udp"
|
|
- "--entrypoints.cluster.address=:53443"
|
|
|
|
- "--certificatesresolvers.myresolver.acme.dnschallenge=true"
|
|
- "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare"
|
|
- "--certificatesresolvers.myresolver.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53"
|
|
- "--certificatesresolvers.myresolver.acme.dnschallenge.delaybeforecheck=60s"
|
|
- "[email protected]"
|
|
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
|
|
environment:
|
|
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
|
|
ports:
|
|
- target: 80
|
|
published: 80
|
|
protocol: tcp
|
|
mode: host
|
|
- target: 443
|
|
published: 443
|
|
protocol: tcp
|
|
mode: host
|
|
- target: 443
|
|
published: 443
|
|
protocol: udp
|
|
mode: host
|
|
- target: 853
|
|
published: 853
|
|
protocol: tcp
|
|
mode: host
|
|
- target: 853
|
|
published: 853
|
|
protocol: udp
|
|
mode: host
|
|
- target: 53443
|
|
published: 53443
|
|
protocol: tcp
|
|
mode: host
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
- ./letsencrypt:/letsencrypt
|
|
- ./traefik/dynamic:/etc/traefik/dynamic:ro
|
|
networks:
|
|
- dns-net
|
|
|
|
technitium-smart:
|
|
image: technitium/dns-server:latest
|
|
container_name: technitium-smart
|
|
restart: unless-stopped
|
|
networks:
|
|
- dns-net
|
|
|
|
cap_add:
|
|
- NET_ADMIN
|
|
- NET_RAW
|
|
- NET_BIND_SERVICE
|
|
|
|
environment:
|
|
- DNS_SERVER_ADMIN_PASSWORD=${DNS_SERVER_ADMIN_PASSWORD}
|
|
- DNS_SERVER_ENABLE_DNS_OVER_HTTP=true
|
|
- DNS_SERVER_ENABLE_DNS_OVER_TLS=false
|
|
- DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=true
|
|
- DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443
|
|
- DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=true
|
|
# Новая консоль: папку со статикой отдаёт том technitium-console (нужен Technitium 15.5+)
|
|
- DNS_SERVER_WEB_SERVICE_WWW_FOLDER_PATH=/opt/technitium-console
|
|
- TZ=Asia/Novosibirsk
|
|
- ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
|
|
- DOTNET_SYSTEM_NET_SOCKETS_INLINE_RECEIVE=1
|
|
|
|
volumes:
|
|
- technitium-data:/etc/dns
|
|
- technitium-console:/opt/technitium-console:ro
|
|
|
|
# AXFR зоны кластера (TLSA). Если 53 уже слушает не этот контейнер, удалите блок.
|
|
# Файрволом пускайте TCP/53 только с IP соседних нод.
|
|
# ports:
|
|
# - target: 53
|
|
# published: 53
|
|
# protocol: tcp
|
|
# mode: host
|
|
# - target: 53
|
|
# published: 53
|
|
# protocol: udp
|
|
# mode: host
|
|
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.docker.network=dns-net"
|
|
|
|
- "traefik.http.middlewares.old-panel-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
|
- "traefik.http.middlewares.old-panel-headers.headers.customrequestheaders.X-Forwarded-Host=old.dns.shnt.top"
|
|
|
|
# DoH
|
|
- "traefik.http.routers.doh.rule=(Host(`dns.shnt.top`) || HostRegexp(`^[a-z0-9-]+\\.dns\\.shnt\\.top$`) || Host(`ndns.shnt.top`) || HostRegexp(`^[a-z0-9-]+\\.ndns\\.shnt\\.top$`)) && PathPrefix(`/dns-query`)"
|
|
- "traefik.http.routers.doh.entrypoints=websecure"
|
|
- "traefik.http.routers.doh.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.doh.tls.domains[0].main=dns.shnt.top"
|
|
- "traefik.http.routers.doh.tls.domains[0].sans=*.dns.shnt.top"
|
|
- "traefik.http.routers.doh.tls.domains[1].main=ndns.shnt.top"
|
|
- "traefik.http.routers.doh.tls.domains[1].sans=*.ndns.shnt.top"
|
|
- "traefik.http.routers.doh.priority=1000"
|
|
- "traefik.http.routers.doh.service=doh-svc"
|
|
- "traefik.http.services.doh-svc.loadbalancer.server.port=8080"
|
|
- "traefik.http.services.doh-svc.loadbalancer.server.scheme=http"
|
|
|
|
# Панель
|
|
- "traefik.http.routers.panel-old.rule=Host(`dns.shnt.top`) || Host(`old.dns.shnt.top`) || Host(`ndns.shnt.top`) || HostRegexp(`^[a-z0-9-]+\\.ndns\\.shnt\\.top$`)"
|
|
- "traefik.http.routers.panel-old.entrypoints=websecure"
|
|
- "traefik.http.routers.panel-old.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.panel-old.tls.domains[0].main=dns.shnt.top"
|
|
- "traefik.http.routers.panel-old.tls.domains[0].sans=*.dns.shnt.top"
|
|
- "traefik.http.routers.panel-old.tls.domains[1].main=ndns.shnt.top"
|
|
- "traefik.http.routers.panel-old.tls.domains[1].sans=*.ndns.shnt.top"
|
|
- "traefik.http.routers.panel-old.priority=10"
|
|
- "traefik.http.routers.panel-old.middlewares=old-panel-headers"
|
|
- "traefik.http.routers.panel-old.service=panel-old-svc"
|
|
- "traefik.http.services.panel-old-svc.loadbalancer.server.port=5380"
|
|
|
|
# DoT
|
|
- "traefik.tcp.routers.dot.rule=HostSNI(`dns.shnt.top`) || HostSNIRegexp(`^.+\\.dns\\.shnt\\.top$`) || HostSNI(`ndns.shnt.top`) || HostSNIRegexp(`^.+\\.ndns\\.shnt\\.top$`)"
|
|
- "traefik.tcp.routers.dot.entrypoints=dot"
|
|
- "traefik.tcp.routers.dot.tls=true"
|
|
- "traefik.tcp.routers.dot.tls.certresolver=myresolver"
|
|
- "traefik.tcp.routers.dot.tls.domains[0].main=dns.shnt.top"
|
|
- "traefik.tcp.routers.dot.tls.domains[0].sans=*.dns.shnt.top"
|
|
- "traefik.tcp.routers.dot.tls.domains[1].main=ndns.shnt.top"
|
|
- "traefik.tcp.routers.dot.tls.domains[1].sans=*.ndns.shnt.top"
|
|
- "traefik.tcp.routers.dot.tls.options=dot@file"
|
|
- "traefik.tcp.routers.dot.service=dot-svc"
|
|
- "traefik.tcp.services.dot-svc.loadbalancer.server.port=538"
|
|
- "traefik.tcp.services.dot-svc.loadbalancer.proxyprotocol.version=2"
|
|
|
|
# DoQ
|
|
- "traefik.udp.routers.doq.entrypoints=doq"
|
|
- "traefik.udp.routers.doq.service=doq-svc"
|
|
- "traefik.udp.services.doq-svc.loadbalancer.server.port=8530"
|
|
|
|
# Кластер: TLS passthrough на Technitium :53443 (без certresolver и Proxy Protocol)
|
|
- "traefik.tcp.routers.cluster.rule=HostSNI(`ndns.shnt.top`) || HostSNIRegexp(`^.+\\.ndns\\.shnt\\.top$`) || HostSNI(`dns.shnt.top`) || HostSNIRegexp(`^.+\\.dns\\.shnt\\.top$`)"
|
|
- "traefik.tcp.routers.cluster.entrypoints=cluster"
|
|
- "traefik.tcp.routers.cluster.tls.passthrough=true"
|
|
- "traefik.tcp.routers.cluster.service=cluster-svc"
|
|
- "traefik.tcp.services.cluster-svc.loadbalancer.server.port=53443"
|
|
|
|
# Копирует новую консоль в том technitium-console и завершается.
|
|
# Без labels Traefik: наружу этот контейнер ничего не отдаёт.
|
|
# Обновление: docker compose pull technitium-console && docker compose up -d technitium-console
|
|
technitium-console:
|
|
image: git.shx.one/denozord/technitium-console:latest
|
|
container_name: technitium-console
|
|
restart: "no"
|
|
volumes:
|
|
- technitium-console:/target
|
|
networks:
|
|
- dns-net
|
|
|
|
networks:
|
|
dns-net:
|
|
driver: bridge
|
|
name: dns-net
|
|
|
|
volumes:
|
|
technitium-data:
|
|
technitium-console:
|