Skip to content

Commit ac677f5

Browse files
committed
feat(lab-03): Jitsi Advanced -- JWT auth, coturn, resource limits
1 parent f882628 commit ac677f5

3 files changed

Lines changed: 278 additions & 80 deletions

File tree

.github/workflows/ci.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,29 @@ jobs:
137137
- name: Cleanup
138138
if: always()
139139
run: docker compose -f docker/docker-compose.lan.yml down -v
140+
141+
lab-03-smoke:
142+
name: Lab 03 - Jitsi Advanced (JWT auth, resource limits, coturn)
143+
runs-on: ubuntu-latest
144+
needs: validate
145+
continue-on-error: true
146+
steps:
147+
- uses: actions/checkout@v4
148+
- name: Install tools
149+
run: sudo apt-get install -y curl openssl
150+
- name: Validate advanced compose
151+
run: docker compose -f docker/docker-compose.advanced.yml config -q && echo "Advanced compose valid"
152+
- name: Start advanced stack
153+
run: docker compose -f docker/docker-compose.advanced.yml up -d
154+
- name: Wait for TURN server
155+
run: timeout 30 bash -c 'until timeout 3 bash -c "echo > /dev/tcp/localhost/3478" 2>/dev/null; do sleep 2; done'
156+
- name: Wait for Jitsi web
157+
run: timeout 120 bash -c 'until curl -sk https://localhost:8443/ -o /dev/null -w "%{http_code}" | grep -qE "^(200|301|302)"; do sleep 5; done'
158+
- name: Run Lab 08-03 test script
159+
run: bash tests/labs/test-lab-08-03.sh
160+
- name: Collect logs on failure
161+
if: failure()
162+
run: docker compose -f docker/docker-compose.advanced.yml logs
163+
- name: Cleanup
164+
if: always()
165+
run: docker compose -f docker/docker-compose.advanced.yml down -v

docker/docker-compose.advanced.yml

Lines changed: 154 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,164 @@
1-
# Lab 03 — Advanced Features: jitsi with TLS, resource limits, logging
2-
---
1+
# docker-compose.advanced.yml — Lab 08-03: Advanced Features
2+
# Jitsi with JWT authentication, coturn TURN server, and resource limits
3+
name: jitsi-advanced
4+
35
services:
4-
jitsi:
5-
image: jitsi/web:stable
6-
container_name: it-stack-jitsi
7-
restart: unless-stopped
6+
coturn:
7+
image: coturn/coturn:4.6
8+
container_name: jitsi-adv-coturn
9+
command: >
10+
-n
11+
--log-file=stdout
12+
--lt-cred-mech
13+
--fingerprint
14+
--realm=lab.local
15+
--user=jitsi:TurnPass1!
16+
--no-multicast-peers
17+
--cli-password=TurnCliPass1!
818
ports:
9-
- "443:$firstPort"
19+
- "3478:3478"
20+
- "3478:3478/udp"
21+
networks:
22+
- turn-net
23+
- jitsi-net
24+
deploy:
25+
resources:
26+
limits:
27+
cpus: "0.25"
28+
memory: 128M
29+
restart: unless-stopped
30+
31+
prosody:
32+
image: jitsi/prosody:stable-9753
33+
container_name: jitsi-adv-prosody
1034
environment:
11-
- IT_STACK_ENV=lab-03-advanced
12-
- TLS_ENABLED=true
13-
volumes:
14-
- jitsi_data:/var/lib/jitsi
15-
- ./certs:/etc/ssl/certs:ro
35+
AUTH_TYPE: jwt
36+
ENABLE_AUTH: 1
37+
ENABLE_GUESTS: 1
38+
APP_ID: jitsi
39+
APP_SECRET: JitsiJWT03!
40+
JWT_ALLOW_EMPTY: 0
41+
JWT_ENABLE_DOMAIN_VERIFICATION: "true"
42+
JICOFO_COMPONENT_SECRET: s3cr3t
43+
JICOFO_AUTH_PASSWORD: JicofoPass03!
44+
JVB_AUTH_PASSWORD: JvbPass03!
45+
JIGASI_XMPP_PASSWORD: JigasiPass03!
46+
JIBRI_RECORDER_PASSWORD: JibriPass03!
47+
JIBRI_XMPP_PASSWORD: JibriXmppPass03!
48+
XMPP_DOMAIN: lab.local
49+
XMPP_AUTH_DOMAIN: auth.lab.local
50+
XMPP_GUEST_DOMAIN: guest.lab.local
51+
XMPP_MUC_DOMAIN: muc.lab.local
52+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.lab.local
53+
XMPP_MODULES: ""
54+
XMPP_MUC_MODULES: ""
55+
XMPP_INTERNAL_MUC_MODULES: ""
56+
LOG_LEVEL: warn
57+
TZ: UTC
58+
networks:
59+
- jitsi-net
1660
deploy:
1761
resources:
1862
limits:
19-
cpus: "2.0"
20-
memory: G
21-
logging:
22-
driver: json-file
23-
options:
24-
max-size: "100m"
25-
max-file: "5"
63+
cpus: "0.25"
64+
memory: 256M
65+
restart: unless-stopped
66+
67+
jicofo:
68+
image: jitsi/jicofo:stable-9753
69+
container_name: jitsi-adv-jicofo
70+
environment:
71+
AUTH_TYPE: jwt
72+
ENABLE_AUTH: 1
73+
JICOFO_COMPONENT_SECRET: s3cr3t
74+
JICOFO_AUTH_PASSWORD: JicofoPass03!
75+
JVB_AUTH_PASSWORD: JvbPass03!
76+
XMPP_DOMAIN: lab.local
77+
XMPP_AUTH_DOMAIN: auth.lab.local
78+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.lab.local
79+
XMPP_SERVER: prosody
80+
TZ: UTC
2681
networks:
27-
- it-stack-net
82+
- jitsi-net
83+
depends_on:
84+
- prosody
85+
deploy:
86+
resources:
87+
limits:
88+
cpus: "0.25"
89+
memory: 256M
90+
restart: unless-stopped
2891

