services: # PostgreSQL — база данных postgres: image: postgres:16-alpine container_name: mail-postgres restart: unless-stopped environment: POSTGRES_DB: mailserver POSTGRES_USER: mail POSTGRES_PASSWORD: secret ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U mail"] interval: 10s timeout: 5s retries: 5 # Почтовый сервер (Spring Boot WebFlux) mail-server: build: context: ./backend dockerfile: Dockerfile container_name: mail-server restart: unless-stopped depends_on: postgres: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: prod SPRING_R2DBC_URL: r2dbc:postgresql://postgres:5432/mailserver SPRING_R2DBC_USERNAME: mail SPRING_R2DBC_PASSWORD: secret SPRING_FLYWAY_URL: jdbc:postgresql://postgres:5432/mailserver SPRING_FLYWAY_USER: mail SPRING_FLYWAY_PASSWORD: secret MAILSERVER_SMTP_HOSTNAME: mail.jambotron.com MAILSERVER_SMTP_PORT: 3025 MAILSERVER_RELAY_ENABLED: "true" MAILSERVER_RELAY_PORT: 25 MAILSERVER_DKIM_DOMAIN: jambotron.com ports: - "3025:3025" # SMTP входящие (не через Caddy) volumes: - attachments:/app/attachments - dkim-keys:/app/dkim-keys - ./frontend/dist/frontend/browser:/usr/share/caddy # Статический фронтенд healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] interval: 30s timeout: 5s retries: 3 labels: # Caddy Docker Proxy — автоматический HTTPS + reverse proxy caddy: mail.jambotron.com caddy.route.api.reverse_proxy: "*{{upstreams 8080}}" caddy.route.api.header_up.Host: "{host}" caddy.route.api.header_up.X-Real-IP: "{remote_host}" caddy.route.api.header_up.X-Forwarded-For: "{remote_host}" caddy.route.api.header_up.X-Forwarded-Proto: "{scheme}" # Статический фронтенд (Angular) — file_server для всех остальных путей caddy.route.static.root: "* /usr/share/caddy" caddy.route.static.file_server: "*" caddy.route.static.encode: "gzip" # Caddy Docker Proxy — автоматически генерирует Caddyfile из labels caddy: image: lucaslorentz/caddy-docker-proxy:2.8-alpine container_name: mail-caddy restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" # ACME DNS-01 challenge volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - caddy-data:/data - caddy-config:/config environment: CADDY_DOCKER_CADDYFILE: "" CADDY_DOCKER_AGREE: "true" CADDY_DOCKER_TLS_DEFAULT_ROUTE: "true" volumes: pgdata: attachments: dkim-keys: caddy-data: caddy-config: