Docker Compose
> Исходные требования, сохранённые по темам. Рабочие команды и отличия реализации — в руководстве. Концептуальные примеры ниже не являются готовыми конфигурационными файлами.
Базовый compose должен выглядеть концептуально так:
name: mail
services:
postgres:
image: postgres:17-alpine
container_name: mail-postgres
restart: unless-stopped
environment:
POSTGRES_DB: stalwart
POSTGRES_USER: stalwart
POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
secrets:
- postgres_password
volumes:
- ${MAIL_ROOT}/data/postgres:/var/lib/postgresql/data
command:
- postgres
- -c
- shared_buffers=64MB
- -c
- max_connections=30
healthcheck:
test: ["CMD-SHELL", "pg_isready -U stalwart -d stalwart"]
interval: 30s
timeout: 5s
retries: 5
mem_limit: 384m
networks:
- mail
logging:
driver: json-file
options:
max-size: 10m
max-file: "3"
stalwart:
image: stalwartlabs/stalwart:v0.16
container_name: mail-stalwart
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
STALWART_PUBLIC_URL: https://${MAIL_FQDN}
secrets:
- postgres_password
- smtp2go_password
volumes:
- ${MAIL_ROOT}/data/stalwart-etc:/etc/stalwart
- ${MAIL_ROOT}/data/blobs:/var/lib/stalwart-blobs
ports:
# Internet SMTP
- "25:25"
# Только LAN/VPN
- "${LAN_IP}:587:587"
- "${LAN_IP}:993:993"
# WebUI, доступен NPM/LAN
- "${LAN_IP}:18080:8080"
mem_limit: 768m
networks:
- mail
logging:
driver: json-file
options:
max-size: 10m
max-file: "3"
networks:
mail:
driver: bridge
secrets:
postgres_password:
file: ${MAIL_ROOT}/secrets/postgres_password
smtp2go_password:
file: ${MAIL_ROOT}/secrets/smtp2go_password
В .env:
MAIL_ROOT=/mnt/omv/work/SMTP
LAN_IP=192.168.x.x
MAIL_FQDN=mail.example.com
Паролей в .env быть не должно.