29-
networks:
30-
it-stack-net:
31-
driver: bridge
92+
jvb:
93+
image: jitsi/jvb:stable-9753
94+
container_name: jitsi-adv-jvb
95+
ports:
96+
- "10000:10000/udp"
97+
- "4443:4443"
98+
environment:
99+
JVB_AUTH_PASSWORD: JvbPass03!
100+
JVB_PORT: 10000
101+
JVB_TCP_HARVESTER_DISABLED: "true"
102+
XMPP_AUTH_DOMAIN: auth.lab.local
103+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.lab.local
104+
XMPP_SERVER: prosody
105+
JVB_STUN_SERVERS: ""
106+
DOCKER_HOST_ADDRESS: "127.0.0.1"
107+
TZ: UTC
108+
networks:
109+
- jitsi-net
110+
depends_on:
111+
- prosody
112+
deploy:
113+
resources:
114+
limits:
115+
cpus: "0.5"
116+
memory: 512M
117+
restart: unless-stopped
118+
119+
web:
120+
image: jitsi/web:stable-9753
121+
container_name: jitsi-adv-web
122+
ports:
123+
- "8443:443"
124+
- "8180:80"
125+
environment:
126+
AUTH_TYPE: jwt
127+
ENABLE_AUTH: 1
128+
ENABLE_GUESTS: 1
129+
APP_ID: jitsi
130+
APP_SECRET: JitsiJWT03!
131+
TOKEN_AUTH_URL: "https://localhost:8443/{room}"
132+
XMPP_DOMAIN: lab.local
133+
XMPP_AUTH_DOMAIN: auth.lab.local
134+
XMPP_GUEST_DOMAIN: guest.lab.local
135+
XMPP_MUC_DOMAIN: muc.lab.local
136+
XMPP_BOSH_URL_BASE: "http://prosody:5280"
137+
TZ: UTC
138+
ENABLE_COLIBRI_WEBSOCKET: 1
139+
ENABLE_TURN_SERVER: 1
140+
TURN_CREDENTIALS: "jitsi:TurnPass1!"
141+
TURN_HOST: coturn
142+
TURN_PORT: 3478
143+
volumes:
144+
- jitsi_adv_web:/config
145+
networks:
146+
- jitsi-net
147+
- turn-net
148+
depends_on:
149+
- prosody
150+
- jicofo
151+
- jvb
152+
deploy:
153+
resources:
154+
limits:
155+
cpus: "0.5"
156+
memory: 512M
157+
restart: unless-stopped
32158

33159
volumes:
34-
jitsi_data:
160+
jitsi_adv_web:
161+
162+
networks:
163+
jitsi-net:
164+
turn-net:

tests/labs/test-lab-08-03.sh

