28 KiB
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)
# На хосте 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:
# 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
Исправьте если нужно:
cat > /etc/hosts << 'EOF'
127.0.0.1 localhost
192.168.1.5 mail.rummail.ru mail
EOF
2.6. Проверка сети
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
# 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
# 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
nano mailcow.conf
Ключевые строки — приведите к такому виду:
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
# На сервере 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):
# Сгенерируйте SSH-ключ
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
# Выведите публичный ключ — скопируйте его:
cat /root/.ssh/id_ed25519.pub
На сервере NPM (192.168.1.2):
# Добавьте публичный ключ Mailcow в authorized_keys
mkdir -p /root/.ssh
echo "СКОПИРОВАННЫЙ_ПУБЛИЧНЫЙ_КЛЮЧ" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
Проверка (с Mailcow VM):
ssh root@192.168.1.2 "echo OK"
# Должно ответить "OK" без пароля.
7.3. Создайте скрипт копирования сертификатов
На VM Mailcow (192.168.1.5):
nano /usr/local/bin/sync-mailcow-ssl.sh
Содержимое скрипта:
#!/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)] Готово! Сертификаты обновлены."
Сделайте скрипт исполняемым:
chmod +x /usr/local/bin/sync-mailcow-ssl.sh
7.4. Запустите вручную для проверки
/usr/local/bin/sync-mailcow-ssl.sh
Убедитесь, что ошибок нет, и файлы появились:
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-задача на ежедневную синхронизацию
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):
# Создайте скрипт-триггер
nano /usr/local/bin/trigger-mailcow-ssl-sync.sh
Содержимое:
#!/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
chmod +x /usr/local/bin/trigger-mailcow-ssl-sync.sh
8.3. Подключите триггер к NPM
NPM хранит скрипты обновления в папке /opt/npm/. Создайте хук:
# На сервере NPM:
mkdir -p /opt/npm/renewal-hooks
nano /opt/npm/renewal-hooks/post-renew.sh
#!/bin/bash
# Post-renewal hook для NPM
/usr/local/bin/trigger-mailcow-ssl-sync.sh
chmod +x /opt/npm/renewal-hooks/post-renew.sh
Теперь добавьте вызов хука в cron NPM (если NPM не поддерживает нативные хуки):
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
# На VM Mailcow (192.168.1.5):
cd /opt/mailcow-dockerized
# Запустите все контейнеры
docker compose pull # скачать свежие образы
docker compose up -d # запустить в фоне
Первичный запуск занимает 2–5 минут. Проверяйте логи:
docker compose logs -f --tail=50
Дождитесь, когда все контейнеры станут healthy:
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
# Через 10–30 минут (после обновления DNS):
dig TXT dkim._domainkey.rummail.ru +short
🛡️ Этап 12. Настройка SPF и DMARC (финализация DNS)
Убедитесь, что все DNS-записи добавлены и разошлись:
# Проверка 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) проверьте порты:
# Если есть внешний сервер — через 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
# На 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
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 уже заняты»
# Проверьте, что слушает порты:
ss -tlnp | grep -E ':80|:443'
# Если занято — освободите (например, остановите nginx на хосте):
systemctl stop nginx && systemctl disable nginx
❌ Проблема 2: Контейнеры не запускаются
cd /opt/mailcow-dockerized
docker compose down
docker compose up -d
docker compose logs -f # смотрите ошибки
❌ Проблема 3: Сертификат на mail.rummail.ru недействителен
# Проверьте цепочку вручную:
/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 блокируют):
# С внешнего хоста: 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 полностью настроен и работает.