Ich habe mich nochmal mit verschiedenen Aspekten der produktiven Installation beschäftigt. Auch ein wenig die KI befragt und dann ein paar Änderungen vorgenommen. Was hatte mich gestört? Traefik lief als root.
Um das zu ändern, habe ich das docker-compose.yml angepasst. Ich habe auch gleich mal auf die aktuelle Version angepasst.
services:
traefik:
image: traefik:v3.4.1 #3.3.1
container_name: traefik
user: "1000:1001" # 1000 = dockeruser, 1001=docker group
cap_add:
- NET_BIND_SERVICE # erlaubt Ports <1024
restart: always
networks:
- opencloud-net
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/certs # bind-mount acme.json
- /var/run/docker.sock:/var/run/docker.sock:ro
command:
- "--log.level=${TRAEFIK_LOG_LEVEL:-ERROR}"
# Let's Encrypt HTTP-01 Challenge
- "--certificatesResolvers.http.acme.email=${TRAEFIK_ACME_MAIL:-example@example.org}"
- "--certificatesResolvers.http.acme.storage=/certs/acme.json"
- "--certificatesResolvers.http.acme.httpChallenge.entryPoint=http"
- "--certificatesResolvers.http.acme.caserver=${TRAEFIK_ACME_CASERVER:-https://acme-v02.api.letsencrypt.org/directory}"
# Dashboard
- "--api.dashboard=true"
# Entrypoints
- "--entryPoints.http.address=:80"
- "--entryPoints.http.http.redirections.entryPoint.to=https"
- "--entryPoints.http.http.redirections.entryPoint.scheme=https"
- "--entryPoints.https.address=:443"
- "--entryPoints.https.transport.respondingTimeouts.readTimeout=12h"
- "--entryPoints.https.transport.respondingTimeouts.writeTimeout=12h"
- "--entryPoints.https.transport.respondingTimeouts.idleTimeout=3m"
# Docker Provider
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
- "--providers.docker.exposedByDefault=false"
# Access Log
- "--accessLog=true"
- "--accessLog.format=json"
- "--accessLog.fields.headers.names.X-Request-Id=keep"
labels:
- "traefik.enable=${TRAEFIK_DASHBOARD:-false}"
- "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_BASIC_AUTH_USERS:-admin:$$apr1$$4vqie50r$$YQAmQdtmz5n9rEALhxJ4l.}"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`${TRAEFIK_DOMAIN:-traefik.opencloud.test}`)"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
- "traefik.http.routers.traefik.tls.certresolver=http"
- "traefik.http.routers.traefik.service=api@internal"
networks:
opencloud-net:
volumes: {}
Und hierzu
- ./certs:/certs # bind-mount acme.json
brauch es noch ein paar Anpassungen auf dem Host, also im Verzeichnis von wo wir deployen mit dem dockeruser!
mkdir -p ./certs
touch ./certs/acme.json
chmod 600 ./certs/acme.json
chown 1000:1000 ./certs/acme.json # UID muss mit docker-compose user übereinstimmen
Das klappt jetzt hier einwandfrei.
dockeruser@opencloud:~/opencloud/deployments/examples/opencloud_full$ docker exec -it traefik id
uid=1000 gid=1001 groups=1001
Sieht soweit gut aus
Die KI meint noch das hier
Wenn du maximale Sicherheit willst, kannst du langfristig docker-socket-proxy einsetzen. Er erlaubt Traefik nur lesenden Zugriff auf die Container-API:
→ Projektseite: Tecnativa/docker-socket-proxy
Das muss ich aber erst noch sacken lassen und mich etwas zu einlesen.