Files
vnctalk-prosody/docker-compose.yml
T
Stefan-Sanger 51504f8a6f fix: correct pytest paths for tester container
The tester container uses WORKDIR /tests, so 'tests/pytest.ini' resolves
to /tests/tests/pytest.ini which does not exist, causing FileNotFoundError
in CI. Use paths relative to /tests (pytest . -c pytest.ini) for all
in-container invocations: CI job, Makefile target, tester image CMD, and
docs. Host-run scripts are unchanged (they run from repo root).

Part-of: <http://gitlab.vnc.biz/uxf/vnctalk-prosody/-/merge_requests/3>
2026-07-15 17:59:12 +02:00

106 lines
3.8 KiB
YAML

# Test harness for vnctalk-prosody end-to-end verification.
#
# Brings up Prosody (built from this repo's Dockerfile), a local PostgreSQL,
# and a single aiohttp mock service that stands in for every external HTTP
# backend (auth, FCM, file-share, avatar upload). The optional `tester`
# service runs the pytest suite inside the compose network; for local dev the
# host can run pytest directly against the published ports.
#
# docker compose up -d --build postgres mocks prosody
# docker compose run --rm tester pytest . -v -c pytest.ini
#
# Env-var names below use the EXACT placeholders found in
# config/prosody.cfg.lua.template (snake_case ${fcm_api_url} / ${del_api_url}).
# test.sh historically passed camelCase fcmApiUrl/fcmDelUrl, which envsubst
# silently leaves unsubstituted — see test-improvement.md §1.2.
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: prosody
POSTGRES_USER: prosody
POSTGRES_PASSWORD: prosody
ports: ["5434:5432"] # 5434 on host (5433 often taken by a local PG)
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U prosody"]
interval: 2s
retries: 30
mocks:
build: ./tests/mocks
ports: ["8092:8080"] # host inspection of /__requests (8090 often taken)
environment:
AUTH_USERS: "user1@example.com:pass1,user2@example.com:pass2,admin@example.com:adminpw"
prosody:
build: .
# The image declares USER prosody, but startup.sh writes certs and the
# rendered config into /etc/prosody (root-owned). Production runs as root
# (run_as_root = true); mirror that here so the harness is self-contained.
user: "0:0"
depends_on:
postgres: { condition: service_healthy }
mocks: { condition: service_started }
ports:
- "5222:5222" # C2S
- "5280:5280" # HTTP (BOSH/WS/REST/admin)
- "${TELNET_HOST_PORT:-5582}:5582" # admin telnet
environment:
prosodyDomain: example.com
prosodyDBhost: postgres
prosodyDBname: prosody
prosodyDBuser: prosody
prosodyDBpass: prosody
hybridaAuthUrl: http://mocks:8080/auth
fcm_api_url: http://mocks:8080/fcm/notify
del_api_url: http://mocks:8080/delfile
fcmApiKey: test-fcm-key
fileShareBaseUrl: http://mocks:8080/share/
fileShareSecret: test-share-secret
avatarUploadUrl: http://mocks:8080/avatar/
avatarUploadUser: avatar
avatarUploadPass: avpw
DEFAULT_JITSI_CONFERENCE: conference.jitsi.test
log_slow_events_threshold: "1.5"
# Lower SMACKS hibernation window so test_10 can exercise expiry without
# waiting 5 minutes. startup.sh appends this to the rendered config when set.
SMACKS_HIBERNATION_TIME: "10"
C2S_STANZA_SIZE_LIMIT: "5242880"
S2S_STANZA_SIZE_LIMIT: "5242880"
healthcheck:
test: ["CMD", "/vnc/config/healthcheck.sh"]
interval: 5s
timeout: 3s
retries: 20
start_period: 10s
tester:
build: ./tests
profiles: ["ci"] # only started with --profile ci
depends_on: [prosody]
environment:
XMPP_HOST: prosody
XMPP_PORT: "5222"
XMPP_DOMAIN: example.com
MUC_DOMAIN: conference.example.com
XMPP_JID: user1@example.com
XMPP_PASSWORD: pass1
XMPP_JID2: user2@example.com
XMPP_PASSWORD2: pass2
REST_URL: http://prosody:5280/rest
BOSH_URL: http://prosody:5280/http-bind
WS_URL: ws://prosody:5280/xmpp-websocket
ADMIN_TELNET_HOST: prosody
PG_HOST: postgres
PG_USER: prosody
PG_PASSWORD: prosody
PG_DB: prosody
MOCK_URL: http://mocks:8080 # for side-effect assertions
volumes:
- ./tests:/tests
volumes:
pgdata: