diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index 404c277..0000000 --- a/Caddyfile +++ /dev/null @@ -1,29 +0,0 @@ -# Caddy — reverse proxy для почтового сервера -# Автоматически получает HTTPS-сертификат от Let's Encrypt - -mail.jambotron.com { - # Статический фронтенд (Angular) - root * /usr/share/caddy - file_server - encode gzip - - # REST API — проксируем на Spring Boot - reverse_proxy /api/* mail-server:8080 { - header_up Host {host} - header_up X-Real-IP {remote_host} - header_up X-Forwarded-For {remote_host} - header_up X-Forwarded-Proto {scheme} - } - - # Логин и регистрация - reverse_proxy /login mail-server:8080 - reverse_proxy /register mail-server:8080 - - # Логи - log { - output file /var/log/caddy/access.log { - roll_size 50mb - roll_keep 5 - } - } -} diff --git a/README.md b/README.md index 00fe240..7eb8679 100644 --- a/README.md +++ b/README.md @@ -376,18 +376,65 @@ value: v=DKIM1; k=rsa; p=MIIBojANBgkqhkiG9w0BAQ... | **Attachment** | Имя, MIME-тип, размер, путь к файлу | | **Contact** | Имя, email, телефон, компания | +## Деплой на VPS + +### Caddy Docker Proxy + +Проект использует **Caddy Docker Proxy** для автоматического HTTPS и reverse proxy. Caddy сам генерирует конфиг из `labels` в `docker-compose.prod.yml` — отдельный Caddyfile не нужен. + +**Как это работает:** +- Контейнер `mail-server` имеет `labels` с настройками Caddy +- `lucaslorentz/caddy-docker-proxy` следит за Docker через socket и автоматически создаёт виртуальные хосты +- HTTPS-сертификат от Let's Encrypt получается автоматически + +**Ключевые labels:** + +| Label | Описание | +|-------|----------| +| `caddy: mail.jambotron.com` | Домен, на котором доступен сервис | +| `caddy.route.api.reverse_proxy` | Проксирует `/api/*` на Spring Boot (порт 8080) | +| `caddy.route.static.root` | Корневая директория для Angular фронтенда | +| `caddy.route.static.file_server` | Раздаёт статические файлы Angular | + +**Запуск на VPS:** + +```bash +# Клонируйте репозиторий +git clone https://gitea.jambotron.com/jambotron_gang/reactive-mail-server.git +cd reactive-mail-server + +# Соберите фронтенд +cd frontend && npm install && npx ng build --configuration=production +cd .. + +# Запустите +docker compose -f docker-compose.prod.yml up -d --build +``` + +**Перед запуском:** +1. Замените `mail.jambotron.com` на ваш домен в `docker-compose.prod.yml` +2. Настройте PTR (Reverse DNS) у хостера — IP → `mail.jambotron.com` +3. Добавьте DNS-записи: A (`mail` → IP), MX (`@` → `mail.jambotron.com`), TXT (`v=spf1 ip4: -all`) +4. Откройте порты: 80, 443, 25 (SMTP relay), 3025 (SMTP приём) + ## TODO - [x] Хэширование паролей (BCrypt) - [x] Аутентификация (JWT) -- [x] Приём SMTP (SubEtha SMTP встроенный сервер) +- [x] Приём SMTP (встроенный сервер на WebFlux TcpServer) - [x] IMAP-сервер (встроенный, порт 143) - [x] Вложения (загрузка/скачивание) - [x] Поиск по письмам (по теме, телу, отправителю, получателю) - [x] Angular фронтенд (v22 + Tailwind CSS + Synthwave дизайн) - [x] Антиспам (чёрный список отправителей) - [x] DKIM/SPF/DMARC (подпись, верификация, DNS-проверка) -- [ ] TLS шифрование +- [x] SMTP релей (доставка на внешнюю почту) +- [x] Контакты (адресная книга) +- [x] Reply / Forward +- [x] Пагинация писем +- [x] HTML/Markdown режим +- [x] Caddy Docker Proxy (автоматический HTTPS) +- [ ] TLS шифрование SMTP/IMAP ## Лицензия diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 42c4643..15d7318 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # PostgreSQL — база данных postgres: @@ -44,32 +42,46 @@ services: MAILSERVER_RELAY_PORT: 25 MAILSERVER_DKIM_DOMAIN: jambotron.com ports: - - "8080:8080" # REST API (через Caddy) - - "3025:3025" # SMTP входящие + - "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 — reverse proxy с HTTPS + # Caddy Docker Proxy — автоматически генерирует Caddyfile из labels caddy: - image: caddy:2-alpine + image: lucaslorentz/caddy-docker-proxy:2.8-alpine container_name: mail-caddy restart: unless-stopped - depends_on: - - mail-server ports: - "80:80" - "443:443" + - "443:443/udp" # ACME DNS-01 challenge volumes: - - ./Caddyfile:/etc/caddy/Caddyfile + - /var/run/docker.sock:/var/run/docker.sock:ro - caddy-data:/data - caddy-config:/config - - ./frontend/dist/frontend/browser:/usr/share/caddy + environment: + CADDY_DOCKER_CADDYFILE: "" + CADDY_DOCKER_AGREE: "true" + CADDY_DOCKER_TLS_DEFAULT_ROUTE: "true" volumes: pgdata: