services: listmonk: image: listmonk/listmonk:latest restart: unless-stopped ports: - "9000:9000" depends_on: db: condition: service_healthy command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"] environment: LISTMONK_app__address: 0.0.0.0:9000 LISTMONK_db__user: listmonk LISTMONK_db__password: {{ vault_listmonk.postgres_password }} LISTMONK_db__database: listmonk LISTMONK_db__host: db LISTMONK_db__port: 5432 LISTMONK_db__ssl_mode: disable LISTMONK_db__max_open: 25 LISTMONK_db__max_idle: 25 LISTMONK_db__max_lifetime: 300s TZ: Etc/UTC LISTMONK_ADMIN_USER: {{ vault_listmonk.admin_user }} LISTMONK_ADMIN_PASSWORD: {{ vault_listmonk.admin_password }} volumes: - uploads:/listmonk/uploads labels: glance.name: Listmonk glance.url: https://{{ subdomains.listmonk }}/ glance.description: Mailing list manager glance.id: listmonk db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: listmonk POSTGRES_PASSWORD: {{ vault_listmonk.postgres_password }} POSTGRES_DB: listmonk healthcheck: test: ["CMD-SHELL", "pg_isready -U listmonk"] interval: 10s timeout: 5s retries: 6 volumes: - listmonk-data:/var/lib/postgresql/data labels: glance.parent: listmonk glance.name: DB volumes: uploads: listmonk-data: networks: default: external: true name: {{ docker.network_name }}