Skip to content

Commit 3aa9728

Browse files
committed
feat: Phase 4 Lab 04 — SSO Integration (Keycloak + OpenLDAP)
1 parent 192a280 commit 3aa9728

3 files changed

Lines changed: 376 additions & 56 deletions

File tree

.github/workflows/ci.yml

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,4 +183,47 @@ run: bash tests/labs/test-lab-17-01.sh
183183

184184
- name: Cleanup
185185
if: always()
186-
run: docker compose -f docker/docker-compose.advanced.yml down -v
186+
run: docker compose -f docker/docker-compose.advanced.yml down -v
187+
188+
lab-04-smoke:
189+
name: Lab 04 -- GLPI SSO Integration (Keycloak SAML + OpenLDAP)
190+
runs-on: ubuntu-latest
191+
needs: validate
192+
continue-on-error: true
193+
steps:
194+
- uses: actions/checkout@v4
195+
196+
- name: Install tools
197+
run: sudo apt-get install -y curl default-mysql-client netcat-openbsd ldap-utils
198+
199+
- name: Validate SSO compose
200+
run: docker compose -f docker/docker-compose.sso.yml config -q && echo "SSO compose valid"
201+
202+
- name: Start SSO stack
203+
run: docker compose -f docker/docker-compose.sso.yml up -d
204+
205+
- name: Wait for MariaDB
206+
run: timeout 120 bash -c 'until docker exec glpi-s04-db mysqladmin ping -uroot -pRootLab04! --silent; do sleep 5; done'
207+
208+
- name: Wait for OpenLDAP
209+
run: timeout 120 bash -c 'until docker exec glpi-s04-ldap ldapsearch -x -H ldap://localhost -b dc=lab,dc=local -D cn=admin,dc=lab,dc=local -w LdapLab04! cn=admin >/dev/null 2>&1; do sleep 5; done'
210+
211+
- name: Wait for Keycloak
212+
run: timeout 300 bash -c 'until curl -sf http://localhost:8532/realms/master; do sleep 10; done'
213+
214+
- name: Wait for Mailhog
215+
run: timeout 60 bash -c 'until curl -sf http://localhost:8732/api/v2/messages; do sleep 5; done'
216+
217+
- name: Wait for GLPI app
218+
run: timeout 360 bash -c 'until curl -o /dev/null -sw "%{http_code}" http://localhost:8432/ | grep -q "^[234]"; do sleep 15; done'
219+
220+
- name: Run Lab 17-04 test script
221+
run: bash tests/labs/test-lab-17-04.sh --no-cleanup
222+
223+
- name: Collect logs on failure
224+
if: failure()
225+
run: docker compose -f docker/docker-compose.sso.yml logs
226+
227+
- name: Cleanup
228+
if: always()
229+
run: docker compose -f docker/docker-compose.sso.yml down -v

docker/docker-compose.sso.yml

Lines changed: 162 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,175 @@
1-
# Lab 04 — SSO Integration: glpi with Keycloak OIDC authentication
2-
---
1+
# =============================================================================
2+
# IT-Stack: GLPI — Lab 04: SSO Integration
3+
# Module 17 · Phase 4 · Lab 04
4+
# =============================================================================
5+
# Services: MariaDB · OpenLDAP · Keycloak · Mailhog · GLPI
6+
# Ports: App:8432 Keycloak:8532 LDAP:3897 Mailhog:8732
7+
# Credentials:
8+
# DB root: RootLab04!
9+
# GLPI DB: glpi / GlpiLab04!
10+
# GLPI UI: glpi / glpi (default)
11+
# Keycloak: admin / Admin04!
12+
# LDAP admin: cn=admin,dc=lab,dc=local / LdapLab04!
13+
# What's new vs Lab 03:
14+
# + OpenLDAP directory for LDAP authentication
15+
# + Keycloak 24 dev-mode as SAML/OIDC IdP (it-stack realm)
16+
# + GLPI LDAP env vars (GLPI_LDAP_*)
17+
# + Keycloak SAML metadata endpoint tested in Lab 04
18+
# =============================================================================
19+
20+
name: it-stack-glpi-lab04
21+
322
services:
4-
glpi:
5-
image: diouxx/glpi:latest
6-
container_name: it-stack-glpi
23+
24+
# ── MariaDB ──────────────────────────────────────────────────────────────
25+
glpi-s04-db:
26+
image: mariadb:10.11
27+
container_name: glpi-s04-db
728
restart: unless-stopped
8-
ports:
9-
- "80:$firstPort"
1029
environment:
11-
- IT_STACK_ENV=lab-04-sso
12-
- KEYCLOAK_URL=
13-
- KEYCLOAK_REALM=
14-
- KEYCLOAK_CLIENT_ID=glpi
15-
- KEYCLOAK_CLIENT_SECRET=
30+
MYSQL_ROOT_PASSWORD: RootLab04!
31+
MYSQL_DATABASE: glpi
32+
MYSQL_USER: glpi
33+
MYSQL_PASSWORD: GlpiLab04!
34+
volumes:
35+
- glpi-s04-db-data:/var/lib/mysql
36+
healthcheck:
37+
test: ["CMD", "mysqladmin", "ping", "-uroot", "-pRootLab04!", "--silent"]
38+
interval: 10s
39+
timeout: 5s
40+
retries: 15
1641
networks:
17-
- it-stack-net
42+
- glpi-s04-net
43+
deploy:
44+
resources:
45+
limits:
46+
memory: 512M
47+
cpus: "0.5"
1848

