# Managed by Ansible — do not edit manually services: mail-db: image: postgres:{{ roundcube_db_version }} container_name: mail-db restart: unless-stopped environment: POSTGRES_USER: roundcube POSTGRES_PASSWORD: "{{ roundcube_db_password }}" POSTGRES_DB: roundcube volumes: - {{ mail_data_dir }}/db:/var/lib/postgresql/data networks: - mail_internal healthcheck: test: ["CMD-SHELL", "pg_isready -U roundcube"] interval: 10s timeout: 5s retries: 5 dovecot: image: dovecot/dovecot:{{ dovecot_version }} container_name: dovecot restart: unless-stopped volumes: - {{ mail_data_dir }}/dovecot.conf:/etc/dovecot/dovecot.conf:ro - {{ mail_data_dir }}/passwd:/etc/dovecot/passwd:ro - {{ mail_data_dir }}/maildir:/var/mail networks: - traefik_public - mail_internal labels: - "traefik.enable=true" # TCP router — Traefik terminates TLS on port 993 and forwards plain IMAP to port 143 - "traefik.tcp.routers.imaps.rule=HostSNI(`{{ domain_mail }}`)" - "traefik.tcp.routers.imaps.entrypoints=imaps" - "traefik.tcp.routers.imaps.tls.certresolver=letsencrypt" - "traefik.tcp.services.imaps.loadbalancer.server.port=143" {% if fetchmail_accounts | default([]) | length > 0 %} fetchmail: image: alpine:3 container_name: fetchmail restart: unless-stopped # apk add runs on each start — acceptable for a home server command: ["sh", "-c", "apk add --no-cache fetchmail && exec fetchmail --nodetach -f /etc/fetchmail/fetchmailrc"] volumes: - {{ mail_data_dir }}/fetchmailrc:/etc/fetchmail/fetchmailrc:ro networks: - traefik_public - mail_internal depends_on: - dovecot {% endif %} roundcube: image: roundcube/roundcubemail:{{ roundcube_version }} container_name: roundcube restart: unless-stopped environment: # Database ROUNDCUBEMAIL_DB_TYPE: pgsql ROUNDCUBEMAIL_DB_HOST: mail-db ROUNDCUBEMAIL_DB_PORT: "5432" ROUNDCUBEMAIL_DB_USER: roundcube ROUNDCUBEMAIL_DB_PASSWORD: "{{ roundcube_db_password }}" ROUNDCUBEMAIL_DB_NAME: roundcube # IMAP — local Dovecot container ROUNDCUBEMAIL_DEFAULT_HOST: "dovecot" ROUNDCUBEMAIL_DEFAULT_PORT: "143" # SMTP — outgoing mail server (leave empty if not configured) ROUNDCUBEMAIL_SMTP_SERVER: "{{ roundcube_smtp_host }}" ROUNDCUBEMAIL_SMTP_PORT: "{{ roundcube_smtp_port }}" # Security ROUNDCUBEMAIL_DES_KEY: "{{ roundcube_des_key }}" ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE: 25M networks: - traefik_public - mail_internal labels: - "traefik.enable=true" - "traefik.http.routers.mail.rule=Host(`{{ domain_mail }}`)" - "traefik.http.routers.mail.entrypoints=websecure" - "traefik.http.routers.mail.tls.certresolver=letsencrypt" - "traefik.http.services.mail.loadbalancer.server.port=80" - "traefik.http.routers.mail.middlewares=rate-limit@docker" depends_on: mail-db: condition: service_healthy dovecot: condition: service_started networks: traefik_public: external: true mail_internal: internal: true