Skip to content

Commit cdb187c

Browse files
committed
feat(lab-06): Jitsi Production Deployment -- resource limits, restart=always, persistent volumes, JWT metrics
1 parent be59e04 commit cdb187c

3 files changed

Lines changed: 359 additions & 97 deletions

File tree

.github/workflows/ci.yml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,32 @@ jobs:
214214
run: docker compose -f docker/docker-compose.integration.yml logs
215215
- name: Cleanup
216216
if: always()
217-
run: docker compose -f docker/docker-compose.integration.yml down -v
217+
run: docker compose -f docker/docker-compose.integration.yml down -v
218+
219+
lab-06-smoke:
220+
name: Lab 06 -- Jitsi Production Deployment (resource limits + JWT + metrics)
221+
runs-on: ubuntu-latest
222+
needs: validate
223+
continue-on-error: true
224+
steps:
225+
- uses: actions/checkout@v4
226+
- name: Install tools
227+
run: sudo apt-get install -y curl
228+
- name: Validate production compose
229+
run: docker compose -f docker/docker-compose.production.yml config -q && echo "Production compose valid"
230+
- name: Start production stack
231+
run: docker compose -f docker/docker-compose.production.yml up -d
232+
- name: Wait for Keycloak
233+
run: timeout 240 bash -c 'until curl -sf http://localhost:8207/health/ready | grep -q UP; do sleep 5; done'
234+
- name: Wait for Prosody
235+
run: timeout 180 bash -c 'until docker inspect jitsi-prod-prosody --format "{{.State.Health.Status}}" | grep -q healthy; do sleep 5; done'
236+
- name: Wait for Jitsi web
237+
run: timeout 300 bash -c 'until curl -sf http://localhost:8250/; do sleep 10; done'
238+
- name: Run Lab 08-06 test script
239+
run: bash tests/labs/test-lab-08-06.sh --no-cleanup
240+
- name: Collect logs on failure
241+
if: failure()
242+
run: docker compose -f docker/docker-compose.production.yml logs
243+
- name: Cleanup
244+
if: always()
245+
run: docker compose -f docker/docker-compose.production.yml down -v
Lines changed: 228 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,242 @@
1-
# Lab 06 — Production: jitsi HA-ready with monitoring and external volumes
2-
---
1+
x-logging: &default-logging
2+
driver: json-file
3+
options:
4+
max-size: "10m"
5+
max-file: "5"
6+
7+
x-jitsi-prod-jwt: &jitsi-prod-jwt
8+
JWT_AUTH_TYPE: token
9+
JWT_TOKEN_AUTH_MODULE: token
10+
JWT_APP_ID: jitsi-meet
11+
JWT_APP_SECRET: JitsiProd06!
12+
JWT_ACCEPTED_ISSUERS: jitsi-meet
13+
JWT_ACCEPTED_AUDIENCES: jitsi-meet
14+
315
services:
4-
jitsi:
5-
image: jitsi/web:stable
6-
container_name: it-stack-jitsi
16+
jitsi-prod-traefik:
17+
image: traefik:v3.0
18+
container_name: jitsi-prod-traefik
719
restart: always
20+
command:
21+
- --api.insecure=true
22+
- --providers.docker=true
23+
- --providers.docker.exposedByDefault=false
24+
- --entrypoints.web.address=:80
825
ports:
9-
- "443:$firstPort"
10-
environment:
11-
- IT_STACK_ENV=production
12-
- KEYCLOAK_URL=
13-
- DB_HOST=
14-
- REDIS_HOST=
15-
- GRAYLOG_HOST=
26+
- "8280:80"
27+
- "8209:8080"
1628
volumes:
17-
- jitsi_data:/var/lib/jitsi
18-
- /etc/ssl/certs:/etc/ssl/certs:ro
29+
- /var/run/docker.sock:/var/run/docker.sock:ro
30+
networks:
31+
- jitsi-prod-net
1932
deploy:
20-
replicas: 1
2133
resources:
2234
limits:
23-
cpus: "4.0"
24-
memory: G
25-
reservations:
35+
memory: 256m
36+
cpus: "0.5"
37+
logging: *default-logging
38+
healthcheck:
39+
test: ["CMD", "traefik", "healthcheck"]
40+
interval: 10s
41+
timeout: 5s
42+
retries: 5
43+
44+
jitsi-prod-keycloak:
45+
image: quay.io/keycloak/keycloak:24.0
46+
container_name: jitsi-prod-keycloak
47+
restart: always
48+
command: start-dev
49+
environment:
50+
KC_HEALTH_ENABLED: "true"
51+
KC_METRICS_ENABLED: "true"
52+
KEYCLOAK_ADMIN: admin
53+
KEYCLOAK_ADMIN_PASSWORD: Prod06Admin!
54+
ports:
55+
- "8207:8080"
56+
networks:
57+
- jitsi-prod-net
58+
deploy:
59+
resources:
60+
limits:
61+
memory: 1g
2662
cpus: "1.0"
27-
memory: 1G
28-
restart_policy:
29-
condition: any
30-
delay: 5s
31-
logging:
32-
driver: gelf
33-
options:
34-
gelf-address: "udp://${GRAYLOG_HOST}:12201"
35-
tag: "it-stack-jitsi"
63+
logging: *default-logging
3664
healthcheck:
37-
test: ["CMD-SHELL", "curl -sf http://localhost/health || exit 1"]
38-
interval: 30s
65+
test: ["CMD-SHELL", "curl -sf http://localhost:8080/health/ready | grep -q UP || exit 1"]
66+
interval: 20s
3967
timeout: 10s
40-
retries: 3
41-
start_period: 120s
68+
retries: 10
69+
start_period: 60s
70+
71+
jitsi-prod-coturn:
72+
image: coturn/coturn:latest
73+
container_name: jitsi-prod-coturn
74+
restart: always
75+
command: >
76+
--user=jitsi:JitsiProd06!
77+
--realm=lab.local
78+
--fingerprint
79+
--no-multicast-peers
80+
--no-cli
81+
ports:
82+
- "3479:3478/udp"
83+
- "3479:3478/tcp"
4284
networks:
43-
- it-stack-net
85+
- jitsi-prod-net
86+
deploy:
87+
resources:
88+
limits:
89+
memory: 256m
90+
cpus: "0.5"
91+
logging: *default-logging
4492

