Skip to content

Commit be59e04

Browse files
committed
feat(lab-05): Jitsi Advanced Integration -- Traefik reverse proxy, Keycloak JWT, coturn TURN, route registration
1 parent 347b86e commit be59e04

3 files changed

Lines changed: 330 additions & 82 deletions

File tree

.github/workflows/ci.yml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,31 @@ jobs:
187187
run: docker compose -f docker/docker-compose.sso.yml logs
188188
- name: Cleanup
189189
if: always()
190-
run: docker compose -f docker/docker-compose.sso.yml down -v
190+
run: docker compose -f docker/docker-compose.sso.yml down -v
191+
lab-05-smoke:
192+
name: Lab 05 -- Jitsi Advanced Integration (Traefik + Keycloak JWT)
193+
runs-on: ubuntu-latest
194+
needs: validate
195+
continue-on-error: true
196+
steps:
197+
- uses: actions/checkout@v4
198+
- name: Install tools
199+
run: sudo apt-get install -y curl
200+
- name: Validate integration compose
201+
run: docker compose -f docker/docker-compose.integration.yml config -q && echo "Integration compose valid"
202+
- name: Start integration stack
203+
run: docker compose -f docker/docker-compose.integration.yml up -d
204+
- name: Wait for Keycloak
205+
run: timeout 180 bash -c 'until curl -sf http://localhost:8107/health/ready | grep -q UP; do sleep 5; done'
206+
- name: Wait for Traefik
207+
run: timeout 60 bash -c 'until curl -sf http://localhost:8109/api/rawdata > /dev/null 2>&1; do sleep 5; done'
208+
- name: Wait for Jitsi Web
209+
run: timeout 180 bash -c 'until curl -sf http://localhost:8150/ | grep -qi "jitsi\|html"; do sleep 10; done'
210+
- name: Run Lab 08-05 test script
211+
run: bash tests/labs/test-lab-08-05.sh --no-cleanup
212+
- name: Collect logs on failure
213+
if: failure()
214+
run: docker compose -f docker/docker-compose.integration.yml logs
215+
- name: Cleanup
216+
if: always()
217+
run: docker compose -f docker/docker-compose.integration.yml down -v
Lines changed: 182 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,188 @@
1-
# Lab 05 — Advanced Integration: jitsi with full IT-Stack ecosystem
2-
---
1+
# docker-compose.integration.yml -- Lab 05: Advanced Integration
2+
# Jitsi + Traefik reverse proxy + Keycloak JWT auth + Coturn TURN server
3+
# Lab 05 tests: Traefik routing, JWT via Keycloak JWKS, TURN connectivity
4+
#
5+
# Ports:
6+
# 8150 -- Jitsi Web (direct)
7+
# 8180 -- Traefik HTTP entrypoint
8+
# 8107 -- Keycloak admin console
9+
# 8109 -- Traefik dashboard
10+
# 10001/udp -- JVB media
11+
# 3478 -- Coturn STUN/TURN
12+
#
13+
# Credentials:
14+
# Keycloak: admin / Lab05Admin!
15+
# OIDC: jitsi / JitsiSSO05!
16+
# Jicofo: JicofoComp05! / JicofoAuth05!
17+
# JVB: JvbAuth05!
18+
# Coturn: TurnSecret05!
19+
320
services:
4-
jitsi:
5-
image: jitsi/web:stable
6-
container_name: it-stack-jitsi
7-
restart: unless-stopped
21+
jitsi-int-traefik:
22+
image: traefik:v3.0
23+
container_name: jitsi-int-traefik
24+
command:
25+
- "--api.insecure=true"
26+
- "--providers.docker=true"
27+
- "--providers.docker.exposedbydefault=false"
28+
- "--entrypoints.web.address=:80"
29+
- "--log.level=INFO"
30+
ports:
31+
- "8180:80"
32+
- "8109:8080"
33+
volumes:
34+
- /var/run/docker.sock:/var/run/docker.sock:ro
35+
networks:
36+
- jitsi-int-net
37+
healthcheck:
38+
test: ["CMD", "traefik", "healthcheck"]
39+
interval: 15s
40+
timeout: 5s
41+
retries: 5
42+
43+
jitsi-int-keycloak:
44+
image: quay.io/keycloak/keycloak:24.0
45+
container_name: jitsi-int-keycloak
46+
command: start-dev
47+
environment:
48+
KC_HEALTH_ENABLED: "true"
49+
KEYCLOAK_ADMIN: admin
50+
KEYCLOAK_ADMIN_PASSWORD: Lab05Admin!
851
ports:
9-
- "443:$firstPort"
52+
- "8107:8080"
53+
networks:
54+
- jitsi-int-net
55+
healthcheck:
56+
test: ["CMD-SHELL", "curl -sf http://localhost:8080/health/ready | grep -q UP || exit 1"]
57+
interval: 20s
58+
timeout: 10s
59+
retries: 10
60+
start_period: 60s
61+
62+
jitsi-int-coturn:
63+
image: coturn/coturn:latest
64+
container_name: jitsi-int-coturn
65+
command: >
66+
--lt-cred-mech
67+
--fingerprint
68+
--no-multicast-peers
69+
--static-auth-secret=TurnSecret05!
70+
--realm=jitsi-lab
71+
--no-tlsv1
72+
--no-tlsv1_1
73+
--min-port=49152
74+
--max-port=65535
75+
ports:
76+
- "3478:3478"
77+
- "3478:3478/udp"
78+
networks:
79+
- jitsi-int-net
80+
- jitsi-int-turn-net
81+
82+
jitsi-int-prosody:
83+
image: jitsi/prosody:stable
84+
container_name: jitsi-int-prosody
85+
depends_on:
86+
jitsi-int-keycloak:
87+
condition: service_healthy
1088
environment:
11-
- IT_STACK_ENV=lab-05-integration
12-
- KEYCLOAK_URL=
13-
- DB_HOST=
14-
- REDIS_HOST=
15-
- SMTP_HOST=
16-
- GRAYLOG_HOST=
17-
extra_hosts:
18-
- "lab-id1:10.0.50.11"
19-
- "lab-db1:10.0.50.12"
20-
- "lab-proxy1:10.0.50.15"
89+
AUTH_TYPE: jwt
90+
JWT_APP_ID: jitsi
91+
JWT_APP_SECRET: JitsiSSO05!
92+
JWT_ASAP_KEYSERVER: http://jitsi-int-keycloak:8080/realms/it-stack/protocol/openid-connect/certs
93+
JWT_ACCEPTED_ISSUERS: keycloak,localhost
94+
JWT_ACCEPTED_AUDIENCES: jitsi
95+
XMPP_DOMAIN: meet.jitsi
96+
XMPP_AUTH_DOMAIN: auth.meet.jitsi
97+
XMPP_MUC_DOMAIN: muc.meet.jitsi
98+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
99+
XMPP_GUEST_DOMAIN: guest.meet.jitsi
100+
JICOFO_COMPONENT_SECRET: JicofoComp05!
101+
JICOFO_AUTH_PASSWORD: JicofoAuth05!
102+
JVB_AUTH_PASSWORD: JvbAuth05!
103+
ENABLE_GUESTS: "1"
104+
TZ: UTC
105+
networks:
106+
- jitsi-int-net
107+
108+
jitsi-int-jicofo:
109+
image: jitsi/jicofo:stable
110+
container_name: jitsi-int-jicofo
111+
depends_on:
112+
- jitsi-int-prosody
113+
environment:
114+
XMPP_DOMAIN: meet.jitsi
115+
XMPP_SERVER: jitsi-int-prosody
116+
XMPP_AUTH_DOMAIN: auth.meet.jitsi
117+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
118+
JICOFO_COMPONENT_SECRET: JicofoComp05!
119+
JICOFO_AUTH_PASSWORD: JicofoAuth05!
120+
AUTH_TYPE: jwt
121+
JWT_APP_ID: jitsi
122+
TZ: UTC
123+
networks:
124+
- jitsi-int-net
125+
126+
jitsi-int-jvb:
127+
image: jitsi/jvb:stable
128+
container_name: jitsi-int-jvb
129+
depends_on:
130+
- jitsi-int-prosody
131+
environment:
132+
XMPP_SERVER: jitsi-int-prosody
133+
XMPP_DOMAIN: meet.jitsi
134+
XMPP_AUTH_DOMAIN: auth.meet.jitsi
135+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
136+
JVB_AUTH_PASSWORD: JvbAuth05!
137+
DOCKER_HOST_ADDRESS: 127.0.0.1
138+
TZ: UTC
139+
ports:
140+
- "10001:10000/udp"
141+
networks:
142+
- jitsi-int-net
143+
144+
jitsi-int-web:
145+
image: jitsi/web:stable
146+
container_name: jitsi-int-web
147+
depends_on:
148+
jitsi-int-keycloak:
149+
condition: service_healthy
150+
jitsi-int-traefik:
151+
condition: service_healthy
152+
environment:
153+
ENABLE_AUTH: "1"
154+
AUTH_TYPE: jwt
155+
JWT_APP_ID: jitsi
156+
JWT_APP_SECRET: JitsiSSO05!
157+
JWT_ASAP_KEYSERVER: http://jitsi-int-keycloak:8080/realms/it-stack/protocol/openid-connect/certs
158+
JWT_ACCEPTED_ISSUERS: keycloak,localhost
159+
JWT_ACCEPTED_AUDIENCES: jitsi
160+
TOKEN_AUTH_URL: http://jitsi-int-keycloak:8080/realms/it-stack/protocol/openid-connect/auth?client_id=jitsi&response_type=code
161+
ENABLE_GUESTS: "1"
162+
PUBLIC_URL: http://localhost:8180
163+
XMPP_DOMAIN: meet.jitsi
164+
XMPP_BOSH_URL_BASE: http://jitsi-int-prosody:5280
165+
XMPP_MUC_DOMAIN: muc.meet.jitsi
166+
TURN_CREDENTIALS: TurnSecret05!
167+
TURN_HOST: jitsi-int-coturn
168+
TURN_PORT: "3478"
169+
TZ: UTC
170+
labels:
171+
- "traefik.enable=true"
172+
- "traefik.http.routers.jitsi-int.rule=Host(`meet.localhost`)"
173+
- "traefik.http.routers.jitsi-int.entrypoints=web"
174+
- "traefik.http.services.jitsi-int.loadbalancer.server.port=80"
175+
ports:
176+
- "8150:80"
21177
networks:
22-
- it-stack-net
178+
- jitsi-int-net
179+
healthcheck:
180+
test: ["CMD", "curl", "-f", "http://localhost/"]
181+
interval: 20s
182+
timeout: 10s
183+
retries: 10
184+
start_period: 30s
23185

24186
networks:
25-
it-stack-net:
26-
driver: bridge
187+
jitsi-int-net:
188+
jitsi-int-turn-net:

0 commit comments

Comments
 (0)