You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 11:30:44