Docs/docs/services/lxc212-mail/mailcow.md

569 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📧 Почтовый сервер 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.