21 KiB
📧 Почтовый сервер Mailcow (Olimp)
Дата обновления: 16.04.2026
Сервер: Olimp (Proxmox VE)
Контейнер: LXC 212 (mail)
Домен: zailon.ru
Внешний IP: 188.73.191.202
Внутренний IP: 192.168.1.212
Путь к данным: /mnt/mailcow/mailcow-dockerized
📋 Содержание
- Описание и архитектура
- Требования к ресурсам
- Подготовка контейнера
- Установка Mailcow
- Запуск и первичная настройка
- Настройка DNS
- Настройка Nginx Proxy Manager
- Проброс портов на роутере
- Настройка почтовых клиентов
- Полезные команды
- Решение проблем
- Безопасность и обслуживание
- Создание почтового ящика
1. Описание и архитектура
Mailcow — это готовый почтовый сервер на базе Docker, включающий:
| Компонент | Назначение |
|---|---|
| Postfix | Приём и отправка писем (SMTP) |
| Dovecot | Доступ к почте (IMAP/POP3) |
| SOGo | Веб-интерфейс (почта, календарь, контакты) |
| Rspamd | Антиспам-фильтр |
| ClamAV | Антивирусная проверка |
| Unbound | Локальный DNS-резолвер |
| MariaDB/Redis | Базы данных и кэш |
Архитектура развёртывания:
- Контейнер LXC 212 (Ubuntu) на хосте Proxmox VE
- Внутри LXC: Docker + Docker Compose
- Все сервисы Mailcow запускаются как Docker-контейнеры
- Данные хранятся в
/mnt/mailcow(монтируемый том с HDD)
2. Требования к ресурсам
Минимальные требования
| Ресурс | Значение |
|---|---|
| CPU | 2 ядра |
| RAM | 4 ГБ (рекомендуется 6 ГБ для стабильной работы ClamAV) |
| Disk | 40 ГБ (система + почта) |
| Swap | 2 ГБ |
Рекомендуемые настройки LXC
Выполняется на хосте Proxmox:
pct set 212 -memory 4096 -swap 2048 -cores 2
pct set 212 -features nesting=1,fuse=1
3. Подготовка контейнера
3.1 Проверка конфигурации
Выполняется на хосте Proxmox:
pct config 212
Обязательные параметры в выводе:
features: nesting=1,fuse=1unprivileged: 0(или отсутствие этой строки)lxc.cgroup2.devices.allow: a
3.2 Проверка Docker внутри контейнера
Подключись по SSH к 192.168.1.212 и проверь версии:
docker --version
docker compose version
3.3 Остановка системного Postfix
Системный Postfix в Ubuntu может занимать порт 25:
systemctl stop postfix
systemctl disable postfix
4. Установка Mailcow
4.1 Клонирование репозитория
cd /mnt/mailcow
git clone https://github.com/mailcow/mailcow-dockerized
4.2 Генерация конфигурации
cd /mnt/mailcow/mailcow-dockerized
./generate_config.sh
Ответы на вопросы скрипта:
Mail server hostname (FQDN):mail.zailon.ruTimezone:Asia/Yekaterinburg(или твоя)Branch:1(master — стабильная)IPv6:n(если не используется)
4.3 Правка docker-compose.yml для LXC
cd /mnt/mailcow/mailcow-dockerized
sed -i 's/ipv6nat:/#ipv6nat:/g' docker-compose.yml
sed -i 's/^ netfilter:/ #netfilter:/g' docker-compose.yml
5. Запуск и первичная настройка
5.1 Загрузка образов и запуск
cd /mnt/mailcow/mailcow-dockerized
docker compose pull
docker compose up -d
5.2 Проверка статуса контейнеров
cd /mnt/mailcow/mailcow-dockerized
docker compose ps
Ожидаемый результат: все контейнеры в статусе Up.
5.3 Первый вход в админку
- Открой в браузере:
https://192.168.1.212 - Пропусти предупреждение о сертификате
- Логин:
admin, Пароль:moohoo - Сразу смени пароль в настройках профиля
5.4 Добавление домена
- В админке: Configuration → Mail Setup → Domains
- Нажми Add domain
- Введи:
zailon.ru - Нажми Add domain and restart SOGo
5.5 Создание почтового ящика
- Mail Setup → Mailboxes → Add mailbox
- Заполни:
- Email:
olimp@zailon.ru - Name: Имя владельца
- Password: надёжный пароль
- Quota:
5120(5 ГБ)
- Email:
- Нажми Add mailbox
6. Настройка DNS
6.1 Получение записей из Mailcow
В админке: Configuration → Mail Setup → Domains → кнопка DNS
6.2 Пример записей для zailon.ru
$ORIGIN zailon.ru.
mail IN A 188.73.191.202
@ IN MX mail.zailon.ru. (pri=10)
@ IN TXT "v=spf1 mx a:mail.zailon.ru -all"
dkim._domainkey IN TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkq..."
_dmarc IN TXT "v=DMARC1; p=none; rua=mailto:olimp@zailon.ru"
autodiscover IN CNAME mail.zailon.ru.
autoconfig IN CNAME mail.zailon.ru.
_autodiscover._tcp IN SRV 0 0 443 mail.zailon.ru.
Важно: Ключ DKIM берётся из админки Mailcow (кнопка DNS). Он уникальный для твоей установки.
6.3 Обратная запись PTR
Обратись к провайдеру с запросом установить PTR для 188.73.191.202 → mail.zailon.ru. Без этого письма могут попадать в спам.
7. Настройка Nginx Proxy Manager
7.1 Создание Proxy Host
В админке NPM (LXC 201):
| Параметр | Значение |
|---|---|
| Domain Names | mail.zailon.ru |
| Scheme | https |
| Forward Hostname/IP | 192.168.1.212 |
| Forward Port | 443 |
| SSL Certificate | Request a new SSL Certificate |
| Force SSL | ✅ ON |
| Block Common Exploits | ✅ ON |
7.2 Advanced: Custom Nginx Configuration
proxy_ssl_verify off;
proxy_ssl_server_name on;
Это необходимо, так как Mailcow использует самоподписанный сертификат внутри сети.
8. Проброс портов на роутере
| Имя | Внешний порт | Внутренний порт | Протокол | Назначение |
|---|---|---|---|---|
| mail_smtp | 25 | 25 | TCP | Приём почты от внешних серверов |
| mail_imap | 993 | 993 | TCP | Безопасный доступ к ящику (IMAP) |
| mail_smtp_ssl | 465 | 465 | TCP | Отправка почты (SMTP SSL) |
| mail_smtp_tls | 587 | 587 | TCP | Отправка почты (SMTP STARTTLS) |
IP устройства: 192.168.1.212
9. Настройка почтовых клиентов
Параметры подключения
| Параметр | Значение |
|---|---|
olimp@zailon.ru |
|
| Пароль | пароль от ящика |
Входящая почта (IMAP)
- Сервер:
mail.zailon.ru - Порт:
993 - Безопасность: SSL/TLS
Исходящая почта (SMTP)
- Сервер:
mail.zailon.ru - Порт:
465(SSL/TLS) или587(STARTTLS) - Аутентификация: Да, логин = email
Рекомендуемые клиенты
- Android: K-9 Mail (бесплатно, open source) или Aqua Mail (платно, красивый интерфейс)
- iOS: Родной клиент Почта или Spark
- Desktop: Thunderbird, Outlook
10. Полезные команды
Переход в директорию Mailcow
cd /mnt/mailcow/mailcow-dockerized
Проверка статуса сервисов
docker compose ps
Просмотр логов
# Все сервисы
docker compose logs -f
# Только postfix
docker compose logs -f postfix-mailcow
# Только последние 50 строк
docker compose logs --tail=50 postfix-mailcow
Перезапуск сервисов
# Один сервис
docker compose restart postfix-mailcow
# Все сервисы
docker compose restart
Полная перезагрузка
docker compose down
docker compose up -d
Обновление Mailcow
./update.sh
Проверка DNS
nslookup -type=MX zailon.ru
nslookup -type=TXT zailon.ru
Проверка открытых портов
ss -tlnp | grep -E ':25|:443|:993'
11. Решение проблем
Письма не приходят извне
- Проверь проброс портов на роутере (25, 993, 465)
- Проверь DNS-записи:
nslookup -type=MX zailon.ru - Проверь логи postfix:
cd /mnt/mailcow/mailcow-dockerized
docker compose logs --tail=100 postfix-mailcow | grep -E 'connect|NOQUEUE|reject'
Ошибка "Waiting for DNS..." в Postfix
Проблема с Docker-сетью в LXC. Решение:
cd /mnt/mailcow/mailcow-dockerized
docker compose down
docker network rm mailcowdockerized_mailcow-network
docker compose up -d
SOGo: "not allowed in state 1"
- Очисти куки браузера
- Или перезапусти SOGo:
cd /mnt/mailcow/mailcow-dockerized
docker compose restart sogo-mailcow
Письма попадают в спам
- Проверь наличие и корректность записей SPF, DKIM, DMARC
- Убедись, что настроена PTR-запись у провайдера
- Не отправляй массовые рассылки с нового домена
Не могу зайти по https://mail.zailon.ru
- Проверь, что в NPM настроен прокси на
192.168.1.212:443 - Убедись, что в Custom Config добавлено
proxy_ssl_verify off; - Проверь, что сертификат Let's Encrypt выпущен (статус в NPM)
ClamAV не обновляет базы (ошибка 403)
Известная проблема CDN ClamAV. Антивирус продолжит работать на локальных сигнатурах. Для обновления можно:
- Подождать 24 часа (кулдаун)
- Или отключить ClamAV в
mailcow.conf, если не критично:
SKIP_CLAMD=y
Затем: docker compose up -d
12. Безопасность и обслуживание
Регулярные задачи
| Задача | Периодичность | Команда/Действие |
|---|---|---|
| Проверка логов | Еженедельно | docker compose logs --tail=100 |
| Обновление Mailcow | По выходу версии | ./update.sh |
| Резервное копирование | Ежедневно | Настроить backup через Proxmox Backup Server |
| Проверка места на диске | Еженедельно | df -h /mnt/mailcow |
Резервное копирование
Рекомендуемый способ — через Proxmox Backup Server (PBS):
- В веб-интерфейсе Proxmox выбери контейнер 212
- Backup → Backup now
- Режим:
snapshot, хранилище:olimpbkp - Расписание: ежедневно в 03:00
Обновление системы
apt update && apt upgrade -y
Перезапуск контейнера (если обновилось ядро) выполняется на хосте Proxmox:
pct reboot 212
Мониторинг
Mailcow интегрируется с внешними системами мониторинга. Для Grafana (LXC 208):
- Добавь источник данных Prometheus:
http://192.168.1.212:9900/metrics - Импортируй дашборд Mailcow (ID: 13429)
Контакты для экстренных случаев
- Администратор: Zailon
- Сервер: Olimp (192.168.1.1)
- Контейнер почты: 212 (192.168.1.212)
- Документация:
mail.mdв репозитории конфигураций
##13. Создание почтового ящика
Через веб-интерфейс Mailcow
- Открой
https://mail.zailon.ruв браузере - Нажми «Войти» (правый верхний угол)
- Введи:
- Логин:
admin - Пароль: твой пароль администратора
- Логин:
- В левом меню выбери: Configuration → Mail Setup → Mailboxes
- Нажми зелёную кнопку Add mailbox
- Заполни форму:
| Поле | Что вписать | Пример |
|---|---|---|
| Domain | Выбери из списка | zailon.ru |
| Local part | Часть до @ | zevs |
| Name | Имя владельца | Zevs |
| Password | Пароль ящика | ТвойНадёжныйПароль123! |
| Password (repeat) | Повтори пароль | ТвойНадёжныйПароль123! |
| Quota | Лимит места в МБ | 5120 (5 ГБ) |
- Остальные поля не трогай
- Нажми Add mailbox
✅ Ящик создан. Теперь можно:
- Войти в почту:
https://mail.zailon.ru→ логинzevs@zailon.ru - Настроить клиент (см. раздел Настройка клиентов)
🌐 Настройка Nginx Proxy Manager для mail.zailon.ru
Делается один раз при первом запуске почтового сервера.
Шаг 1: Открой админку NPM
- В браузере перейди:
http://192.168.1.201:81 - Введи логин/пароль от NPM (если не менял — смотри в
group_vars/all.ymlили спроси у админа)
Шаг 2: Создай новый Proxy Host
- В меню слева выбери Hosts → Proxy Hosts
- Нажми кнопку Add Proxy Host (внизу справа)
- Заполни вкладку Details:
| Поле | Значение |
|---|---|
| Domain Names | mail.zailon.ru (нажми Enter после ввода) |
| Scheme | https |
| Forward Hostname / IP | 192.168.1.212 |
| Forward Port | 443 |
| Cache Assets | ❌ выключено |
| Block Common Exploits | ✅ включено |
| WebSockets Support | ❌ выключено |
Шаг 3: Настрой SSL
- Перейди на вкладку SSL
- Выбери: Request a new SSL Certificate
- Поставь галочки:
- ✅ Force SSL
- ✅ HTTP/2 Support
- ✅ I agree to the Let's Encrypt Terms of Service
- Поле Email for Let's Encrypt — введи твой email (для уведомлений)
Шаг 4: Добавь настройки для HTTPS-проксирования
- Перейди на вкладку Advanced
- В поле Custom Nginx Configuration вставь:
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Security headers
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;
Шаг 5: Ограничь доступ к админке (опционально, но рекомендуется)
В том же поле Custom Nginx Configuration, после предыдущего блока, добавь:
# Ограничение доступа к админке /admin
location ^~ /admin {
allow 192.168.1.0/24;
allow 188.73.191.202;
allow 192.168.45.0/24;
deny all;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;
proxy_pass https://192.168.1.212:443;
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
⚠️ Если не добавляешь ограничение — просто пропусти этот блок.
Шаг 6: Сохрани и проверь
- Нажми Save внизу страницы
- Подожди 10-20 секунд (пока NPM выпустит сертификат Let's Encrypt)
- Открой в браузере:
https://mail.zailon.ru - Если видишь страницу входа SOGo — всё работает ✅
🔍 Проверка после настройки
1. Проверь, что сертификат работает
curl -I https://mail.zailon.ru
В ответе должна быть строка:
strict-transport-security: max-age=63072000; includeSubDomains; preload
2. Проверь ограничение админки (если настраивал)
- С ноутбука в локальной сети:
https://mail.zailon.ru/admin→ должна открыться форма входа - С телефона через мобильный интернет (без VPN): → должна быть ошибка
403 Forbidden
3. Проверь почту
- Открой
https://mail.zailon.ru - Войди как
zevs@zailon.ru - Отправь тестовое письмо самому себе → должно прийти мгновенно
🛠 Если что-то не работает
| Проблема | Решение |
|---|---|
403 Forbidden при входе в админку |
Проверь, что твой IP есть в allow в блоке location ^~ /admin |
502 Bad Gateway |
Убедись, что Mailcow запущен: docker compose ps в контейнере 212 |
| Браузер ругается на сертификат | Подожди 1-2 минуты после сохранения в NPM, обнови страницу |
| Не приходит письмо с внешнего ящика | Проверь проброс порта 25 на роутере и DNS-записи MX/SPF |
Если не получается — посмотри логи NPM: в админке NPM → Hosts → Proxy Hosts → три точки у записи mail.zailon.ru → Logs.
Примечание: Все команды выполняются от имени root.