569 lines
21 KiB
Markdown
569 lines
21 KiB
Markdown
# 📧 Почтовый сервер 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`
|
||
|
||
---
|
||
|
||
## 📋 Содержание
|
||
|
||
1. [Описание и архитектура](#1-описание-и-архитектура)
|
||
2. [Требования к ресурсам](#2-требования-к-ресурсам)
|
||
3. [Подготовка контейнера](#3-подготовка-контейнера)
|
||
4. [Установка Mailcow](#4-установка-mailcow)
|
||
5. [Запуск и первичная настройка](#5-запуск-и-первичная-настройка)
|
||
6. [Настройка DNS](#6-настройка-dns)
|
||
7. [Настройка Nginx Proxy Manager](#7-настройка-nginx-proxy-manager)
|
||
8. [Проброс портов на роутере](#8-проброс-портов-на-роутере)
|
||
9. [Настройка почтовых клиентов](#9-настройка-почтовых-клиентов)
|
||
10. [Полезные команды](#10-полезные-команды)
|
||
11. [Решение проблем](#11-решение-проблем)
|
||
12. [Безопасность и обслуживание](#12-безопасность-и-обслуживание)
|
||
13. [Настройка Nginx Proxy Manager](#13-настройка-nginx-proxy-manager)
|
||
14. [Создание почтового ящика](#14-создание-почтового-ящика)
|
||
|
||
---
|
||
|
||
## 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**:
|
||
```bash
|
||
pct set 212 -memory 4096 -swap 2048 -cores 2
|
||
pct set 212 -features nesting=1,fuse=1
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Подготовка контейнера
|
||
|
||
### 3.1 Проверка конфигурации
|
||
> **Выполняется на хосте Proxmox**:
|
||
```bash
|
||
pct config 212
|
||
```
|
||
|
||
**Обязательные параметры в выводе**:
|
||
- `features: nesting=1,fuse=1`
|
||
- `unprivileged: 0` (или отсутствие этой строки)
|
||
- `lxc.cgroup2.devices.allow: a`
|
||
|
||
### 3.2 Проверка Docker внутри контейнера
|
||
Подключись по SSH к `192.168.1.212` и проверь версии:
|
||
|
||
```bash
|
||
docker --version
|
||
docker compose version
|
||
```
|
||
|
||
### 3.3 Остановка системного Postfix
|
||
Системный Postfix в Ubuntu может занимать порт 25:
|
||
|
||
```bash
|
||
systemctl stop postfix
|
||
systemctl disable postfix
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Установка Mailcow
|
||
|
||
### 4.1 Клонирование репозитория
|
||
```bash
|
||
cd /mnt/mailcow
|
||
git clone https://github.com/mailcow/mailcow-dockerized
|
||
```
|
||
|
||
### 4.2 Генерация конфигурации
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
./generate_config.sh
|
||
```
|
||
|
||
**Ответы на вопросы скрипта**:
|
||
1. `Mail server hostname (FQDN)`: `mail.zailon.ru`
|
||
2. `Timezone`: `Asia/Yekaterinburg` (или твоя)
|
||
3. `Branch`: `1` (master — стабильная)
|
||
4. `IPv6`: `n` (если не используется)
|
||
|
||
### 4.3 Правка docker-compose.yml для LXC
|
||
```bash
|
||
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 Загрузка образов и запуск
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
### 5.2 Проверка статуса контейнеров
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
docker compose ps
|
||
```
|
||
|
||
**Ожидаемый результат**: все контейнеры в статусе `Up`.
|
||
|
||
### 5.3 Первый вход в админку
|
||
1. Открой в браузере: `https://192.168.1.212`
|
||
2. Пропусти предупреждение о сертификате
|
||
3. Логин: `admin`, Пароль: `moohoo`
|
||
4. **Сразу смени пароль** в настройках профиля
|
||
|
||
### 5.4 Добавление домена
|
||
1. В админке: **Configuration** → **Mail Setup** → **Domains**
|
||
2. Нажми **Add domain**
|
||
3. Введи: `zailon.ru`
|
||
4. Нажми **Add domain and restart SOGo**
|
||
|
||
### 5.5 Создание почтового ящика
|
||
1. **Mail Setup** → **Mailboxes** → **Add mailbox**
|
||
2. Заполни:
|
||
- **Email**: `olimp@zailon.ru`
|
||
- **Name**: Имя владельца
|
||
- **Password**: надёжный пароль
|
||
- **Quota**: `5120` (5 ГБ)
|
||
3. Нажми **Add mailbox**
|
||
|
||
---
|
||
|
||
## 6. Настройка DNS
|
||
|
||
### 6.1 Получение записей из Mailcow
|
||
В админке: **Configuration** → **Mail Setup** → **Domains** → кнопка **DNS**
|
||
|
||
### 6.2 Пример записей для zailon.ru
|
||
```dns
|
||
$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
|
||
```nginx
|
||
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. Настройка почтовых клиентов
|
||
|
||
### Параметры подключения
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| **Email** | `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
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
```
|
||
|
||
### Проверка статуса сервисов
|
||
```bash
|
||
docker compose ps
|
||
```
|
||
|
||
### Просмотр логов
|
||
```bash
|
||
# Все сервисы
|
||
docker compose logs -f
|
||
|
||
# Только postfix
|
||
docker compose logs -f postfix-mailcow
|
||
|
||
# Только последние 50 строк
|
||
docker compose logs --tail=50 postfix-mailcow
|
||
```
|
||
|
||
### Перезапуск сервисов
|
||
```bash
|
||
# Один сервис
|
||
docker compose restart postfix-mailcow
|
||
|
||
# Все сервисы
|
||
docker compose restart
|
||
```
|
||
|
||
### Полная перезагрузка
|
||
```bash
|
||
docker compose down
|
||
docker compose up -d
|
||
```
|
||
|
||
### Обновление Mailcow
|
||
```bash
|
||
./update.sh
|
||
```
|
||
|
||
### Проверка DNS
|
||
```bash
|
||
nslookup -type=MX zailon.ru
|
||
nslookup -type=TXT zailon.ru
|
||
```
|
||
|
||
### Проверка открытых портов
|
||
```bash
|
||
ss -tlnp | grep -E ':25|:443|:993'
|
||
```
|
||
|
||
---
|
||
|
||
## 11. Решение проблем
|
||
|
||
### Письма не приходят извне
|
||
1. Проверь проброс портов на роутере (25, 993, 465)
|
||
2. Проверь DNS-записи: `nslookup -type=MX zailon.ru`
|
||
3. Проверь логи postfix:
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
docker compose logs --tail=100 postfix-mailcow | grep -E 'connect|NOQUEUE|reject'
|
||
```
|
||
|
||
### Ошибка "Waiting for DNS..." в Postfix
|
||
Проблема с Docker-сетью в LXC. Решение:
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
docker compose down
|
||
docker network rm mailcowdockerized_mailcow-network
|
||
docker compose up -d
|
||
```
|
||
|
||
### SOGo: "not allowed in state 1"
|
||
1. Очисти куки браузера
|
||
2. Или перезапусти SOGo:
|
||
```bash
|
||
cd /mnt/mailcow/mailcow-dockerized
|
||
docker compose restart sogo-mailcow
|
||
```
|
||
|
||
### Письма попадают в спам
|
||
1. Проверь наличие и корректность записей SPF, DKIM, DMARC
|
||
2. Убедись, что настроена PTR-запись у провайдера
|
||
3. Не отправляй массовые рассылки с нового домена
|
||
|
||
### Не могу зайти по https://mail.zailon.ru
|
||
1. Проверь, что в NPM настроен прокси на `192.168.1.212:443`
|
||
2. Убедись, что в Custom Config добавлено `proxy_ssl_verify off;`
|
||
3. Проверь, что сертификат Let's Encrypt выпущен (статус в NPM)
|
||
|
||
### ClamAV не обновляет базы (ошибка 403)
|
||
Известная проблема CDN ClamAV. Антивирус продолжит работать на локальных сигнатурах. Для обновления можно:
|
||
1. Подождать 24 часа (кулдаун)
|
||
2. Или отключить ClamAV в `mailcow.conf`, если не критично:
|
||
```ini
|
||
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):
|
||
|
||
1. В веб-интерфейсе Proxmox выбери контейнер 212
|
||
2. **Backup** → **Backup now**
|
||
3. Режим: `snapshot`, хранилище: `olimpbkp`
|
||
4. Расписание: ежедневно в 03:00
|
||
|
||
### Обновление системы
|
||
```bash
|
||
apt update && apt upgrade -y
|
||
```
|
||
|
||
> **Перезапуск контейнера** (если обновилось ядро) выполняется на хосте Proxmox:
|
||
```bash
|
||
pct reboot 212
|
||
```
|
||
|
||
### Мониторинг
|
||
Mailcow интегрируется с внешними системами мониторинга. Для Grafana (LXC 208):
|
||
1. Добавь источник данных Prometheus: `http://192.168.1.212:9900/metrics`
|
||
2. Импортируй дашборд Mailcow (ID: 13429)
|
||
|
||
### Контакты для экстренных случаев
|
||
- Администратор: Zailon
|
||
- Сервер: Olimp (192.168.1.1)
|
||
- Контейнер почты: 212 (192.168.1.212)
|
||
- Документация: `mail.md` в репозитории конфигураций
|
||
|
||
---
|
||
|
||
## 13 Настройка Nginx Proxy Manager
|
||
|
||
> Делается один раз при первом запуске почтового сервера.
|
||
|
||
### Шаг 1: Открой админку NPM
|
||
|
||
1. В браузере перейди: `http://192.168.1.201:81`
|
||
2. Введи логин/пароль от NPM (если не менял — смотри в `group_vars/all.yml` или спроси у админа)
|
||
|
||
### Шаг 2: Создай новый Proxy Host
|
||
|
||
1. В меню слева выбери **Hosts** → **Proxy Hosts**
|
||
2. Нажми кнопку **Add Proxy Host** (внизу справа)
|
||
3. Заполни вкладку **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
|
||
|
||
1. Перейди на вкладку **SSL**
|
||
2. Выбери: **Request a new SSL Certificate**
|
||
3. Поставь галочки:
|
||
- ✅ **Force SSL**
|
||
- ✅ **HTTP/2 Support**
|
||
- ✅ **I agree to the Let's Encrypt Terms of Service**
|
||
4. Поле **Email for Let's Encrypt** — введи твой email (для уведомлений)
|
||
|
||
### Шаг 4: Добавь настройки для HTTPS-проксирования
|
||
|
||
1. Перейди на вкладку **Advanced**
|
||
2. В поле **Custom Nginx Configuration** вставь:
|
||
|
||
```nginx
|
||
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**, **после** предыдущего блока, добавь:
|
||
|
||
```nginx
|
||
# Ограничение доступа к админке /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: Сохрани и проверь
|
||
|
||
1. Нажми **Save** внизу страницы
|
||
2. Подожди 10-20 секунд (пока NPM выпустит сертификат Let's Encrypt)
|
||
3. Открой в браузере: `https://mail.zailon.ru`
|
||
4. Если видишь страницу входа SOGo — всё работает ✅
|
||
|
||
---
|
||
|
||
## 14. Создание почтового ящика
|
||
|
||
### Через веб-интерфейс Mailcow
|
||
|
||
1. Открой `https://mail.zailon.ru` в браузере
|
||
2. Нажми **«Войти»** (правый верхний угол)
|
||
3. Введи:
|
||
- **Логин**: `admin`
|
||
- **Пароль**: твой пароль администратора
|
||
4. В левом меню выбери: **Configuration** → **Mail Setup** → **Mailboxes**
|
||
5. Нажми зелёную кнопку **Add mailbox**
|
||
6. Заполни форму:
|
||
|
||
| Поле | Что вписать | Пример |
|
||
|------|------------|--------|
|
||
| **Domain** | Выбери из списка | `zailon.ru` |
|
||
| **Local part** | Часть до @ | `zevs` |
|
||
| **Name** | Имя владельца | `Zevs` |
|
||
| **Password** | Пароль ящика | `ТвойНадёжныйПароль123!` |
|
||
| **Password (repeat)** | Повтори пароль | `ТвойНадёжныйПароль123!` |
|
||
| **Quota** | Лимит места в МБ | `5120` (5 ГБ) |
|
||
|
||
7. Остальные поля не трогай
|
||
8. Нажми **Add mailbox**
|
||
|
||
✅ Ящик создан. Теперь можно:
|
||
- Войти в почту: `https://mail.zailon.ru` → логин `zevs@zailon.ru`
|
||
- Настроить клиент (см. раздел [Настройка клиентов](#9-настройка-почтовых-клиентов))
|
||
|
||
|
||
## 🔍 Проверка после настройки
|
||
|
||
### 1. Проверь, что сертификат работает
|
||
|
||
```bash
|
||
curl -I https://mail.zailon.ru
|
||
```
|
||
|
||
В ответе должна быть строка:
|
||
```text
|
||
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. |