Я пытаюсь разместить keycloak за traefik, чтобы защитить несколько сервисов и SPA.
Однако до тех пор я хочу получить доступ к keycloak только через мое имя хоста tsl, защищенное с помощью traefik.
В моем YML-файле ниже настроены keycloak и traefik.
keycloak создается с помощью файла docker, как описано в документации, а также генерируется ключ.
Созданный ключ не является безопасным, я знаю, что в производстве я бы использовал сертификат letsencrypt, но я не хочу запрашивать новые сертификаты каждый раз, когда пытаюсь.
В качестве сервера псевдонимов я указал свой хост стека, как в файле создания, и IP-адрес моего WSL. На данный момент я думаю, что может быть ошибка, но я не знаю, что изменить.
В моем файле YML keycloak выпускается через traefik с портом https 8443. Однако, если я использую только
https://stack_host..:8443/admin
Появляется сообщение 502 Bad Gateway, однако на панели управления Traefik все выглядит нормально.
Теперь мне это удалось. Traefik работает с Keycloak, шифрование TSL выполняется через traefik, а не через keycoak, поэтому keycloak должен быть доступен только через порт 8080, для него не требуется пара ключей.
Я добавил еще один хост auth.stack_host в /etc/hosts (в Windows System32/drivers/hosts), который теперь доступен по https:auth.stack_host и ведет к keycloak.
Вот шаблонный файл YML для keycloak, traefik и vue SPA. Приложение vue прослушивает https://stack_host:443. Задайте stack_host имя вашего компьютера или добавьте другой хост в файл сверху.
version: "3"
services:
traefik:
image: traefik:v2.9
command:
- --api.insecure=true
- --providers.file.directory=/configuration/
- --providers.file.watch=true
- --accesslog
- --providers.docker.exposedbydefault=false
- --providers.docker
- --entryPoints.websecure.address=:443
- --entrypoints.web.address=:80
- --entrypoints.gateway.address=:5001
ports:
- "172.17.108.255:8080:8080"
- "80:80"
- "443:443"
- "5001:5001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /traefik:/configuration/
networks:
- external-network
mem_limit: 200m
mem_reservation: 100m
frontend:
build: gui
container_name: ${STACK_NAME}-frontend
restart: always
networks:
- external-network
command: --brotli --port 8083
labels:
- "traefik.enable=true"
- "traefik.docker.network=${STACK_NAME}-external"
- "traefik.http.routers.frontend.rule=Host(`${STACK_HOST}`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls=true"
- "traefik.http.routers.frontend.middlewares=cors_header"
- "traefik.http.middlewares.cors_header.headers.accesscontrolallowmethods=GET,OPTIONS,PUT,POST,DELETE,PATCH"
- "traefik.http.middlewares.cors_header.headers.accesscontrolallowheaders=*"
- "traefik.http.middlewares.cors_header.headers.accesscontrolalloworiginlist=https://${STACK_HOST}"
- "traefik.http.middlewares.cors_header.headers.accesscontrolmaxage=100"
- "traefik.http.middlewares.cors_header.headers.addvaryheader=true"
- "traefik.http.services.frontend.loadbalancer.server.port=8083"
- "traefik.http.services.frontend.loadbalancer.server.scheme=http"
keycloak:
container_name: keycloak
build: KeycloakContainer
restart: always
command: start
environment:
KC_PROXY_ADDRESS_FORWARDING: "true"
KC_HOSTNAME_STRICT: "false"
KC_HOSTNAME_STRICT_HTTPS: "false"
KC_HOSTNAME: auth.${STACK_HOST}
KC_HTTP_ENABLED: "true"
KC_PROXY_HEADERS: xforwarded
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: password
KC_HEALTH_ENABLED: "true"
labels:
- "traefik.docker.network=${STACK_NAME}-external"
- "traefik.enable=true"
- "traefik.http.routers.keycloak.rule=Host(`auth.${STACK_HOST}`)"
- "traefik.http.routers.keycloak.tls=true"
- "traefik.http.services.keycloak.loadbalancer.server.port=8080"
networks:
- external-network
- internal-network
healthcheck:
test:
[
"CMD-SHELL",
"exec 3<>/dev/tcp/localhost/8080 && echo -e 'GET /health/ready HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && cat <&3 | grep -q '200 OK'"
]
interval: 30s
timeout: 5s
retries: 20
networks:
internal-network:
name: ${STACK_NAME}-internal
internal: true
external-network:
name: ${STACK_NAME}-external
driver: bridge
FROM quay.io/keycloak/keycloak:24.0.1 as builder
WORKDIR /opt/keycloak
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:24.0.1
COPY --from=builder /opt/keycloak/ /opt/keycloak/
// load custom theme
COPY ./marvins-theme/ /opt/keycloak/themes/marvins-theme
// import realm
COPY ./realm-config/realm.json /opt/keycloak_import/
RUN /opt/keycloak/bin/kc.sh import --file /opt/keycloak_import/realm.json
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]