19-
# Local Keycloak for SSO lab (replace with lab-id1 in real env)
20-
keycloak:
21-
image: quay.io/keycloak/keycloak:24
22-
container_name: it-stack-glpi-keycloak
49+
# ── OpenLDAP ─────────────────────────────────────────────────────────────
50+
glpi-s04-ldap:
51+
image: osixia/openldap:1.5.0
52+
container_name: glpi-s04-ldap
53+
restart: unless-stopped
54+
environment:
55+
LDAP_ORGANISATION: "IT-Stack Lab"
56+
LDAP_DOMAIN: lab.local
57+
LDAP_ADMIN_PASSWORD: LdapLab04!
58+
LDAP_CONFIG_PASSWORD: ConfigLab04!
59+
LDAP_BASE_DN: dc=lab,dc=local
60+
LDAP_READONLY_USER: "true"
61+
LDAP_READONLY_USER_USERNAME: readonly
62+
LDAP_READONLY_USER_PASSWORD: ReadOnly04!
63+
ports:
64+
- "3897:389"
65+
volumes:
66+
- glpi-s04-ldap-data:/var/lib/ldap
67+
- glpi-s04-ldap-config:/etc/ldap/slapd.d
68+
healthcheck:
69+
test: ["CMD-SHELL", "ldapsearch -x -H ldap://localhost -b dc=lab,dc=local -D cn=admin,dc=lab,dc=local -w LdapLab04! cn=admin > /dev/null 2>&1 || exit 1"]
70+
interval: 10s
71+
timeout: 5s
72+
retries: 15
73+
networks:
74+
- glpi-s04-net
75+
deploy:
76+
resources:
77+
limits:
78+
memory: 256M
79+
cpus: "0.25"
80+
81+
# ── Keycloak ─────────────────────────────────────────────────────────────
82+
glpi-s04-kc:
83+
image: quay.io/keycloak/keycloak:24.0.3
84+
container_name: glpi-s04-kc
85+
restart: unless-stopped
2386
command: start-dev
2487
environment:
2588
KEYCLOAK_ADMIN: admin
26-
KEYCLOAK_ADMIN_PASSWORD: admin
89+
KEYCLOAK_ADMIN_PASSWORD: Admin04!
90+
KC_HEALTH_ENABLED: "true"
91+
KC_DB: dev-file
92+
KC_HOSTNAME_STRICT: "false"
93+
KC_HOSTNAME_STRICT_HTTPS: "false"
94+
KC_HTTP_ENABLED: "true"
2795
ports:
28-
- "8080:8080"
96+
- "8532:8080"
97+
healthcheck:
98+
test: ["CMD-SHELL", "curl -sf http://localhost:8080/realms/master || exit 1"]
99+
interval: 15s
100+
timeout: 10s
101+
retries: 20
102+
start_period: 30s
29103
networks:
30-
- it-stack-net
104+
- glpi-s04-net
105+
deploy:
106+
resources:
107+
limits:
108+
memory: 1G
109+
cpus: "1.0"
31110

111+
# ── Mailhog ──────────────────────────────────────────────────────────────
112+
glpi-s04-mail:
113+
image: mailhog/mailhog:latest
114+
container_name: glpi-s04-mail
115+
restart: unless-stopped
116+
ports:
117+
- "8732:8025"
118+
networks:
119+
- glpi-s04-net
120+
deploy:
121+
resources:
122+
limits:
123+
memory: 128M
124+
cpus: "0.1"
125+
126+
# ── GLPI ─────────────────────────────────────────────────────────────────
127+
glpi-s04-app:
128+
image: diouxx/glpi:latest
129+
container_name: glpi-s04-app
130+
restart: unless-stopped
131+
depends_on:
132+
glpi-s04-db:
133+
condition: service_healthy
134+
glpi-s04-ldap:
135+
condition: service_healthy
136+
ports:
137+
- "8432:80"
138+
environment:
139+
MYSQL_HOST: glpi-s04-db
140+
MYSQL_PORT: "3306"
141+
MYSQL_DATABASE: glpi
142+
MYSQL_USER: glpi
143+
MYSQL_PASSWORD: GlpiLab04!
144+
# LDAP configuration
145+
GLPI_LDAP_HOST: glpi-s04-ldap
146+
GLPI_LDAP_PORT: "389"
147+
GLPI_LDAP_BASE_DN: dc=lab,dc=local
148+
GLPI_LDAP_BIND_DN: cn=admin,dc=lab,dc=local
149+
GLPI_LDAP_BIND_PASSWORD: LdapLab04!
150+
# Keycloak SAML IdP reference
151+
KEYCLOAK_URL: http://glpi-s04-kc:8080
152+
KEYCLOAK_REALM: it-stack
153+
KEYCLOAK_CLIENT_ID: glpi
154+
volumes:
155+
- glpi-s04-app-data:/var/www/html/glpi/files
156+
networks:
157+
- glpi-s04-net
158+
deploy:
159+
resources:
160+
limits:
161+
memory: 512M
162+
cpus: "0.5"
163+
164+
# ── Networks ──────────────────────────────────────────────────────────────────
32165
networks:
33-
it-stack-net:
166+
glpi-s04-net:
167+
name: glpi-s04-net
34168
driver: bridge
169+
170+
# ── Volumes ───────────────────────────────────────────────────────────────────
171+
volumes:
172+
glpi-s04-db-data:
173+
glpi-s04-ldap-data:
174+
glpi-s04-ldap-config:
175+
glpi-s04-app-data:

0 commit comments

Comments
 (0)