Lines changed: 98 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,113 @@
11
#!/usr/bin/env bash
2-
# test-lab-08-03.sh — Lab 08-03: Advanced Features
3-
# Module 08: Jitsi video conferencing
4-
# jitsi with TLS, resource limits, and production-grade configuration
2+
# test-lab-08-03.sh — Lab 08-03: Jitsi Advanced Features
3+
# Tests: JWT auth config, coturn, resource limits, HTTPS
54
set -euo pipefail
6-
7-
LAB_ID="08-03"
8-
LAB_NAME="Advanced Features"
9-
MODULE="jitsi"
105
COMPOSE_FILE="docker/docker-compose.advanced.yml"
11-
PASS=0
12-
FAIL=0
13-
14-
# ── Colors ────────────────────────────────────────────────────────────────────
15-
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
16-
CYAN='\033[0;36m'; NC='\033[0m'
17-
18-
pass() { echo -e "${GREEN}[PASS]${NC} $1"; ((PASS++)); }
19-
fail() { echo -e "${RED}[FAIL]${NC} $1"; ((FAIL++)); }
20-
info() { echo -e "${CYAN}[INFO]${NC} $1"; }
21-
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
22-
23-
echo -e "${CYAN}======================================${NC}"
24-
echo -e "${CYAN} Lab ${LAB_ID}: ${LAB_NAME}${NC}"
25-
echo -e "${CYAN} Module: ${MODULE}${NC}"
26-
echo -e "${CYAN}======================================${NC}"
27-
echo ""
6+
PASS=0; FAIL=0
7+
pass() { echo " [PASS] $1"; PASS=$((PASS+1)); }
8+
fail() { echo " [FAIL] $1"; FAIL=$((FAIL+1)); }
9+
section() { echo; echo "=== $1 ==="; }
2810

29-
# ── PHASE 1: Setup ────────────────────────────────────────────────────────────
30-
info "Phase 1: Setup"
31-
docker compose -f "${COMPOSE_FILE}" up -d
32-
info "Waiting 30s for ${MODULE} to initialize..."
33-
sleep 30
11+
section "Container health"
12+
for c in jitsi-adv-coturn jitsi-adv-prosody jitsi-adv-jicofo jitsi-adv-jvb jitsi-adv-web; do
13+
if docker inspect --format '{{.State.Running}}' "$c" 2>/dev/null | grep -q true; then
14+
pass "Container $c is running"
15+
else
16+
fail "Container $c is not running"
17+
fi
18+
done
3419

35-
# ── PHASE 2: Health Checks ────────────────────────────────────────────────────
36-
info "Phase 2: Health Checks"
20+
section "TURN server port"
21+
if timeout 5 bash -c 'echo > /dev/tcp/localhost/3478' 2>/dev/null; then
22+
pass "TURN server :3478 reachable"
23+
else
24+
fail "TURN server :3478 not reachable"
25+
fi
3726

