Загрузить файлы в «/»
This commit is contained in:
@@ -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 полностью настроен и работает.
|
||||
Reference in New Issue
Block a user