services: caddy: image: caddy:2.11-alpine container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro,z - caddy-data:/data - caddy-config:/config networks: - services stalwart: image: stalwartlabs/stalwart:v0.16-alpine container_name: stalwart restart: unless-stopped ports: - "25:25" - "465:465" - "993:993" - "4190:4190" - "127.0.0.1:8080:8080" environment: - STALWART_RECOVERY_ADMIN - STALWART_PUBLIC_URL volumes: - stalwart-etc:/etc/stalwart - stalwart-data:/var/lib/stalwart networks: - services bulwark: image: ghcr.io/bulwarkmail/webmail:latest container_name: bulwark restart: unless-stopped ports: - "3000:3000" environment: - JMAP_SERVER_URL - SESSION_SECRET depends_on: - stalwart healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/api/health", ] interval: 30s timeout: 5s retries: 3 start_period: 10s volumes: - bulwark-settings:/app/data/settings - bulwark-config:/app/data/admin # rw during setup # - bulwark-config:/app/data/admin:ro # ro after setup - bulwark-state:/app/data/admin-state - bulwark-telemetry:/app/data/telemetry networks: - services volumes: caddy-data: caddy-config: stalwart-etc: stalwart-data: bulwark-settings: bulwark-config: bulwark-state: bulwark-telemetry: networks: services: