Skip to content

Commit 8fd954c

Browse files
committed
Added: custom Keycloak image with scripts for setting up SPI
1 parent 6279ca9 commit 8fd954c

4 files changed

Lines changed: 113 additions & 11 deletions

File tree

dev-env/docker-compose-dev.yml

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ services:
5353
DATAVERSE_AUTH_OIDC_CLIENT_ID: test
5454
DATAVERSE_AUTH_OIDC_CLIENT_SECRET: 94XHrfNRwXsjqTqApRrwWmhDLDHpIYV8
5555
DATAVERSE_AUTH_OIDC_AUTH_SERVER_URL: http://keycloak.mydomain.com:9080/realms/test
56+
DATAVERSE_FEATURE_API_BEARER_AUTH_USE_BUILTIN_USER_ON_ID_MATCH: 1
5657
JVM_ARGS: -Ddataverse.pid.providers=fake
5758
-Ddataverse.pid.default-provider=fake
5859
-Ddataverse.pid.fake.type=FAKE
@@ -182,28 +183,50 @@ services:
182183
- /mail:mode=770,size=128M,uid=1000,gid=1000
183184

184185
dev_keycloak:
185-
container_name: 'dev_keycloak'
186-
image: 'quay.io/keycloak/keycloak:21.0'
186+
container_name: "dev_keycloak"
187+
build:
188+
context: ./keycloak
189+
dockerfile: Dockerfile
190+
image: gdcc/keycloak
187191
hostname: keycloak
188-
command:
189-
- 'start-dev'
190-
- '--import-realm'
191192
environment:
192-
- KC_HTTP_PORT=9080
193-
- KC_HOSTNAME=localhost
194-
- KC_HOSTNAME_PORT=8000
195-
- KC_HOSTNAME_ADMIN_URL=http://localhost:8000
196193
- KEYCLOAK_ADMIN=kcadmin
197194
- KEYCLOAK_ADMIN_PASSWORD=kcpassword
198195
- KEYCLOAK_LOGLEVEL=DEBUG
196+
- KC_HOSTNAME_STRICT=false
197+
- KC_HOSTNAME=localhost
198+
- KC_HTTP_PORT=9080
199+
- KC_DB=postgres
200+
- KC_DB_URL=jdbc:postgresql://postgres:5432/dataverse
201+
- KC_DB_USERNAME=${DATAVERSE_DB_USER}
202+
- KC_DB_PASSWORD=secret
203+
- DATAVERSE_DB_HOST=postgres
204+
- DATAVERSE_DB_PORT=5432
205+
- DATAVERSE_DB_USER=${DATAVERSE_DB_USER}
206+
- DATAVERSE_DB_PASSWORD=secret
207+
- DATAVERSE_BASE_URL=http://dataverse:8080
199208
networks:
200209
dataverse:
201210
aliases:
202211
- keycloak.mydomain.com
212+
command: start-dev --verbose --import-realm
203213
expose:
204-
- 9080
214+
- '9000'
215+
- '9080'
216+
217+
dev_keycloak_initializer:
218+
image: alpine:latest
219+
container_name: "dev_keycloak_initializer"
220+
depends_on:
221+
- dev_keycloak
222+
environment:
223+
- KEYCLOAK_ADMIN=kcadmin
224+
- KEYCLOAK_ADMIN_PASSWORD=kcpassword
205225
volumes:
206-
- './keycloak/test-realm.json:/opt/keycloak/data/import/test-realm.json'
226+
- ./keycloak/setup-spi.sh:/usr/local/bin/setup-spi.sh
227+
command: [ "/bin/sh", "-c", "apk add --no-cache curl jq && /usr/local/bin/setup-spi.sh" ]
228+
networks:
229+
- dataverse
207230

208231
networks:
209232
dataverse:

