Загрузить файлы в «/»

This commit is contained in:
2026-07-12 19:26:50 +03:00
commit 67b6ca24a7
@@ -0,0 +1,815 @@
### 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 полностью настроен и работает.