Files
Mailcow/chat-📧 Установка Mailcow + NPM.md
T

815 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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** | 68 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 полностью настроен и работает.