Keycloak从v16迁移到v21不会导入领域和用户。

huangapple go评论123阅读模式
英文:

Migrations of Keycloak from v16 to v21 doesn't import realms and users

问题

We have dockerized Keycloak v16 and now we would like to migrate to a version v21.

We uses Postgres database and we have inside this database already created realms and users.

When we upgraded to v21, everything works except that Keycloak shows that realms are empty and users as well.

If I inspect the database, all users and realms are still there...

How to tell Keycloak to read old realms and users?

New docker file

  1. FROM quay.io/keycloak/keycloak:21.0.2
  2. COPY themes/ /opt/jboss/keycloak/themes/
  3. ADD ./standalone-ha.xml /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml

standalone-ha.xml

  1. <spi name="connectionsJpa">
  2. <provider name="default" enabled="true">
  3. <properties>
  4. <property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>
  5. <property name="initializeEmpty" value="true"/>
  6. <property name="migrationStrategy" value="update"/>
  7. <property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
  8. <property name="schema" value="${env.DB_SCHEMA:public}"/>
  9. </properties>
  10. </provider>
  11. </spi>

docker-compose file

  1. keycloak:
  2. image: mykeycloak
  3. environment:
  4. DB_VENDOR: POSTGRES
  5. DB_ADDR: xxxx
  6. DB_DATABASE: keycloak
  7. DB_USER: postgres
  8. DB_SCHEMA: public
  9. DB_PASSWORD: xxxx
  10. KEYCLOAK_ADMIN: xxxx
  11. KEYCLOAK_ADMIN_PASSWORD: xxxx
  12. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  13. volumes:
  14. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  15. command: start-dev --http-relative-path /auth --spi-connections-jpa-legacy-migration-strategy=update
  16. ports:
  17. - 8080:8080
  18. EDIT:
  19. -----------
  20. I figure out that Keycloak is not connecting to a database. I always insert the same realms so I thought that new and old are in the same database.
  21. So the question is how to connect correctly to a Postgres container.
  22. I changed the docker-compose file to:
  23. ```plaintext
  24. db:
  25. image: postgres:13.2
  26. ports:
  27. - "5432:5432"
  28. environment:
  29. POSTGRES_PASSWORD: 'xxx'
  30. # volumes:
  31. # - /Volumes/DATA/docker_volume/pgdata:/var/lib/postgresql/data
  32. keycloak:
  33. depends_on:
  34. - db
  35. image: mykeycloak
  36. environment:
  37. KC_DB: postgres
  38. KC_DB_ADDR: db
  39. KC_DB_DATABASE: keycloak
  40. KC_DB_USER: postgres
  41. KC_DB_SCHEMA: public
  42. KC_DB_PASSWORD: xxx
  43. KEYCLOAK_ADMIN: keycloak_admin
  44. KEYCLOAK_ADMIN_PASSWORD: xxx
  45. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  46. volumes:
  47. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  48. command: start-dev --http-relative-path /auth
  49. ports:
  50. - 8080:8080

Now I get the error:

  1. 2023-06-22 10:18:30 2023-06-22 08:18:30,593 WARN [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator] (JPA Startup Thread: keycloak-default) HHH000342: Could not obtain connection to query metadata: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  2. 2023-06-22 10:18:30 at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:319)
  3. ...

我們已經將Keycloak v16容器化,現在我們想要遷移到版本v21。

我們使用的是Postgres數據庫,並且在這個數據庫中已經創建了領域和用戶。

當我們升級到v21時,一切都正常,只是Keycloak顯示領域和用戶是空的。

如果我檢查數據庫,所有的用戶和領域仍然存在...

如何告訴Keycloak讀取舊的領域和用戶?

新的Docker文件

  1. FROM quay.io/keycloak/keycloak:21.0.2
  2. COPY themes/ /opt/jboss/keycloak/themes/
  3. ADD ./standalone-ha.xml /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml

standalone-ha.xml

  1. <spi name="connectionsJpa">
  2. <provider name="default" enabled="true">
  3. <properties>
  4. <property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>
  5. <property name="initializeEmpty" value="true"/>
  6. <property name="migrationStrategy" value="update"/>
  7. <property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
  8. <property name="schema" value="${env.DB_SCHEMA:public}"/>
  9. </properties>
  10. </provider>
  11. </spi>

docker-compose文件

  1. keycloak:
  2. image: mykeycloak
  3. environment:
  4. DB_VENDOR: POSTGRES
  5. DB_ADDR: xxxx
  6. DB_DATABASE: keycloak
  7. DB_USER: postgres
  8. DB_SCHEMA: public
  9. DB_PASSWORD: xxxx
  10. KEYCLOAK_ADMIN: xxxx
  11. KEYCLOAK_ADMIN_PASSWORD: xxxx
  12. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  13. volumes:
  14. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  15. command: start-dev --http-relative-path /auth --spi-connections-jpa-legacy-migration-strategy=update
  16. ports:
  17. - 8080:8080
  18. 編輯:
  19. -----------
  20. 我發現Keycloak無法連接到數據庫。我總是插入相同的領域,所以我認為新的和舊的都在同一個數據庫中。
  21. 所以問題是如何正確連接到Postgres容器。
  22. 我將docker-compose文件更改為:
  23. ```plaintext
  24. db:
  25. image: postgres:13.2
  26. ports:
  27. - "5432:5432"
  28. environment:
  29. POSTGRES_PASSWORD: 'xxx'
  30. # volumes:
  31. # - /Volumes/DATA/docker_volume/pgdata:/var/lib/postgresql/data
  32. keycloak:
  33. depends_on:
  34. - db
  35. image:
  36. <details>
  37. <summary>英文:</summary>
  38. We have dockerized Keycloak v16 and now we would like to migrate to a version v21.
  39. We uses Postgres database and we have inside this database already created realms and users.
  40. When we upgraded to a v21 everything works except that Keycloak shows that realms are empty and users as well.
  41. If I inspect database, all users and realms are still there...
  42. How to tell Keycloak to read old realms and users?
  43. New docker file
  44. FROM quay.io/keycloak/keycloak:21.0.2
  45. COPY themes/ /opt/jboss/keycloak/themes/
  46. ADD ./standalone-ha.xml /opt/jboss/keycloak/standalone/configuration/standalone-ha.xm
  47. standalone-ha.xml
  48. &lt;spi name=&quot;connectionsJpa&quot;&gt;
  49. &lt;provider name=&quot;default&quot; enabled=&quot;true&quot;&gt;
  50. &lt;properties&gt;
  51. &lt;property name=&quot;dataSource&quot; value=&quot;java:jboss/datasources/KeycloakDS&quot;/&gt;
  52. &lt;property name=&quot;initializeEmpty&quot; value=&quot;true&quot;/&gt;
  53. &lt;property name=&quot;migrationStrategy&quot; value=&quot;update&quot;/&gt;
  54. &lt;property name=&quot;migrationExport&quot; value=&quot;${jboss.home.dir}/keycloak-database-update.sql&quot;/&gt;
  55. &lt;property name=&quot;schema&quot; value=&quot;${env.DB_SCHEMA:public}&quot;/&gt;
  56. &lt;/properties&gt;
  57. &lt;/provider&gt;
  58. &lt;/spi&gt;
  59. docker-compose file
  60. keycloak:
  61. image: mykeycloak
  62. environment:
  63. DB_VENDOR: POSTGRES
  64. DB_ADDR: xxxx
  65. DB_DATABASE: keycloak
  66. DB_USER: postgres
  67. DB_SCHEMA: public
  68. DB_PASSWORD: xxxx
  69. KEYCLOAK_ADMIN: xxxx
  70. KEYCLOAK_ADMIN_PASSWORD: xxxx
  71. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  72. volumes:
  73. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  74. command: start-dev --http-relative-path /auth --spi-connections-jpa-legacy-migration-strategy=update
  75. ports:
  76. - 8080:8080
  77. EDIT:
  78. -----------
  79. I figure out that Keycloak is not connecting to a database. I always insert the same realms so I though that new and old are in same database.
  80. So the question is how to connect correctly to a Postgres container.
  81. I change the docker-compose file to a
  82. db:
  83. image: postgres:13.2
  84. ports:
  85. - &quot;5432:5432&quot;
  86. environment:
  87. POSTGRES_PASSWORD: &#39;xxx&#39;
  88. # volumes:
  89. # - /Volumes/DATA/docker_volume/pgdata:/var/lib/postgresql/data
  90. keycloak:
  91. depends_on:
  92. - db
  93. image: mykeycloak
  94. environment:
  95. KC_DB: postgres
  96. KC_DB_ADDR: db
  97. KC_DB_DATABASE: keycloak
  98. KC_DB_USER: postgres
  99. KC_DB_SCHEMA: public
  100. KC_DB_PASSWORD: xxx
  101. KEYCLOAK_ADMIN: keycloak_admin
  102. KEYCLOAK_ADMIN_PASSWORD: xxx
  103. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  104. volumes:
  105. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  106. command: start-dev --http-relative-path /auth
  107. ports:
  108. - 8080:8080
  109. now I get the error
  110. 2023-06-22 10:18:30 2023-06-22 08:18:30,593 WARN [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator] (JPA Startup Thread: keycloak-default) HHH000342: Could not obtain connection to query metadata: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  111. 2023-06-22 10:18:30 at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:319)
  112. 2023-06-22 10:18:30 at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
  113. 2023-06-22 10:18:30 at org.postgresql.jdbc.PgConnection.&lt;init&gt;(PgConnection.java:247)
  114. 2023-06-22 10:18:30 at org.postgresql.Driver.makeConnection(Driver.java:434)
  115. 2023-06-22 10:18:30 at org.postgresql.Driver.connect(Driver.java:291)
  116. 2023-06-22 10:18:30 at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
  117. 2023-06-22 10:18:30 at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
  118. 2023-06-22 10:18:30 at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
  119. 2023-06-22 10:18:30 at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
  120. 2023-06-22 10:18:30 at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)
  121. 2023-06-22 10:18:30 at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:232)
  122. 2023-06-22 10:18:30 at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:536)
  123. 2023-06-22 10:18:30 at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:517)
  124. 2023-06-22 10:18:30 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
  125. 2023-06-22 10:18:30 at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:75)
  126. 2023-06-22 10:18:30 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
  127. 2023-06-22 10:18:30 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
  128. 2023-06-22 10:18:30 at java.base/java.lang.Thread.run(Thread.java:833)
  129. 2023-06-22 10:18:30 Caused by: java.net.ConnectException: Connection refused
  130. 2023-06-22 10:18:30 at java.base/sun.nio.ch.Net.pollConnect(Native Method)
  131. 2023-06-22 10:18:30 at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672)
  132. 2023-06-22 10:18:30 at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542)
  133. 2023-06-22 10:18:30 at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
  134. 2023-06-22 10:18:30 at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
  135. 2023-06-22 10:18:30 at java.base/java.net.Socket.connect(Socket.java:633)
  136. 2023-06-22 10:18:30 at org.postgresql.core.PGStream.createSocket(PGStream.java:241)
  137. 2023-06-22 10:18:30 at org.postgresql.core.PGStream.&lt;init&gt;(PGStream.java:98)
  138. 2023-06-22 10:18:30 at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:109)
  139. 2023-06-22 10:18:30 at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
  140. 2023-06-22 10:18:30 ... 17 more
  141. 2023-06-22 10:18:30
  142. </details>
  143. # 答案1
  144. **得分**: 0
  145. # 对于仍然遇到这个问题的人:
  146. 我发现这个 Docker 镜像在连接到外部的 Postgres 数据库时没有报错,而是默默地失败了。
  147. 因为没有错误,我以为连接已经建立,但我错了。
  148. ### 在新版本中,添加了新的环境参数
  149. 连接 Postgres 数据库到 Keycloak Docker 镜像的正确参数是:
  150. ```yaml
  151. keycloak:
  152. depends_on:
  153. - db
  154. image: quay.io/keycloak/keycloak:21.0.2
  155. environment:
  156. KC_DB: postgres
  157. KC_DB_ADDR: db
  158. KC_DB_URL_DATABASE: keycloak
  159. KC_DB_URL_HOST: db
  160. KC_DB_URL_PORT: 5432
  161. KC_DB_SCHEMA: public
  162. KC_DB_USERNAME: XXX
  163. KC_DB_PASSWORD: XXX
  164. KEYCLOAK_ADMIN: XXX
  165. KEYCLOAK_ADMIN_PASSWORD: XXX
  166. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  167. volumes:
  168. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  169. command: start-dev --http-relative-path /auth
  170. ports:
  171. - 8080:8080
英文:

For anyone still having this problem:

I discovered that this docker image silently failed to connect to an external Postgres database.

Because there was no error I assumed that the connection was established but I was wrong.

In the new version, new environment parameters was added

The correct parameters for connecting the postgres database to a Keycloak docker image are:

  1. keycloak:
  2. depends_on:
  3. - db
  4. image: quay.io/keycloak/keycloak:21.0.2
  5. environment:
  6. KC_DB: postgres
  7. KC_DB_ADDR: db
  8. KC_DB_URL_DATABASE: keycloak
  9. KC_DB_URL_HOST: db
  10. KC_DB_URL_PORT: 5432
  11. KC_DB_SCHEMA: public
  12. KC_DB_USERNAME: XXX
  13. KC_DB_PASSWORD: XXX
  14. KEYCLOAK_ADMIN: XXX
  15. KEYCLOAK_ADMIN_PASSWORD: XXX
  16. KEYCLOAK_FRONTEND_URL: http://localhost:8080/auth/
  17. volumes:
  18. - ./common/keycloak/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
  19. command: start-dev --http-relative-path /auth
  20. ports:
  21. - 8080:8080

huangapple
  • 本文由 发表于 2023年6月22日 13:41:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/76528871.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定