dev-env/keycloak/Dockerfile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
FROM quay.io/keycloak/keycloak:26.1.4
2+
3+
# Add the Oracle JDBC jars
4+
ARG ORACLE_JDBC_VERSION=23.7.0.25.01
5+
ADD --chown=keycloak:keycloak https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc11/${ORACLE_JDBC_VERSION}/ojdbc11-${ORACLE_JDBC_VERSION}.jar /opt/keycloak/providers/ojdbc11.jar
6+
ADD --chown=keycloak:keycloak https://repo1.maven.org/maven2/com/oracle/database/nls/orai18n/${ORACLE_JDBC_VERSION}/orai18n-${ORACLE_JDBC_VERSION}.jar /opt/keycloak/providers/orai18n.jar
7+
8+
# Health build parameter
9+
ENV KC_HEALTH_ENABLED=true
10+
11+
# Copy SPI JAR
12+
COPY keycloak-dv-builtin-users-authenticator-1.0-SNAPSHOT.jar /opt/keycloak/providers/
13+
14+
# Copy additional configurations
15+
COPY quarkus.properties /opt/keycloak/conf/
16+
COPY test-realm.json /opt/keycloak/data/import/
17+
18+
# Set the Keycloak command
19+
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
20+
CMD ["start-dev", "--import-realm", "--http-port=9080"]
21+
22+
# Expose port 9080
23+
EXPOSE 9080
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
quarkus.datasource.user-store.db-kind=postgresql
2+
quarkus.datasource.user-store.jdbc.url=jdbc:postgresql://${DATAVERSE_DB_HOST}:${DATAVERSE_DB_PORT}/dataverse
3+
quarkus.datasource.user-store.username=${DATAVERSE_DB_USER}
4+
quarkus.datasource.user-store.password=${DATAVERSE_DB_PASSWORD}
5+
6+
quarkus.datasource.user-store.jdbc.driver=org.postgresql.Driver
7+
quarkus.datasource.user-store.jdbc.transactions=disabled
8+
quarkus.transaction-manager.unsafe-multiple-last-resources=allow
9+
10+
quarkus.datasource.user-store.jdbc.recovery.username=${DATAVERSE_DB_USER}
11+
quarkus.datasource.user-store.jdbc.recovery.password=${DATAVERSE_DB_PASSWORD}
12+
13+
quarkus.datasource.user-store.jdbc.xa-properties.serverName=${DATAVERSE_DB_HOST}
14+
quarkus.datasource.user-store.jdbc.xa-properties.portNumber=${DATAVERSE_DB_PORT}
15+
quarkus.datasource.user-store.jdbc.xa-properties.databaseName=dataverse

dev-env/keycloak/setup-spi.sh

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/bin/sh
2+
3+
echo "Waiting for Keycloak to be fully up..."
4+
5+
# Loop until the health check returns 200
6+
while true; do
7+
RESPONSE=$(curl -s -w "\n%{http_code}" "http://keycloak:9000/health")
8+
HTTP_BODY=$(echo "$RESPONSE" | head -n -1) # Extract response body
9+
HTTP_CODE=$(echo "$RESPONSE" | tail -n 1) # Extract HTTP status code
10+
11+
if [ "$HTTP_CODE" -eq 200 ]; then
12+
echo "Keycloak is up! (HTTP $HTTP_CODE)"
13+
break
14+
else
15+
echo "Health check failed (HTTP $HTTP_CODE). Response: $HTTP_BODY"
16+
sleep 5
17+
fi
18+
done
19+
20+
echo "Keycloak is up and running! Executing SPI setup script..."
21+
22+
# Obtain admin token
23+
ADMIN_TOKEN=$(curl -s -X POST "http://keycloak:9080/realms/master/protocol/openid-connect/token" \
24+
-H "Content-Type: application/x-www-form-urlencoded" \
25+
-d "username=$KEYCLOAK_ADMIN" \
26+
-d "password=$KEYCLOAK_ADMIN_PASSWORD" \
27+
-d "grant_type=password" \
28+
-d "client_id=admin-cli" | jq -r .access_token)
29+
30+
# Create user storage provider using the components endpoint
31+
curl -X POST "http://keycloak:9080/admin/realms/test/components" \
32+
-H "Authorization: Bearer $ADMIN_TOKEN" \
33+
-H "Content-Type: application/json" \
34+
-d '{
35+
"name": "Dataverse built-in users authentication",
36+
"providerId": "dv-builtin-users-authenticator",
37+
"providerType": "org.keycloak.storage.UserStorageProvider",
38+
"parentId": null
39+
}'
40+
41+
echo "Keycloak SPI configured in realm."

0 commit comments

Comments
 (0)