我有一个在 Synologyrackstation 上运行的 keycloak docker 容器。该机架站可通过公共域访问,并受到 cloudflare 的预先保护。我可以访问本地网络中的 keycloak 实例,但不能通过配置的子域访问,该子域由 Synology DSM 反向代理提供服务。当我查询子域时,它会将我重定向到 keycloak 的管理控制台,过了一会儿我收到以下错误消息:“somethingWentWrongDescription”。
互联网 --> https://sso.example.com --> clouflare --> Synology DSM 反向代理 https://sso.example.com --> http://localhost:20600
反向代理配置有以下标头:
标题 | 价值 |
---|---|
X-转发至 | $proxy_add_x_forwarded_for |
X-转发-原型 | $proxy_x_forwarded_proto |
X-真实IP | $remote_addr |
升级 | $http_upgrade |
连接 | $connection_upgrade |
docker compose 如下所示:
version: '3.7'
services:
db:
image: postgres
container_name: keycloak-db
volumes:
- /volume1/docker/keycloak/db:/var/lib/postgresql/data:rw
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
keycloak:
image: quay.io/keycloak/keycloak
container_name: keycloak
restart: on-failure:5
command: start
healthcheck:
test: curl -f http://localhost:8080/ || exit 1
environment:
KC_PROXY_HEADERS: xforwarded
KC_HTTP_ENABLED: true
KC_HOSTNAME_STRICT: false
KC_HTTP_RELATIVE_PATH: /auth
KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://db/${POSTGRES_DB}
KC_DB_USERNAME: ${POSTGRES_USER}
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- 20600:8080
depends_on:
- db
keycloak的主机名调试: 主机名调试
我做错了什么?
我曾经使用可从子域访问的旧版 keycloak 运行它,但我想使用最新的 keycloak。从那时起我就无法让它运行了。
反向代理后面的Keycloak没有帮助。
我终于通过设置变量 KC_HOSTNAME 让它工作了。我的作文如下:
keycloak:
image: quay.io/keycloak/keycloak
container_name: keycloak
restart: on-failure:5
command: start
healthcheck:
test: curl -f http://localhost:8080/ || exit 1
environment:
KC_PROXY_HEADERS: xforwarded
KC_HTTP_ENABLED: true
KC_HOSTNAME_STRICT: false
KC_HTTP_RELATIVE_PATH: /
KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://db/${POSTGRES_DB}
KC_DB_USERNAME: ${POSTGRES_USER}
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
KC_HOSTNAME_DEBUG: true
KC_LOG_LEVEL: debug
KC_HOSTNAME_BACKCHANNEL_DYNAMIC: false
KC_HOSTNAME: https://sso.example.com
ports:
- 20600:8080
depends_on:
- db