45-
networks:
46-
it-stack-net:
47-
external: true
48-
name: it-stack-production
93+
jitsi-prod-prosody:
94+
image: jitsi/prosody:stable-9286
95+
container_name: jitsi-prod-prosody
96+
restart: always
97+
environment:
98+
<<: *jitsi-prod-jwt
99+
XMPP_DOMAIN: meet.lab.local
100+
XMPP_AUTH_DOMAIN: auth.meet.lab.local
101+
XMPP_MUC_DOMAIN: muc.meet.lab.local
102+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.lab.local
103+
JICOFO_AUTH_PASSWORD: JitsiProd06!
104+
JVB_AUTH_PASSWORD: JitsiProd06!
105+
JIGASI_XMPP_PASSWORD: JitsiProd06!
106+
JIBRI_RECORDER_PASSWORD: JitsiProd06!
107+
JIBRI_XMPP_PASSWORD: JitsiProd06!
108+
TZ: UTC
109+
volumes:
110+
- jitsi-prod-prosody:/config
111+
networks:
112+
- jitsi-prod-net
113+
deploy:
114+
resources:
115+
limits:
116+
memory: 512m
117+
cpus: "0.5"
118+
logging: *default-logging
119+
healthcheck:
120+
test: ["CMD", "prosodyctl", "status"]
121+
interval: 15s
122+
timeout: 10s
123+
retries: 5
124+
start_period: 30s
125+
126+
jitsi-prod-jicofo:
127+
image: jitsi/jicofo:stable-9286
128+
container_name: jitsi-prod-jicofo
129+
restart: always
130+
depends_on:
131+
jitsi-prod-prosody:
132+
condition: service_healthy
133+
environment:
134+
XMPP_DOMAIN: meet.lab.local
135+
XMPP_AUTH_DOMAIN: auth.meet.lab.local
136+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.lab.local
137+
XMPP_SERVER: jitsi-prod-prosody
138+
JICOFO_AUTH_USER: focus
139+
JICOFO_AUTH_PASSWORD: JitsiProd06!
140+
JICOFO_ENABLE_HEALTH_CHECKS: "true"
141+
TZ: UTC
142+
volumes:
143+
- jitsi-prod-jicofo:/config
144+
networks:
145+
- jitsi-prod-net
146+
deploy:
147+
resources:
148+
limits:
149+
memory: 512m
150+
cpus: "0.5"
151+
logging: *default-logging
152+
153+
jitsi-prod-jvb:
154+
image: jitsi/jvb:stable-9286
155+
container_name: jitsi-prod-jvb
156+
restart: always
157+
depends_on:
158+
jitsi-prod-prosody:
159+
condition: service_healthy
160+
environment:
161+
XMPP_DOMAIN: meet.lab.local
162+
XMPP_AUTH_DOMAIN: auth.meet.lab.local
163+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.lab.local
164+
XMPP_SERVER: jitsi-prod-prosody
165+
JVB_AUTH_USER: jvb
166+
JVB_AUTH_PASSWORD: JitsiProd06!
167+
JVB_BREWERY_MUC: jvbbrewery
168+
JVB_PORT: "10000"
169+
JVB_TCP_HARVESTER_DISABLED: "true"
170+
DOCKER_HOST_ADDRESS: 127.0.0.1
171+
TZ: UTC
172+
ports:
173+
- "10002:10000/udp"
174+
volumes:
175+
- jitsi-prod-jvb:/config
176+
networks:
177+
- jitsi-prod-net
178+
deploy:
179+
resources:
180+
limits:
181+
memory: 1g
182+
cpus: "1.0"
183+
logging: *default-logging
184+
185+
jitsi-prod-web:
186+
image: jitsi/web:stable-9286
187+
container_name: jitsi-prod-web
188+
restart: always
189+
depends_on:
190+
jitsi-prod-prosody:
191+
condition: service_healthy
192+
jitsi-prod-jicofo:
193+
condition: service_started
194+
jitsi-prod-jvb:
195+
condition: service_started
196+
environment:
197+
<<: *jitsi-prod-jwt
198+
XMPP_DOMAIN: meet.lab.local
199+
XMPP_AUTH_DOMAIN: auth.meet.lab.local
200+
XMPP_MUC_DOMAIN: muc.meet.lab.local
201+
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.lab.local
202+
XMPP_BOSH_URL_BASE: http://jitsi-prod-prosody:5280
203+
JVB_TCP_HARVESTER_DISABLED: "true"
204+
ENABLE_REQUIRE_DISPLAY_NAME: "true"
205+
ENABLE_GUESTS: "false"
206+
TZ: UTC
207+
ports:
208+
- "8250:80"
209+
volumes:
210+
- jitsi-prod-web:/config
211+
- jitsi-prod-transcripts:/usr/share/jitsi-meet/transcripts
212+
networks:
213+
- jitsi-prod-net
214+
labels:
215+
- traefik.enable=true
216+
- traefik.http.routers.jitsi-prod.rule=Host(`meet.lab.local`)
217+
- traefik.http.routers.jitsi-prod.entrypoints=web
218+
- traefik.http.services.jitsi-prod.loadbalancer.server.port=80
219+
deploy:
220+
resources:
221+
limits:
222+
memory: 2g
223+
cpus: "2.0"
224+
reservations:
225+
memory: 512m
226+
logging: *default-logging
227+
healthcheck:
228+
test: ["CMD", "curl", "-f", "http://localhost:80/"]
229+
interval: 20s
230+
timeout: 10s
231+
retries: 10
232+
start_period: 60s
49233

50234
volumes:
51-
jitsi_data:
52-
external: true
53-
name: it-stack-jitsi-data
235+
jitsi-prod-prosody:
236+
jitsi-prod-jicofo:
237+
jitsi-prod-jvb:
238+
jitsi-prod-web:
239+
jitsi-prod-transcripts:
240+
241+
networks:
242+
jitsi-prod-net:

0 commit comments

Comments
 (0)