2026-07-17 23:20:34 +02:00
|
|
|
name: webmail
|
|
|
|
|
services:
|
|
|
|
|
postgres:
|
|
|
|
|
image: postgres:16
|
|
|
|
|
environment:
|
|
|
|
|
POSTGRES_USER: webmail
|
|
|
|
|
POSTGRES_PASSWORD: webmail_dev
|
|
|
|
|
POSTGRES_DB: webmail_dev
|
|
|
|
|
ports: ["127.0.0.1:5433:5432"]
|
|
|
|
|
volumes: [pgdata:/var/lib/postgresql/data]
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "pg_isready -U webmail -d webmail_dev"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
|
|
|
|
redis:
|
|
|
|
|
image: redis:7
|
|
|
|
|
ports: ["127.0.0.1:6380:6379"]
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
|
|
|
|
meilisearch:
|
|
|
|
|
image: getmeili/meilisearch:v1.8
|
|
|
|
|
environment:
|
|
|
|
|
MEILI_MASTER_KEY: dev_master_key_change_me
|
|
|
|
|
MEILI_ENV: development
|
|
|
|
|
ports: ["127.0.0.1:7700:7700"]
|
|
|
|
|
volumes: [meilidata:/meili_data]
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:7700/health | grep -q available"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
2026-07-18 19:53:31 +02:00
|
|
|
# Sync-engine v2 workers (refactor §1): two roles sharing one image. Scale the
|
|
|
|
|
# sync role with `--scale worker-sync=N` (lease protocol prevents double-owning).
|
|
|
|
|
worker-sync:
|
|
|
|
|
build: { context: ../backend }
|
|
|
|
|
command: ["python", "-m", "workers.run"]
|
|
|
|
|
environment: &worker-env
|
|
|
|
|
WORKER_ROLE: sync
|
|
|
|
|
APP_DOMAIN: dev.webmail.local
|
|
|
|
|
DATABASE_URL: postgresql+asyncpg://webmail:webmail_dev@postgres:5432/webmail_dev
|
|
|
|
|
REDIS_URL: redis://redis:6379/0
|
|
|
|
|
MASTER_KEY: CHANGE_ME_base64_32_bytes
|
|
|
|
|
BLOB_ROOT: /var/blobs
|
|
|
|
|
volumes: [blobs:/var/blobs]
|
|
|
|
|
ulimits: { nofile: 65536 }
|
|
|
|
|
depends_on:
|
|
|
|
|
postgres: { condition: service_healthy }
|
|
|
|
|
redis: { condition: service_healthy }
|
|
|
|
|
|
|
|
|
|
worker-jobs:
|
|
|
|
|
build: { context: ../backend }
|
|
|
|
|
command: ["python", "-m", "workers.run"]
|
|
|
|
|
environment:
|
|
|
|
|
<<: *worker-env
|
|
|
|
|
WORKER_ROLE: jobs
|
|
|
|
|
volumes: [blobs:/var/blobs]
|
|
|
|
|
ulimits: { nofile: 65536 }
|
|
|
|
|
depends_on:
|
|
|
|
|
postgres: { condition: service_healthy }
|
|
|
|
|
redis: { condition: service_healthy }
|
|
|
|
|
|
2026-07-17 23:20:34 +02:00
|
|
|
# Test mail servers (integration tests + manual dev against a throwaway mailbox)
|
|
|
|
|
greenmail:
|
|
|
|
|
image: greenmail/standalone:2.0.1
|
|
|
|
|
environment:
|
|
|
|
|
GREENMAIL_OPTS: >-
|
|
|
|
|
-Dgreenmail.setup.test.all -Dgreenmail.hostname=0.0.0.0
|
|
|
|
|
-Dgreenmail.users=dev:devpass@dev.local -Dgreenmail.verbose
|
|
|
|
|
ports:
|
|
|
|
|
- "127.0.0.1:3025:3025" # SMTP
|
|
|
|
|
- "127.0.0.1:3143:3143" # IMAP
|
|
|
|
|
- "127.0.0.1:3993:3993" # IMAPS
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
pgdata:
|
|
|
|
|
meilidata:
|
2026-07-18 19:53:31 +02:00
|
|
|
blobs:
|