services:
traefik:
image: &traefik-image traefik:${LVS_TRAEFIK_VERSION:-3.7}
pull_policy: always
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.traefik.rule=Host(`traefik.${LVS_DOMAIN:-test}`)'
- 'traefik.http.routers.traefik.service=api@internal'
- 'traefik.http.services.traefik.loadbalancer.server.port=8080'
restart: unless-stopped
ports:
- '80:80'
- '443:443'
extra_hosts:
- 'host.docker.internal:host-gateway'
command:
- '--api=true'
- '--log=true'
- '--log.level=${LVS_TRAEFIK_LOG_LEVEL:-ERROR}'
- '--accesslog=true'
- '--ping=true'
- '--ping.entryPoint=http'
- '--metrics.prometheus=${LVS_TRAEFIK_PROMETHEUS:-true}'
- '--metrics.prometheus.buckets=0.1,0.3,1.2,5.0,10.0'
- '--metrics.prometheus.entrypoint=http'
- '--providers.docker=true'
- '--providers.docker.network=traefik'
- '--providers.docker.defaultRule=Host(`{{ coalesce (index .Labels (default "com.docker.compose.project" (index .Labels "traefik.defaultRuleByLabel"))) (normalize .Name) }}.${LVS_DOMAIN:-test}`)'
- '--providers.docker.exposedByDefault=false'
- '--providers.docker.httpClientTimeout=900'
- '--providers.docker.allowEmptyServices=false'
- '--providers.file.directory=/etc/traefik/'
- '--entrypoints.http.address=:80'
- '--entrypoints.http.asDefault=true'
- '--entrypoints.https.address=:443'
- '--entrypoints.https.asDefault=true'
#
# Note: If you need https uncomment everything below,
# append 'tls' to COMPOSE_PROFILES and setup LVS_DOMAIN=traefik.me
- '--entrypoints.http.http.redirections.entrypoint.permanent=false'
- '--entrypoints.http.http.redirections.entrypoint.to=https'
- '--entrypoints.https.http.tls=true'
#
- '--entrypoints.vite.address=:5173'
- '--entrypoints.vite.http.tls=true'
volumes:
- '${LVS_DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock:ro'
- '${LVS_TRAEFIK_VOLUME:-traefik}:/etc/traefik:ro'
networks:
- traefik
- lvs
healthcheck:
test: [ "CMD", "wget", "--no-verbose", "--spider", "http://healthcheck.${LVS_DOMAIN:-test}/ping" ]
retries: 3
timeout: 5s
traefik-tls-helper:
image: *traefik-image
working_dir: /etc/traefik
volumes:
- '${LVS_TRAEFIK_VOLUME:-traefik}:/etc/traefik'
entrypoint: [ "/bin/sh", "-c" ]
profiles: [ tls ]
command:
- |
mkdir -p certs;
wget ${LVS_DOMAIN:-test}/cert.pem -O certs/cert.pem;
wget ${LVS_DOMAIN:-test}/privkey.pem -O certs/privkey.pem;
cat < tls.yml
tls:
stores:
default:
defaultCertificate:
certFile: /etc/traefik/certs/cert.pem
keyFile: /etc/traefik/certs/privkey.pem
certificates:
- certFile: /etc/traefik/certs/cert.pem
keyFile: /etc/traefik/certs/privkey.pem
#
portainer:
image: portainer/portainer-ce:${LVS_PORTAINER_VERSION:-2.19}-alpine
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.portainer.rule=Host(`portainer.${LVS_DOMAIN:-test}`)'
- 'traefik.http.services.portainer.loadbalancer.server.port=9000'
restart: unless-stopped
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- '${LVS_DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock:ro'
- '${LVS_PORTAINER_VOLUME:-portainer-data}:/data'
networks:
- lvs
profiles:
- all
- portainer
- management
registry:
image: registry:${LVS_REGISTRY_VERSION:-2.8}
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.registry.rule=Host(`registry.${LVS_DOMAIN:-test}`)'
- 'traefik.http.services.registry.loadbalancer.server.port=5000'
restart: unless-stopped
volumes:
- '${LVS_REGISTRY_VOLUME:-registry-data}:/var/lib/registry'
networks:
- lvs
profiles:
- all
- registry
- management
registry-hub:
image: konradkleine/docker-registry-frontend:${LVS_REGISTRY_HUB_VERSION:-v2}
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.portainer.rule=Host(`hub.registry.${LVS_DOMAIN:-test}`)'
restart: unless-stopped
environment:
ENV_DOCKER_REGISTRY_HOST: 'registry'
ENV_DOCKER_REGISTRY_PORT: 5000
ENV_MODE_BROWSE_ONLY: true
networks:
- lvs
profiles:
- all
- registry
- management
#
#
knowledge:
image: gollumwiki/gollum:${LVS_KNOWLEDGE_VERSION:-6.1}
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.knowledge.rule=Host(`knowledge.${LVS_DOMAIN:-test}`)'
- 'traefik.http.services.knowledge.loadbalancer.server.port=4567'
environment:
GOLLUM_AUTHOR_USERNAME: '${LVS_KNOWLEDGE_AUTHOR_NAME:-Knowledge Base}'
GOLLUM_AUTHOR_EMAIL: '${LVS_KNOWLEDGE_AUTHOR_EMAIL:-knowledge@example.com}'
volumes:
- '${LVS_KNOWLEDGE_VOLUME:-knowledge-data}:/wiki'
- '${LVS_KNOWLEDGE_CONFIG:-/dev/null}:/etc/gollum/config.rb:ro'
command:
- '--h1-title'
- '-math=mathjax'
- '--critic-markup'
- '--allow-uploads=page'
- '--user-icons=identicon'
- '--config=/etc/gollum/config.rb'
networks:
- traefik
profiles:
- all
- knowledge
#
buggregator:
image: butschster/buggregator:${LVS_BUGGREGATOR_VERSION:-2.3}
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.debug.rule=Host(`${LVS_DEBUG_SUBDOMAIN:-debug}.${LVS_DOMAIN:-test}`)'
- 'traefik.http.routers.debug.service=debug'
- 'traefik.http.services.debug.loadbalancer.server.port=8000'
- 'traefik.http.routers.debug-dumper.rule=Host(`dumper.${LVS_DEBUG_SUBDOMAIN:-debug}.${LVS_DOMAIN:-test}`)'
- 'traefik.http.routers.debug-dumper.service=debug-dumper'
- 'traefik.http.services.debug-dumper.loadbalancer.server.port=9912'
- 'traefik.http.routers.debug-smtp.rule=Host(`smtp.${LVS_DEBUG_SUBDOMAIN:-debug}.${LVS_DOMAIN:-test}`)'
- 'traefik.http.routers.debug-smtp.service=debug-smtp'
- 'traefik.http.services.debug-smtp.loadbalancer.server.port=1025'
- 'traefik.http.routers.debug-monolog.rule=Host(`monolog.${LVS_DEBUG_SUBDOMAIN:-debug}.${LVS_DOMAIN:-test}`)'
- 'traefik.http.routers.debug-monolog.service=debug-monolog'
- 'traefik.http.services.debug-monolog.loadbalancer.server.port=9913'
- 'traefik.docker.network=traefik'
networks:
traefik:
aliases:
- ${LVS_DEBUG_SUBDOMAIN:-debug}.lvs
- dumper.${LVS_DEBUG_SUBDOMAIN:-debug}.lvs
- smtp.${LVS_DEBUG_SUBDOMAIN:-debug}.lvs
- monolog.${LVS_DEBUG_SUBDOMAIN:-debug}.lvs
profiles:
- all
- buggregator
volumes:
knowledge-data:
driver: local
portainer-data:
driver: local
registry-data:
driver: local
traefik:
driver: local
networks:
lvs:
driver: bridge
traefik:
external: true