Keycloak 18对接Postgres 10.21 容器重启后数据丢失配置问题
Keycloak 17及之后的版本已经从旧的WildFly架构切换为Quarkus架构,你配置中使用的DB_VENDOR/DB_ADDR/DB_DATABASE等DB_*前缀的环境变量是旧版WildFly架构(也就是你之前用的jboss/keycloak:16.1.1镜像)的数据库配置参数,Quarkus版Keycloak完全不识别这套参数。
这种情况下Keycloak 18启动时会默认使用内置的内存H2数据库,所有创建的领域、用户数据都存在容器内存中,不会写入你部署的Postgres库,容器重启后内存数据清空,自然所有配置都会丢失,Postgres中也查不到任何业务数据。
1. 替换数据库相关环境变量
删除keycloaksvc服务下所有DB_*开头的旧环境变量,替换为Quarkus版Keycloak认可的数据库配置:
environment: # 其余原有非DB_开头的环境变量保留,替换以下数据库配置 - KC_DB=postgres - KC_DB_URL=jdbc:postgresql://localhost:5432/keycloak - KC_DB_USERNAME=KcUser - KC_DB_PASSWORD=KcPass # 旧版的PROXY_ADDRESS_FORWARDING、REDIRECT_SOCKET参数已废弃,如果使用反向代理请在启动参数中添加 --proxy=<对应模式> - KC_HOSTNAME=localhost - ROOT_LOGLEVEL=DEBUG - KEYCLOAK_LOGLEVEL=DEBUG - KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN_PASSWORD=testing
注意:你当前配置使用了network_mode: host,容器共享宿主机网络栈,服务名postgressvc无法通过内部DNS解析,所以JDBC地址里要写localhost;如果移除host网络模式改用默认bridge网络,可以把JDBC地址里的localhost换成服务名postgressvc。
2. 调整启动参数(可选)
你当前的entrypoint启动命令不需要大改,仅在使用反向代理的场景下加上对应proxy参数即可,例如边缘代理模式下启动命令调整为:
/opt/keycloak/bin/kc.sh start --auto-build --proxy=edge --hostname-strict-https=false --http-relative-path=/auth --features=token-exchange --https-certificate-file=/etc/x509/https/tls.crt --https-certificate-key-file=/etc/x509/https/tls.key
启动容器后查看Keycloak日志,搜索JDBC连接相关的输出,确认连接地址是jdbc:postgresql开头而非jdbc:h2开头,此时创建的领域、用户数据会正常写入Postgres,重启服务数据不会丢失。
内容的提问来源于stack exchange,提问作者marcg

