201 lines
8.0 KiB
YAML
201 lines
8.0 KiB
YAML
services:
|
|
keepalived-master:
|
|
environment:
|
|
KEEPALIVED_STATE: MASTER
|
|
KEEPALIVED_INTERFACE: eth0
|
|
KEEPALIVED_PRIORITY: "150"
|
|
KEEPALIVED_ROUTER_ID: "51"
|
|
KEEPALIVED_PASSWORD: ${KEEPALIVED_PASSWORD}
|
|
KEEPALIVED_VIRTUAL_IPS: ${KEEPALIVED_VIRTUAL_IPS}
|
|
KEEPALIVED_UNICAST_PEERS: "#PYTHON2BASH:['192.168.4.31', '192.168.4.32']"
|
|
command: --copy-service
|
|
cap_add: [NET_ADMIN, NET_BROADCAST, NET_RAW]
|
|
networks: [host]
|
|
image: osixia/keepalived:2.0.20
|
|
volumes:
|
|
- /volume1/docker/keepalived/data/my-keepalived.conf:/container/service/keepalived/assets/keepalived.conf
|
|
deploy:
|
|
placement:
|
|
constraints: [node.hostname == docker-3]
|
|
labels: [traefik.enable=false]
|
|
resources:
|
|
limits: {cpus: '1', memory: 128M}
|
|
|
|
keepalived-backup:
|
|
environment:
|
|
KEEPALIVED_STATE: BACKUP
|
|
KEEPALIVED_INTERFACE: eth0
|
|
KEEPALIVED_PRIORITY: "100"
|
|
KEEPALIVED_ROUTER_ID: "51"
|
|
KEEPALIVED_PASSWORD: ${KEEPALIVED_PASSWORD}
|
|
KEEPALIVED_VIRTUAL_IPS: ${KEEPALIVED_VIRTUAL_IPS}
|
|
KEEPALIVED_UNICAST_PEERS: "#PYTHON2BASH:['192.168.4.32', '192.168.4.33']"
|
|
cap_add: [NET_ADMIN, NET_BROADCAST, NET_RAW]
|
|
networks: [host]
|
|
image: osixia/keepalived:2.0.20
|
|
volumes:
|
|
- /volume1/docker/keepalived/data/my-keepalived.conf:/container/service/keepalived/assets/keepalived.conf
|
|
deploy:
|
|
placement:
|
|
constraints: [node.hostname != docker-3]
|
|
labels: [traefik.enable=false]
|
|
resources:
|
|
limits: {cpus: '1', memory: 128M}
|
|
|
|
reverse-proxy:
|
|
image: public.ecr.aws/docker/library/traefik:latest
|
|
hostname: traefik
|
|
command:
|
|
- --accesslog.filePath=/traefik/logs/access.log
|
|
- --accesslog.fields.names.StartUTC=drop
|
|
- --log.filePath=/traefik/logs/traefik.log
|
|
- --log.format=json
|
|
- --log.level=DEBUG
|
|
- --providers.swarm=true
|
|
- --providers.swarm.endpoint=unix:///var/run/docker.sock
|
|
- --providers.file.directory=/traefik/rules
|
|
- --providers.file.watch=true
|
|
- --entrypoints.web.http.redirections.entryPoint.to=websecure
|
|
- --entrypoints.web.http.redirections.entryPoint.scheme=https
|
|
- --entrypoints.web.address=:80
|
|
- --entrypoints.websecure.address=:443
|
|
- --entryPoints.websecure.transport.respondingTimeouts.readTimeout=0s
|
|
- --entryPoints.websecure.transport.respondingTimeouts.writeTimeout=0s
|
|
- --entryPoints.websecure.transport.respondingTimeouts.idleTimeout=3600s
|
|
- --entrypoints.mqtt.address=:1883
|
|
- --entrypoints.iperf-tcp.address=:5201
|
|
- --entrypoints.postgresql.address=:5431
|
|
- --entrypoints.iperf-udp.address=:5201/udp
|
|
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
|
- --certificatesresolvers.letsencrypt.acme.email=avb@bryanmail.net
|
|
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
|
|
- --entryPoints.web.forwardedHeaders.insecure
|
|
- --entryPoints.websecure.forwardedHeaders.insecure
|
|
- --entrypoints.web.forwardedHeaders.trustedIPs=127.0.0.1/32,10.0.0.0/8,172.16.0.0/12
|
|
- --entrypoints.websecure.forwardedHeaders.trustedIPs=127.0.0.1/32,10.0.0.0/8,172.16.0.0/12
|
|
- --serversTransport.insecureSkipVerify=true
|
|
- --api.dashboard=true
|
|
- --experimental.plugins.bouncer.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
|
|
- --experimental.plugins.bouncer.version=v1.5.1
|
|
- --serversTransport.forwardingTimeouts.responseHeaderTimeout=0s
|
|
- --serversTransport.forwardingTimeouts.idleConnTimeout=0s
|
|
environment:
|
|
- TZ=US/Alaska
|
|
ports:
|
|
- {target: 80, published: 80, protocol: tcp, mode: host}
|
|
- {target: 443, published: 443, protocol: tcp, mode: host}
|
|
- {target: 1883, published: 1883, protocol: tcp, mode: host}
|
|
- {target: 5201, published: 5201, protocol: tcp, mode: host}
|
|
- {target: 5201, published: 5201, protocol: udp, mode: host}
|
|
- {target: 5432, published: 5431, protocol: tcp, mode: host}
|
|
networks: [traefik_backend, traefik_frontend]
|
|
stdin_open: true
|
|
tty: true
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
- /volume1/docker/traefik:/traefik:rw
|
|
- /volume1/docker/letsencrypt:/letsencrypt:rw
|
|
- /volume1/docker/traefik/cloudflare:/cloudflare:ro
|
|
deploy:
|
|
mode: global
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.services.traefik.loadbalancer.server.port=888
|
|
- traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN}`)
|
|
- traefik.http.routers.traefik.entrypoints=websecure
|
|
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
|
|
- traefik.http.routers.traefik.service=api@internal
|
|
- traefik.http.routers.traefik.middlewares=forwardAuth-authentik@file, crowdsec@file
|
|
resources:
|
|
limits: {cpus: '4', memory: 512M}
|
|
|
|
traefik-certs-dumper:
|
|
image: ghcr.io/ldez/traefik-certs-dumper:v2.10.0
|
|
entrypoint: sh -c 'apk add jq ; while ! [ -e /letsencrypt/acme.json ] || ! [ `jq ".[] | .Certificates | length" /letsencrypt/acme.json` != 0 ]; do sleep 1 ; done && traefik-certs-dumper file --version v3 --watch --source /letsencrypt/acme.json --dest /letsencrypt/certs'
|
|
volumes:
|
|
- /volume1/docker/letsencrypt:/letsencrypt
|
|
networks: [traefik_frontend]
|
|
deploy:
|
|
labels: [traefik.enable=false]
|
|
resources:
|
|
limits: {cpus: '1', memory: 64M}
|
|
|
|
speedtest:
|
|
image: openspeedtest/latest
|
|
networks: [traefik_backend]
|
|
ports:
|
|
- 3001:3000
|
|
volumes:
|
|
- /volume1/docker/Speedtest/ssl:/etc/ssl
|
|
deploy:
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.speedtest.rule=Host(`speedtest.${DOMAIN}`)
|
|
- traefik.http.routers.speedtest.tls=true
|
|
- traefik.http.routers.speedtest.tls.certresolver=letsencrypt
|
|
- traefik.http.routers.speedtest.entrypoints=websecure
|
|
- traefik.http.services.speedtest.loadbalancer.server.port=3000
|
|
- traefik.http.services.speedtest.loadbalancer.server.scheme=http
|
|
- traefik.http.routers.speedtest.middlewares=limit
|
|
- traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=10000000000
|
|
- traefik.swarm.network=traefik_backend
|
|
- autoheal=true
|
|
resources:
|
|
limits: {cpus: '8', memory: 1G}
|
|
|
|
iperf3-server:
|
|
image: networkstatic/iperf3:latest
|
|
stdin_open: true
|
|
tty: true
|
|
command: ["-s", "-p 5201"]
|
|
entrypoint: ["iperf3"]
|
|
networks: [traefik_backend]
|
|
deploy:
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.tcp.routers.iperf.entrypoints=iperf-tcp
|
|
- traefik.tcp.routers.iperf.rule=HostSNI(`*`)
|
|
- traefik.tcp.services.iperf.loadbalancer.server.port=5201
|
|
- traefik.tcp.routers.iperf.service=iperf
|
|
- traefik.swarm.network=traefik_backend
|
|
- traefik.udp.routers.iperf-udp.entrypoints=iperf-udp
|
|
- traefik.udp.routers.iperf-udp.service=iperf-udp
|
|
- traefik.udp.services.iperf-udp.loadbalancer.server.port=5201
|
|
- autoheal=true
|
|
resources:
|
|
limits: {cpus: '4', memory: 128M}
|
|
|
|
whoami:
|
|
image: emilevauge/whoami
|
|
networks: [traefik_backend]
|
|
deploy:
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)
|
|
- traefik.http.routers.whoami.tls=true
|
|
- traefik.http.routers.whoami.tls.certresolver=letsencrypt
|
|
- traefik.http.routers.whoami.entrypoints=websecure
|
|
- traefik.http.services.whoami.loadbalancer.server.port=80
|
|
- traefik.http.services.whoami.loadbalancer.passHostHeader=false
|
|
- traefik.swarm.network=traefik_backend
|
|
- traefik.http.routers.whoami.middlewares=crowdsec@file, forwardAuth-authentik@file
|
|
resources:
|
|
limits: {cpus: '1', memory: 16M}
|
|
|
|
networks:
|
|
traefik_frontend:
|
|
name: traefik_frontend
|
|
driver: overlay
|
|
driver_opts:
|
|
com.docker.network.driver.mtu: "8950"
|
|
attachable: true
|
|
traefik_backend:
|
|
name: traefik_backend
|
|
driver: overlay
|
|
driver_opts:
|
|
com.docker.network.driver.mtu: "8950"
|
|
attachable: true
|
|
host:
|
|
name: host
|
|
external: true
|