38-
if docker compose -f "${COMPOSE_FILE}" ps | grep -q "running\|Up"; then
39-
pass "Container is running"
27+
section "Jitsi HTTPS endpoint"
28+
HTTP_CODE=$(curl -sk -o /dev/null -w '%{http_code}' https://localhost:8443/ 2>/dev/null) || HTTP_CODE="000"
29+
if echo "$HTTP_CODE" | grep -qE "^(200|301|302)"; then
30+
pass "Jitsi HTTPS :8443 returned $HTTP_CODE"
4031
else
41-
fail "Container is not running"
32+
fail "Jitsi HTTPS :8443 returned $HTTP_CODE"
4233
fi
4334

44-
# ── PHASE 3: Functional Tests ─────────────────────────────────────────────────
45-
info "Phase 3: Functional Tests (Lab 03 — Advanced Features)"
35+
section "External API JS"
36+
EXTAPI=$(curl -skf https://localhost:8443/external_api.js 2>/dev/null | head -1) || EXTAPI=""
37+
if [ -n "$EXTAPI" ]; then
38+
pass "external_api.js served"
39+
else
40+
fail "external_api.js not available"
41+
fi
4642

47-
# TODO: Add module-specific functional tests here
48-
# Example:
49-
# if curl -sf http://localhost:443/health > /dev/null 2>&1; then
50-
# pass "Health endpoint responds"
51-
# else
52-
# fail "Health endpoint not reachable"
53-
# fi
43+
section "JWT auth in web container env"
44+
WEB_ENV=$(docker inspect jitsi-adv-web --format '{{json .Config.Env}}' 2>/dev/null) || WEB_ENV="[]"
45+
if echo "$WEB_ENV" | grep -q '"ENABLE_AUTH=1"'; then
46+
pass "ENABLE_AUTH=1 set in jitsi-adv-web"
47+
else
48+
fail "ENABLE_AUTH=1 not found in jitsi-adv-web env"
49+
fi
50+
if echo "$WEB_ENV" | grep -q '"AUTH_TYPE=jwt"'; then
51+
pass "AUTH_TYPE=jwt set in jitsi-adv-web"
52+
else
53+
fail "AUTH_TYPE=jwt not found in jitsi-adv-web env"
54+
fi
55+
if echo "$WEB_ENV" | grep -q '"APP_ID=jitsi"'; then
56+
pass "APP_ID=jitsi set in jitsi-adv-web"
57+
else
58+
fail "APP_ID=jitsi not found in jitsi-adv-web env"
59+
fi
60+
if echo "$WEB_ENV" | grep -q '"APP_SECRET=JitsiJWT03!"'; then
61+
pass "APP_SECRET=JitsiJWT03! set in jitsi-adv-web"
62+
else
63+
fail "APP_SECRET not found in jitsi-adv-web env"
64+
fi
5465

55-
warn "Functional tests for Lab 08-03 pending implementation"
66+
section "JWT auth in prosody container env"
67+
PROSODY_ENV=$(docker inspect jitsi-adv-prosody --format '{{json .Config.Env}}' 2>/dev/null) || PROSODY_ENV="[]"
68+
if echo "$PROSODY_ENV" | grep -q '"AUTH_TYPE=jwt"'; then
69+
pass "AUTH_TYPE=jwt set in jitsi-adv-prosody"
70+
else
71+
fail "AUTH_TYPE=jwt not found in jitsi-adv-prosody env"
72+
fi
73+
if echo "$PROSODY_ENV" | grep -q '"ENABLE_GUESTS=1"'; then
74+
pass "ENABLE_GUESTS=1 set in jitsi-adv-prosody"
75+
else
76+
fail "ENABLE_GUESTS=1 not found in jitsi-adv-prosody env"
77+
fi
5678

57-
# ── PHASE 4: Cleanup ──────────────────────────────────────────────────────────
58-
info "Phase 4: Cleanup"
59-
docker compose -f "${COMPOSE_FILE}" down -v --remove-orphans
60-
info "Cleanup complete"
79+
section "Resource limits check"
80+
WEB_MEM=$(docker inspect jitsi-adv-web --format '{{.HostConfig.Memory}}' 2>/dev/null) || WEB_MEM="0"
81+
if [ "$WEB_MEM" = "536870912" ]; then
82+
pass "jitsi-adv-web memory limit = 512M (536870912 bytes)"
83+
else
84+
fail "jitsi-adv-web memory limit: expected 536870912, got $WEB_MEM"
85+
fi
86+
JVB_MEM=$(docker inspect jitsi-adv-jvb --format '{{.HostConfig.Memory}}' 2>/dev/null) || JVB_MEM="0"
87+
if [ "$JVB_MEM" = "536870912" ]; then
88+
pass "jitsi-adv-jvb memory limit = 512M (536870912 bytes)"
89+
else
90+
fail "jitsi-adv-jvb memory limit: expected 536870912, got $JVB_MEM"
91+
fi
6192

62-
# ── Results ───────────────────────────────────────────────────────────────────
63-
echo ""
64-
echo -e "${CYAN}======================================${NC}"
65-
echo -e " Lab ${LAB_ID} Complete"
66-
echo -e " ${GREEN}PASS: ${PASS}${NC} | ${RED}FAIL: ${FAIL}${NC}"
67-
echo -e "${CYAN}======================================${NC}"
93+
section "JVB log check"
94+
JVB_LOGS=$(docker logs jitsi-adv-jvb 2>&1 | tail -20) || JVB_LOGS=""
95+
if echo "$JVB_LOGS" | grep -qi "error\|JVB registration failed"; then
96+
fail "JVB logs show error: $(echo "$JVB_LOGS" | grep -i error | head -2)"
97+
else
98+
pass "JVB logs show no critical errors"
99+
fi
68100

69-
if [ "${FAIL}" -gt 0 ]; then
70-
exit 1
101+
section "TURN credentials in web config"
102+
if echo "$WEB_ENV" | grep -q "TURN_CREDENTIALS"; then
103+
pass "TURN_CREDENTIALS configured in web container"
104+
else
105+
fail "TURN_CREDENTIALS not found in web container env"
71106
fi
107+
108+
echo
109+
echo "====================================="
110+
echo " Jitsi Lab 08-03 Results"
111+
echo " PASS: $PASS FAIL: $FAIL"
112+
echo "====================================="
113+
[ "$FAIL" -eq 0 ] && exit 0 || exit 1

0 commit comments

Comments
 (0)