Skip to main content

Traefik with OID Keycloak

version: '2'

networks:
  traefik:
    name: traefik

volumes:
  docker_networking_keycloak_postgresdata:
    external: true
  docker_networking_traefik_acme:
    external: true
  docker_networking_traefik_rules:
    external: true
  docker_networking_traefik_logs:
    external: true
  docker_networking_keycloak_postgresbackup:
    external: true

services:
  traefik:
    image: traefik
    restart: always
    networks:
      - traefik
    command:
      - --pilot.token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --entryPoints.ws.address=:8081
      - --entryPoints.wss.address=:8083
      - --providers.docker
      - --providers.docker.exposedByDefault=false
      - --providers.file.directory=/config/
      - --api
      - --log.filePath=logs/log.txt
      - --log.format=json
      - --log.level=DEBUG
      - --accesslog=true
      - --accesslog.filepath=/logs/access.log
      - --certificatesresolvers.leresolver.acme.email=xxxxxxxxxxxxxx@mail.com
      - --certificatesresolvers.leresolver.acme.storage=/acme/acme.json
      - --certificatesresolvers.leresolver.acme.dnschallenge=true
      - --certificatesresolvers.leresolver.acme.dnschallenge.provider=namedotcom
      - --certificatesresolvers.leresolver.acme.dnschallenge.resolvers=163.114.216.17
    
    environment:
      - NAMECOM_USERNAME=xxxxxxxxxxxxxx
      - NAMECOM_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - NAMECOM_SERVER=api.name.com
      
    ports:
      - "80:80"
      - "443:443"
      - "8081:8081"
      - "8083:8083"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - docker_networking_traefik_logs:/logs/
      - docker_networking_traefik_acme:/acme/
      - docker_networking_traefik_rules:/config/
    labels:
      # Dashboard
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`traefik.domain.com`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.middlewares=traefik-forward-auth"
      - "traefik.http.routers.traefik.tls=true"
      
      # global redirect to https
      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.http-catchall.entrypoints=web"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"

      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      
      # traefik network
      - "traefik.docker.network=traefik"
      
      # global wildcard certificates
      - 'traefik.http.routers.wildcard-certs.tls.certresolver=leresolver'
      - 'traefik.http.routers.wildcard-certs.tls.domains[0].main=domain.com'
      - 'traefik.http.routers.wildcard-certs.tls.domains[0].sans=*.domain.com'
    extra_hosts:
      - host.docker.internal:172.1.1.1
  keycloak:
    image: mihaibob/keycloak:15.0.1
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.keycloak.rule=Host(`keycloak.domain.com`)"
      - "traefik.http.routers.keycloak.entrypoints=websecure"
      - "traefik.http.routers.keycloak.tls=true"
      - "traefik.http.services.keycloak.loadBalancer.server.port=8080"
      - "traefik.docker.network=traefik"
    networks:
      - traefik
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - PROXY_ADDRESS_FORWARDING=true
      - KEYCLOAK_HOSTNAME=keycloak.domain.com
      - DB_VENDOR=POSTGRES
      - DB_ADDR=postgres
      - DB_DATABASE=keycloak
      - DB_USER=keycloak
      - DB_SCHEMA=public
      - DB_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    depends_on:
      - postgres
  postgres:
    user: "65534:100"
    image: postgres:13.4
    restart: unless-stopped
    volumes:
      - docker_networking_keycloak_postgresdata:/var/lib/postgresql/data
    environment:
      - PGDATA=/var/lib/postgresql/data/keycloak
      - POSTGRES_DB=keycloak
      - POSTGRES_USER=keycloak
      - POSTGRES_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    networks:
      - traefik
#-----------------------------------------------------------------------Keycloak-Postgres-Backup------------------------------------------------
  pgbackups:
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - docker_networking_keycloak_postgresbackup:/backups
    links:
      - postgres
    depends_on:
      - postgres
    environment:
      - POSTGRES_HOST=postgres
      - POSTGRES_DB=keycloak
      - POSTGRES_USER=keycloak
      - POSTGRES_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - SCHEDULE=@daily
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=8080
    networks:
      - traefik
    healthcheck:
      test: curl --fail http://localhost:8080 || exit 1
      interval: 5m
      retries: 5
      start_period: 20s
      timeout: 10s
  traefik-forward-auth:
    image: thomseddon/traefik-forward-auth:2-arm64
    restart: unless-stopped
    command:
      - "--default-provider=oidc"
      - "--providers.oidc.issuer-url=https://keycloak.domain.com/auth/realms/master"
      - "--providers.oidc.client-id=traefik-forward-auth"
      - "--providers.oidc.client-secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      - "--secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      - "--insecure-cookie"
      - "--cookie-domain=domain.com"
      - "--auth-host=auth.domain.com"
      - "--log-level=debug"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-forward-auth.rule=Host(`auth.domain.com`)"
      - "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
      - "traefik.http.routers.traefik-forward-auth.entrypoints=websecure"
      - "traefik.http.routers.traefik-forward-auth.tls=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.traefik-forward-auth.middlewares=traefik-forward-auth"
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.trustForwardHeader=true"
    networks:
      - traefik
    depends_on:
      - keycloak