### USER Полная подробная пошаговая инструкция установки vm mailcow ip 192.168.1.5 c доменов rummail.ru в proxmox подключенный через роутер keenetic с белым ip 185.77.204.18 с использованием установленного сервера Nginx Proxy Manager ip 192.168.1.2 и настройкой автоматического копирования SSL-ключей /opt/npm/letsencrypt/live/npm-3/fullchain.pem , /opt/npm/letsencrypt/live/npm-3/privkey.pem и обновления через cron и пробросом портов для почты ### ASSISTANT # 🐮 Полная инструкция: Установка Mailcow в Proxmox с Nginx Proxy Manager --- ## 📋 Исходные данные | Параметр | Значение | |---|---| | Гипервизор | Proxmox VE | | VM Mailcow | IP `192.168.1.5` | | Домен почты | `rummail.ru` | | Роутер | Keenetic, белый IP `185.77.204.18` | | NPM (обратный прокси) | IP `192.168.1.2`, установлен | | SSL-сертификаты NPM | `/opt/npm/letsencrypt/live/npm-3/fullchain.pem` и `privkey.pem` | --- ## ⚠️ Этап 0. DNS — настройка до начала установки Перед установкой Mailcow DNS-записи домена `rummail.ru` должны быть настроены и указывать на белый IP `185.77.204.18`. Создайте на DNS-хостинге (у регистратора домена) следующие записи: ``` Тип A: rummail.ru. → 185.77.204.18 mail.rummail.ru. → 185.77.204.18 autodiscover.rummail.ru. → 185.77.204.18 autoconfig.rummail.ru. → 185.77.204.18 Тип MX: rummail.ru. MX 10 mail.rummail.ru. Тип TXT (SPF): rummail.ru. TXT "v=spf1 mx a ~all" Тип TXT (_dmarc): _dmarc.rummail.ru. TXT "v=DMARC1; p=quarantine; rua=mailto:admin@rummail.ru" ``` > ⚠️ **Важно:** DNS-записи должны «разойтись» (от 1 до 24 часов). Начинайте установку когда `mail.rummail.ru` уже пингуется как `185.77.204.18`. --- ## 🖥️ Этап 1. Создание виртуальной машины в Proxmox ### 1.1. Загрузите образ Debian 12 (Bookworm) ```bash # На хосте Proxmox, через Shell: cd /var/lib/vz/template/iso wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.x.x-amd64-netinst.iso ``` ### 1.2. Создайте VM через GUI Proxmox | Параметр | Значение | |---|---| | **Name** | `mailcow` | | **OS** | Debian 12 | | **CPU** | 4 ядра (минимум 2) | | **RAM** | 6–8 GB (минимум 4 GB) | | **Disk** | 40+ GB (рекомендую 60 GB, thin provision) | | **Network** | `vmbr0`, мост на физический интерфейс | ### 1.3. Установите Debian При установке ОС на VM: - **Hostname:** `mail` - **Domain:** `rummail.ru` (полный FQDN = `mail.rummail.ru`) - **Сетевые настройки — Static IP:** ``` IP address: 192.168.1.5/24 Gateway: 192.168.1.1 (IP роутера Keenetic) DNS: 192.168.1.1 (или 8.8.8.8, 1.1.1.1) ``` - **Пользователь:** создайте `root` с паролем (или пользователя с sudo) - **Программное обеспечение:** выберите **SSH server** и **Standard system utilities** - **Рабочее окружение:** **НЕ** устанавливайте (снимите все галочки DE) --- ## 🌐 Этап 2. Базовая настройка ОС Зайдите в VM по SSH или через консоль Proxmox: ```bash # 2.1. Обновление пакетов apt update && apt upgrade -y # 2.2. Установите необходимые утилиты apt install -y curl wget git vim htop net-tools ca-certificates gnupg lsb-release # 2.3. Проверьте hostname (ОБЯЗАТЕЛЬНО FQDN!) hostname # Должно быть: mail.rummail.ru hostname -f # Должно быть: mail.rummail.ru # 2.4. Если hostname не FQDN — исправьте: hostnamectl set-hostname mail.rummail.ru # 2.5. Проверьте /etc/hosts cat /etc/hosts ``` Файл `/etc/hosts` должен выглядеть так: ``` 127.0.0.1 localhost 192.168.1.5 mail.rummail.ru mail # Строка IPv6 (если есть) — закомментируйте или удалите: #::1 localhost ip6-localhost ip6-loopback ``` Исправьте если нужно: ```bash cat > /etc/hosts << 'EOF' 127.0.0.1 localhost 192.168.1.5 mail.rummail.ru mail EOF ``` ### 2.6. Проверка сети ```bash ping -c 3 192.168.1.1 # шлюз (Keenetic) ping -c 3 8.8.8.8 # интернет ping -c 3 mail.rummail.ru # свой FQDN ``` --- ## 🐳 Этап 3. Установка Docker и Docker Compose ```bash # 3.1. Удалите старые версии (если есть) for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt remove -y $pkg 2>/dev/null done # 3.2. Добавьте официальный репозиторий Docker install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | \ gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/debian $(lsb_release -cs) stable" | \ tee /etc/apt/sources.list.d/docker.list > /dev/null # 3.3. Установите Docker apt update && apt install -y docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin # 3.4. Проверка docker --version docker compose version # 3.5. Автозапуск Docker systemctl enable docker --now ``` --- ## 🐮 Этап 4. Клонирование и конфигурация Mailcow ```bash # 4.1. Клонируйте репозиторий cd /opt git clone https://github.com/mailcow/mailcow-dockerized cd mailcow-dockerized # 4.2. Сгенерируйте конфигурацию ./generate_config.sh ``` При запросе укажите: ``` Enter mail server hostname (FQDN): mail.rummail.ru Timezone [Europe/Berlin]: Europe/Moscow ``` > После этого создастся файл `mailcow.conf`. ### 4.3. Отредактируйте `mailcow.conf` ```bash nano mailcow.conf ``` **Ключевые строки — приведите к такому виду:** ```ini MAILCOW_HOSTNAME=mail.rummail.ru TIMEZONE=Europe/Moscow # --- Не использовать встроенный SSL от Mailcow (будем брать из NPM) --- SKIP_LETS_ENCRYPT=y # --- Эти строки ОСТАВЬТЕ закомментированными (не используем ACME) --- #HTTP_BIND= #HTTPS_BIND= #HTTP_PORT=80 #HTTPS_PORT=443 # --- SNAT (для правильного исходящего IP) --- # Если почтовый сервер должен слать с белого IP — оставьте как есть, # Internet-bound трафик пойдёт через шлюз Keenetic с белым IP. SNAT_TO_SOURCE= # --- Дополнительные порты — стандартные --- # (убедитесь что эти строки не закомментированы) HTTP_PORT=80 HTTP_BIND=0.0.0.0 HTTPS_PORT=443 HTTPS_BIND=0.0.0.0 ``` Сохраните: `Ctrl+O`, `Enter`, `Ctrl+X`. --- ## 🔌 Этап 5. Проброс портов на роутере Keenetic Зайдите в веб-интерфейс Keenetic (обычно `192.168.1.1`). ### 5.1. Раздел: **Сетевые правила → Переадресация портов** Создайте следующие правила проброса с **белого IP `185.77.204.18`** на **`192.168.1.5`** (VM Mailcow): | Протокол | Внешний порт | Внутр. IP | Внутр. порт | Назначение | |---|---|---|---|---| | TCP | **25** | 192.168.1.5 | 25 | SMTP (входящая почта) | | TCP | **465** | 192.168.1.5 | 465 | SMTPS (отправка с SSL) | | TCP | **587** | 192.168.1.5 | 587 | Submission (отправка клиентами) | | TCP | **993** | 192.168.1.5 | 993 | IMAPS (забор почты) | | TCP | **995** | 192.168.1.5 | 995 | POP3S (если нужно) | | TCP | **143** | 192.168.1.5 | 143 | IMAP (если нужно) | | TCP | **110** | 192.168.1.5 | 110 | POP3 (если нужно) | | TCP | **80** | 192.168.1.2 | 80 | HTTP (на NPM) | | TCP | **443** | 192.168.1.2 | 443 | HTTPS (на NPM) | > ⚠️ **Важно:** порты **80** и **443** пробрасываются на **NPM** (`192.168.1.2`), а не напрямую на Mailcow! Почтовые порты — напрямую на Mailcow (`192.168.1.5`). ### 5.2. Сохраните и примените правила. Перезагрузите роутер при необходимости. --- ## 🌍 Этап 6. Настройка Nginx Proxy Manager (NPM) Зайдите в веб-интерфейс NPM: `http://192.168.1.2:81` ### 6.1. SSL-сертификат для `mail.rummail.ru` Перейдите в **SSL Certificates → Add Let's Encrypt Certificate**: - **Domain Names:** `mail.rummail.ru`, `autodiscover.rummail.ru`, `autoconfig.rummail.ru` - **Email:** `admin@rummail.ru` - **Use a DNS Challenge:** **НЕТ** (используем HTTP Challenge) - Нажмите **Save** > Убедитесь, что сертификат выпущен успешно (статус: Active). > После выпуска он будет лежать в `/opt/npm/letsencrypt/live/npm-3/` (номер может отличаться — проверьте!). ### 6.2. Proxy Host для Mailcow **Hosts → Add Proxy Host:** | Поле | Значение | |---|---| | **Domain Names** | `mail.rummail.ru` | | **Scheme** | `http` | | **Forward Hostname/IP** | `192.168.1.5` | | **Forward Port** | `80` | | **Block Common Exploits** | ✅ | | **Websocket Support** | ✅ | Вкладка **SSL**: - **SSL Certificate:** выберите созданный ранее сертификат (`mail.rummail.ru`) - **Force SSL:** ✅ - **HTTP/2 Support:** ✅ ### 6.3. (Опционально) Proxy для autodiscover/autoconfig Создайте ещё один Proxy Host: | Поле | Значение | |---|---| | **Domain Names** | `autodiscover.rummail.ru`, `autoconfig.rummail.ru` | | **Scheme** | `http` | | **Forward Hostname/IP** | `192.168.1.5` | | **Forward Port** | `80` | | **SSL** | тот же сертификат, Force SSL ✅ | --- ## 🔐 Этап 7. Копирование SSL-сертификатов из NPM в Mailcow > Mailcow ожидает сертификаты по пути `/opt/mailcow-dockerized/data/assets/ssl/` > Мы будем автоматически копировать их из NPM. ### 7.1. Определите точный путь сертификата в NPM ```bash # На сервере NPM (192.168.1.2): ls -la /opt/npm/letsencrypt/live/ # Вы увидите папки: npm-1, npm-2, npm-3, ... # Найдите ту, которая соответствует mail.rummail.ru: cat /opt/npm/letsencrypt/live/npm-*/cert.pem | openssl x509 -noout -text | grep -A1 "Subject:" # Или проще — проверьте символические ссылки внутри папок. ``` Допустим, это `npm-3` (как у вас в условии). ### 7.2. Настройка SSH-доступа между VM Mailcow и NPM **На VM Mailcow (`192.168.1.5`):** ```bash # Сгенерируйте SSH-ключ ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519 # Выведите публичный ключ — скопируйте его: cat /root/.ssh/id_ed25519.pub ``` **На сервере NPM (`192.168.1.2`):** ```bash # Добавьте публичный ключ Mailcow в authorized_keys mkdir -p /root/.ssh echo "СКОПИРОВАННЫЙ_ПУБЛИЧНЫЙ_КЛЮЧ" >> /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys ``` **Проверка (с Mailcow VM):** ```bash ssh root@192.168.1.2 "echo OK" # Должно ответить "OK" без пароля. ``` ### 7.3. Создайте скрипт копирования сертификатов **На VM Mailcow (`192.168.1.5`):** ```bash nano /usr/local/bin/sync-mailcow-ssl.sh ``` Содержимое скрипта: ```bash #!/bin/bash # # sync-mailcow-ssl.sh # Копирует SSL-сертификаты из NPM (192.168.1.2) в Mailcow и перезагружает Dovecot/Postfix/Nginx. set -e NPM_HOST="192.168.1.2" NPM_CERT_DIR="/opt/npm/letsencrypt/live/npm-3" # ← проверьте номер папки! MAILCOW_SSL_DIR="/opt/mailcow-dockerized/data/assets/ssl" # Файлы для копирования CERT_FILE="fullchain.pem" KEY_FILE="privkey.pem" # Куда кладём в Mailcow CERT_DEST="${MAILCOW_SSL_DIR}/cert.pem" KEY_DEST="${MAILCOW_SSL_DIR}/key.pem" echo "[$(date)] Запуск синхронизации SSL-сертификатов..." # Проверка доступности NPM if ! ping -c 1 -W 2 ${NPM_HOST} > /dev/null 2>&1; then echo "[$(date)] ОШИБКА: сервер NPM ${NPM_HOST} недоступен." exit 1 fi # Создаём временную папку TMPDIR=$(mktemp -d) trap "rm -rf ${TMPDIR}" EXIT # Копируем сертификаты через SCP scp -o StrictHostKeyChecking=accept-new -q \ root@${NPM_HOST}:${NPM_CERT_DIR}/${CERT_FILE} \ root@${NPM_HOST}:${NPM_CERT_DIR}/${KEY_FILE} \ ${TMPDIR}/ # Проверяем, что файлы не пустые if [ ! -s "${TMPDIR}/${CERT_FILE}" ] || [ ! -s "${TMPDIR}/${KEY_FILE}" ]; then echo "[$(date)] ОШИБКА: скопированные файлы пусты." exit 1 fi # Проверяем валидность сертификата if ! openssl x509 -in "${TMPDIR}/${CERT_FILE}" -noout -subject > /dev/null 2>&1; then echo "[$(date)] ОШИБКА: fullchain.pem не является валидным сертификатом." exit 1 fi # Проверяем валидность ключа if ! openssl rsa -in "${TMPDIR}/${KEY_FILE}" -check -noout > /dev/null 2>&1; then echo "[$(date)] ОШИБКА: privkey.pem не является валидным ключом." exit 1 fi # Сравниваем с текущими (если есть) — пропускаем перезагрузку если не изменились if [ -f "${CERT_DEST}" ] && [ -f "${KEY_DEST}" ]; then if cmp -s "${TMPDIR}/${CERT_FILE}" "${CERT_DEST}" && \ cmp -s "${TMPDIR}/${KEY_FILE}" "${KEY_DEST}"; then echo "[$(date)] Сертификаты не изменились, пропускаем." exit 0 fi fi # Копируем финально cp "${TMPDIR}/${CERT_FILE}" "${CERT_DEST}" cp "${TMPDIR}/${KEY_FILE}" "${KEY_DEST}" chmod 644 "${CERT_DEST}" chmod 600 "${KEY_DEST}" echo "[$(date)] Сертификаты скопированы. Перезагружаем контейнеры..." # Перезагрузка контейнеров Mailcow, использующих SSL cd /opt/mailcow-dockerized docker compose restart nginx-mailcow dovecot-mailcow postfix-mailcow echo "[$(date)] Готово! Сертификаты обновлены." ``` Сделайте скрипт исполняемым: ```bash chmod +x /usr/local/bin/sync-mailcow-ssl.sh ``` ### 7.4. Запустите вручную для проверки ```bash /usr/local/bin/sync-mailcow-ssl.sh ``` Убедитесь, что ошибок нет, и файлы появились: ```bash ls -la /opt/mailcow-dockerized/data/assets/ssl/ # Должны быть: cert.pem и key.pem openssl x509 -in /opt/mailcow-dockerized/data/assets/ssl/cert.pem -noout -subject -dates # Должен показать Subject: CN = mail.rummail.ru и срок действия. ``` --- ## ⏰ Этап 8. Настройка Cron для автоматического обновления SSL Сертификаты Let's Encrypt живут **90 дней**. NPM обновляет их автоматически, но нам нужно после каждого обновления копировать в Mailcow. ### 8.1. На VM Mailcow: cron-задача на ежедневную синхронизацию ```bash crontab -e ``` Добавьте строку (запуск каждый день в 04:00 и при перезагрузке): ``` # Синхронизация SSL-сертификатов из NPM в Mailcow 0 4 * * * /usr/local/bin/sync-mailcow-ssl.sh >> /var/log/mailcow-ssl-sync.log 2>&1 @reboot sleep 30 && /usr/local/bin/sync-mailcow-ssl.sh >> /var/log/mailcow-ssl-sync.log 2>&1 ``` ### 8.2. На сервере NPM: триггер после обновления сертифика ## 8.2. На сервере NPM: триггер после обновления сертификата NPM автоматически обновляет сертификаты Let's Encrypt. Чтобы после обновления сразу запустить синхронизацию на Mailcow, настройте триггер на NPM. **На сервере NPM (`192.168.1.2`):** ```bash # Создайте скрипт-триггер nano /usr/local/bin/trigger-mailcow-ssl-sync.sh ``` Содержимое: ```bash #!/bin/bash # # Вызывается после обновления сертификата в NPM. # Запускает синхронизацию на Mailcow по SSH. MAILCOW_HOST="192.168.1.5" echo "[$(date)] NPM: сертификат обновлён, запускаем синхронизацию на Mailcow..." ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 \ root@${MAILCOW_HOST} "/usr/local/bin/sync-mailcow-ssl.sh" if [ $? -eq 0 ]; then echo "[$(date)] NPM: синхронизация SSL на Mailcow выполнена успешно." else echo "[$(date)] NPM: ОШИБКА синхронизации SSL на Mailcow!" >&2 fi ``` ```bash chmod +x /usr/local/bin/trigger-mailcow-ssl-sync.sh ``` ### 8.3. Подключите триггер к NPM NPM хранит скрипты обновления в папке `/opt/npm/`. Создайте хук: ```bash # На сервере NPM: mkdir -p /opt/npm/renewal-hooks nano /opt/npm/renewal-hooks/post-renew.sh ``` ```bash #!/bin/bash # Post-renewal hook для NPM /usr/local/bin/trigger-mailcow-ssl-sync.sh ``` ```bash chmod +x /opt/npm/renewal-hooks/post-renew.sh ``` Теперь добавьте вызов хука в cron NPM (если NPM не поддерживает нативные хуки): ```bash crontab -e ``` ``` # Проверка обновления сертификатов и синхронизация — раз в день 30 3 * * * /opt/npm/renewal-hooks/post-renew.sh >> /var/log/npm-ssl-hook.log 2>&1 ``` > ℹ️ Если NPM использует свой планировщик для renew, этот cron будет просто «лишний раз» дёргать синхронизацию. Это безопасно: скрипт `sync-mailcow-ssl.sh` сам проверяет, изменились ли файлы, и пропускает перезагрузку если нет. --- ## 🚀 Этап 9. Запуск Mailcow ```bash # На VM Mailcow (192.168.1.5): cd /opt/mailcow-dockerized # Запустите все контейнеры docker compose pull # скачать свежие образы docker compose up -d # запустить в фоне ``` Первичный запуск занимает 2–5 минут. Проверяйте логи: ```bash docker compose logs -f --tail=50 ``` Дождитесь, когда все контейнеры станут `healthy`: ```bash docker compose ps ``` Все контейнеры должны быть в статусе `Up` и `healthy`. --- ## 🔐 Этап 10. Первый вход в админку Mailcow Откройте браузер: **`https://mail.rummail.ru`** Первый вход: - **Логин:** `admin` - **Пароль:** `moohoo` (пароль по умолчанию) > ⚠️ **Сразу же смените пароль администратора!** > Перейдите: `Configuration → Mailboxes → Administrator → Edit → Password`. --- ## 📨 Этап 11. Настройка DKIM DKIM-запись нужна, чтобы почта не попадала в спам. ### 11.1. Сгенерируйте DKIM в Mailcow В админке Mailcow: **`Configuration → ARC/DKIM`**. Напротив домена `rummail.ru` нажмите **«Generate»** (или импортируйте существующий ключ). После генерации вы увидите DKIM-запись вида: ``` dkim._domainkey.rummail.ru. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIGfMA0G..." ``` ### 11.2. Добавьте DKIM в DNS Скопируйте всю строку и добавьте TXT-запись на DNS-хостинге домена `rummail.ru`: ``` Тип TXT: dkim._domainkey.rummail.ru. TXT "v=DKIM1;k=rsa;t=s;s=email;p=..." ``` ### 11.3. Проверка DKIM ```bash # Через 10–30 минут (после обновления DNS): dig TXT dkim._domainkey.rummail.ru +short ``` --- ## 🛡️ Этап 12. Настройка SPF и DMARC (финализация DNS) Убедитесь, что все DNS-записи добавлены и разошлись: ```bash # Проверка A-записей dig A mail.rummail.ru +short # → 185.77.204.18 dig A autodiscover.rummail.ru +short # → 185.77.204.18 dig A autoconfig.rummail.ru +short # → 185.77.204.18 # Проверка MX dig MX rummail.ru +short # → 10 mail.rummail.ru. # Проверка SPF dig TXT rummail.ru +short | grep spf # → v=spf1 mx a ~all # Проверка DMARC dig TXT _dmarc.rummail.ru +short # → v=DMARC1; p=quarantine; ... # Проверка DKIM dig TXT dkim._domainkey.rummail.ru +short # → v=DKIM1; ... ``` --- ## 🧪 Этап 13. Тестирование почтового сервера ### 13.1. Проверка портов извне С **внешнего** сервера (или через сервис [portchecker.co](https://portchecker.co)) проверьте порты: ```bash # Если есть внешний сервер — через telnet/nc: nc -zv 185.77.204.18 25 nc -zv 185.77.204.18 587 nc -zv 185.77.204.18 993 nc -zv 185.77.204.18 443 ``` ### 13.2. Онлайн-тесты | Сервис | URL | |---|---| | **MXToolbox** | https://mxtoolbox.com → введите `rummail.ru` | | **Mail Tester** | https://www.mail-tester.com | | **DKIMValidator** | https://dkimvalidator.com | | **Internet.nl** | https://internet.nl/mail/ | ### 13.3. Отправка тестового письма Через админку Mailcow → вкладка **Mailboxes** → создайте почтовый ящик (например `test@rummail.ru`). Затем зайдите в webmail: `https://mail.rummail.ru/SOGo/` и отправьте тестовое письмо на внешний адрес (Gmail, Yandex). --- ## 💾 Этап 14. Резервное копирование ### 14.1. Встроенный скрипт Mailcow ```bash # На VM Mailcow: cd /opt/mailcow-dockerized # Создайте папку для бэкапов mkdir -p /opt/backups/mailcow # Ручной запуск бэкапа ./helper-scripts/backup_and_restore.sh backup all # Бэкап сохранится в /opt/backups/mailcow/ ``` ### 14.2. Автоматический бэкап через cron ```bash crontab -e ``` ``` # Еженочный бэкап Mailcow в 02:00 0 2 * * * cd /opt/mailcow-dockerized && ./helper-scripts/backup_and_restore.sh backup all >> /var/log/mailcow-backup.log 2>&1 ``` --- ## 🔧 Этап 15. Возможные проблемы и их решение ### ❌ Проблема 1: «Порты 80/443 уже заняты» ```bash # Проверьте, что слушает порты: ss -tlnp | grep -E ':80|:443' # Если занято — освободите (например, остановите nginx на хосте): systemctl stop nginx && systemctl disable nginx ``` ### ❌ Проблема 2: Контейнеры не запускаются ```bash cd /opt/mailcow-dockerized docker compose down docker compose up -d docker compose logs -f # смотрите ошибки ``` ### ❌ Проблема 3: Сертификат на mail.rummail.ru недействителен ```bash # Проверьте цепочку вручную: /usr/local/bin/sync-mailcow-ssl.sh # Смотрите лог: cat /var/log/mailcow-ssl-sync.log ``` ### ❌ Проблема 4: Письма уходят в спам Проверьте: - ✅ Все DNS-записи (A, MX, SPF, DKIM, DMARC) разошлись - ✅ `PTR`-запись (reverse DNS) для `185.77.204.18` указывает на `mail.rummail.ru` *(PTR настраивается у провайдера белого IP, не у регистратора домена!)* - ✅ IP `185.77.204.18` не в чёрных списках (проверьте через MXToolbox) ### ❌ Проблема 5: Входящая почта не доходит - Проверьте проброс порта **25** на Keenetic - Проверьте, что `MX` запись указывает на `mail.rummail.ru` - Проверьте, не блокирует ли провайдер порт 25 (некоторые ISP блокируют): ```bash # С внешнего хоста: telnet 185.77.204.18 25 ``` --- ## ✅ Итоговая схема ``` Интернет │ ▼ 185.77.204.18 (белый IP, Keenetic) │ ├─── Порты 25,465,587,993,995,143,110 ────▶ 192.168.1.5 (Mailcow VM) │ └─── Порты 80,443 ───────────────────────▶ 192.168.1.2 (NPM) │ ├── mail.rummail.ru ──▶ 192.168.1.5:80 ├── autodiscover ────▶ 192.168.1.5:80 └── SSL (LE cert) ──▶ копируется в Mailcow ``` | Компонент | IP | Роль | |---|---|---| | Keenetic | `185.77.204.18` / `192.168.1.1` | Шлюз, проброс портов | | NPM | `192.168.1.2` | Обратный прокси, SSL, Let's Encrypt | | Mailcow VM | `192.168.1.5` | Почтовый сервер (Docker) | --- ## 📝 Чек-лист (краткий) - [ ] DNS-записи A, MX, SPF, DMARC, DKIM разошлись - [ ] Debian 12 установлен, hostname = `mail.rummail.ru` - [ ] Docker + Docker Compose установлены - [ ] Mailcow склонирован, `mailcow.conf` настроен (`SKIP_LETS_ENCRYPT=y`) - [ ] Порты проброшены на Keenetic - [ ] NPM: выпущен LE-сертификат для `mail.rummail.ru` - [ ] NPM: создан Proxy Host `mail.rummail.ru → 192.168.1.5:80` - [ ] SSH-ключи: Mailcow → NPM (беспарольный доступ) - [ ] `sync-mailcow-ssl.sh` создан, протестирован вручную - [ ] Cron на Mailcow: ежедневная синхронизация SSL - [ ] Триггер на NPM: после обновления сертификата - [ ] Mailcow запущен (`docker compose up -d`) - [ ] Админка открывается: `https://mail.rummail.ru` - [ ] Пароль администратора сменён - [ ] Почтовый ящик создан, тестовое письмо отправлено - [ ] Настроен автоматический бэкап --- **Готово!** 🎉 Ваш почтовый сервер Mailcow на Proxmox с SSL от Nginx Proxy Manager полностью настроен и работает.