Files
webmail/integration/docker-compose.yml
T
Linus Rath fe61bd8e88 test: let the Stalwart integration suite run against other Stalwart images
The integration server was pinned to `stalwartlabs/stalwart:v0.16`. The
image is now the `STALWART_IMAGE` build argument (same default), passed
through `docker-compose.yml` and `integration/run-tests.sh`.

Stalwart 1.0 answers Principal/query with `forbidden` unless the Sharing
setting `allowDirectoryQueries` is on, which would stop the shared-folder
specs in their setup. The account plan turns it on (0.16 has the same
setting), and `principalIdByEmail` reports such a refusal clearly instead
of failing on an undefined list.
2026-09-25 19:33:37 +02:00

82 lines
3.2 KiB
YAML

name: bulwark-integration
# Integration-test backend for the Bulwark webmail. A single Stalwart mail
# server (JMAP + SMTP submission + IMAP), declaratively bootstrapped with the
# alice/bob/carol test mailboxes. The webmail itself is started by Playwright
# (webServer in playwright.integration.config.ts) so the dev-loop / debugger
# stays on the host; only the hard-to-provision mail backend is containerised.
services:
stalwart:
build:
context: stalwart
args:
# The Stalwart image the test server is built on (see run-tests.sh).
STALWART_IMAGE: ${STALWART_IMAGE:-stalwartlabs/stalwart:v0.16}
container_name: bulwark-it-stalwart
# JMAP + Webmail + admin on 8025, SMTP submission on 1025 (internal 587),
# IMAP on 1143 (internal 143). The browser talks JMAP to localhost:8025;
# the test harness submits mail over SMTP to localhost:1025.
ports:
- "8025:8080"
- "1025:587"
- "1143:143"
volumes:
- stalwart-data:/var/lib/stalwart
- stalwart-config:/etc/stalwart
environment:
STALWART_RECOVERY_ADMIN: ${STALWART_RECOVERY_ADMIN:?set in .env}
TEST_ACCOUNT_PASSWORD: ${TEST_ACCOUNT_PASSWORD:?set in .env}
healthcheck:
# /jmap/session answers 200 only once the account bootstrap has finished
# and the server is in normal mode.
test: ["CMD-SHELL", "curl -fsS -u alice@example.org:$${TEST_ACCOUNT_PASSWORD} http://127.0.0.1:8080/jmap/session >/dev/null || exit 1"]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
restart: unless-stopped
webmail:
build:
context: ..
dockerfile: integration/webmail.Dockerfile
container_name: bulwark-it-webmail
ports:
- "3000:3000"
volumes:
# Admin policy that turns on the cross-account Unified Mailbox feature
# gate (off by default), so the multi-account unified sync tests can
# exercise it. Read by /api/admin/policy -> usePolicyStore.isFeatureEnabled.
- ./webmail-config/policy.json:/app/data/admin/policy.json:ro
environment:
# Browser-facing JMAP URL. The browser (Playwright) reaches Stalwart on
# the host-published port; the webmail server never fetches this URL
# itself for trusted basic-auth logins, so it need not be container-
# reachable. Setting JMAP_SERVER_URL also puts the app in "env-managed"
# mode, which skips the first-run setup wizard.
JMAP_SERVER_URL: http://localhost:8025
STALWART_FEATURES: "true"
APP_NAME: "Bulwark Webmail (Integration)"
# Enables "Remember me" / settings-sync cookies. Not required for the
# sync tests but harmless and avoids noisy warnings.
SESSION_SECRET: integration-not-a-real-secret
LOG_LEVEL: info
depends_on:
stalwart:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/api/health"]
interval: 10s
timeout: 5s
retries: 30
# next dev compiles routes lazily; give the first boot ample runway.
start_period: 120s
restart: unless-stopped
volumes:
stalwart-data:
name: bulwark-it-stalwart-data
stalwart-config:
name: bulwark-it-stalwart-config