commit 67b6ca24a7e649304055caefc2a43960ca823d8e Author: host Date: Sun Jul 12 19:26:50 2026 +0300 Загрузить файлы в «/» diff --git a/chat-📧 Установка Mailcow + NPM.txt b/chat-📧 Установка Mailcow + NPM.txt new file mode 100644 index 0000000..538be02 --- /dev/null +++ b/chat-📧 Установка Mailcow + NPM.txt @@ -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** | 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 полностью настроен и работает. \ No newline at end of file