Размещено самостоятельно
Начало работы
Наше решение для самостоятельного размещения электронной почты, как и все наши продукты, имеет полностью открытый исходный код — как на стороне клиента, так и на стороне сервера. Это означает:
- Полная прозрачность: Каждая строка кода, обрабатывающая ваши электронные письма, доступна для публичного просмотра.
- Вклад сообщества: Любой может внести улучшения или исправить ошибки.
- Безопасность благодаря открытости: Уязвимости могут быть выявлены и устранены мировым сообществом.
- Отсутствие привязки к поставщику: Вы никогда не зависите от нашей компании.
Вся кодовая база доступна на GitHub по адресу https://github.com/forwardemail/forwardemail.net, под лицензией MIT.
Архитектура включает контейнеры для:
- SMTP-сервер для исходящей почты
- Серверы IMAP/POP3 для получения электронной почты
- Веб-интерфейс для администрирования
- База данных для хранения настроек
- Redis для кэширования и повышения производительности
- SQLite для безопасного, зашифрованного хранения почтовых ящиков
Note
Обязательно ознакомьтесь с нашим руководством блог с собственным хостингом
А для тех, кто интересуется более подробной пошаговой версией, ознакомьтесь с нашими руководствами на основе Убунту или Дебиан.
Требования
Перед запуском скрипта установки убедитесь, что у вас есть следующее:
- Операционная система: Сервер на базе Linux (в настоящее время поддерживается Ubuntu 22.04+).
- Ресурсы: 1 виртуальный ЦП и 2 ГБ ОЗУ
- Root-доступ: Административные права для выполнения команд.
- Доменное имя: Пользовательский домен, готовый к настройке DNS.
- Чистый IP: Убедитесь, что у вашего сервера чистый IP-адрес без спам-репутации, проверив чёрные списки. Подробнее: здесь.
- Публичный IP-адрес с поддержкой порта 25
- Возможность установки обратный PTR
- Поддержка IPv4 и IPv6
Tip
Смотрите наш список потрясающие поставщики почтовых серверов
Облачная инициализация / Пользовательские данные
Большинство поставщиков облачных услуг поддерживают конфигурацию cloud-init при выделении виртуального частного сервера (VPS). Это отличный способ заранее настроить некоторые файлы и переменные среды для использования в логике начальной настройки скриптов, что избавит от необходимости запрашивать дополнительную информацию во время выполнения скрипта.
Параметры
EMAIL— адрес электронной почты, используемый для напоминаний об истечении срока действия сертификата Certbot.DOMAIN— пользовательский домен (например,example.com), используемый для настройки собственного хостинга.AUTH_BASIC_USERNAME— имя пользователя, используемое при первой настройке для защиты сайта.AUTH_BASIC_PASSWORD— пароль, используемый при первой настройке для защиты сайта./root/.cloudflare.ini— (Только для пользователей Cloudflare) файл конфигурации Cloudflare, используемый Certbot для настройки DNS. Требуется указать токен API черезdns_cloudflare_api_token. Подробнее: здесь.
Пример:
#cloud-config
write_files:
- path: /root/.cloudflare.ini
content: |
dns_cloudflare_api_token = "xxx"
owner: root:root
permissions: '0600'
- path: /etc/profile.d/env.sh
content: |
export EMAIL="test@myemail.com"
export DOMAIN="mydomain.com"
runcmd:
- chmod +x /etc/profile.d/env.sh
Установить
Выполните следующую команду на своем сервере, чтобы загрузить и выполнить установочный скрипт:
bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)
Отладочный скрипт установки
Добавьте DEBUG=true перед скриптом установки для подробного вывода:
DEBUG=true bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)
Подсказки
1. Initial setup
2. Setup Backups
3. Setup Auto Upgrades
4. Renew certificates
5. Restore from Backup
6. Help
7. Exit
- Начальная настройка: Загрузите последний код пересылки электронной почты, настройте среду, запросите ваш домен и настройте все необходимые сертификаты, ключи и секреты.
- Настройка резервного копирования: Настроит cron для резервного копирования MongoDB и Redis с использованием S3-совместимого хранилища для безопасного удаленного хранения. Кроме того, резервное копирование SQLite будет выполняться при входе в систему при наличии изменений для безопасного зашифрованного резервного копирования.
- Настройка обновления: Настроит cron для поиска ночных обновлений, которые безопасно пересоберут и перезапустят компоненты инфраструктуры.
- Обновление сертификатов: Certbot / lets encrypt используется для SSL-сертификатов, а ключи истекают каждые 3 месяца. Это обновит сертификаты для вашего домена и поместит их в нужную папку для использования соответствующими компонентами. См. важные пути к файлам
- Восстановление из резервной копии: Запустит восстановление MongoDB и Redis из резервной копии.
Начальная настройка (Вариант 1)
Чтобы начать, выберите опцию 1. Initial setup.
После завершения вы увидите сообщение об успешном завершении. Вы даже можете запустить docker ps, чтобы увидеть, как развернулись компоненты. Подробнее о компонентах ниже.
Услуги
| Название услуги | Порт по умолчанию | Описание |
|---|---|---|
| Интернет | 443 |
Веб-интерфейс для всех административных взаимодействий |
| API | 4000 |
Уровень API для абстрагирования баз данных |
| Бри | Никто | Фоновое задание и исполнитель задач |
| SMTP | 465/587 |
SMTP-сервер для исходящей электронной почты |
| SMTP Бри | Никто | Фоновое задание SMTP |
| MX | 2525 |
Обмен почтой для входящей электронной почты и пересылка электронной почты |
| IMAP | 993/2993 |
Сервер IMAP для входящей электронной почты и управления почтовыми ящиками |
| POP3 | 995/2995 |
POP3-сервер для входящей электронной почты и управления почтовыми ящиками |
| SQLite | 3456 |
Сервер SQLite для взаимодействия с базами данных SQLite |
| SQLite Бри | Никто | Фоновое задание SQLite |
| CalDAV | 5000 |
Сервер CalDAV для управления календарем |
| CardDAV | 6000 |
Сервер CardDAV для управления календарем |
| MongoDB | 27017 |
База данных MongoDB для большинства задач управления данными |
| Редис | 6379 |
Redis для кэширования и управления состоянием |
| SQLite | Никто | Базы данных SQLite для зашифрованных почтовых ящиков |
Важные пути к файлам
Примечание: Путь к хосту ниже указан относительно /root/forwardemail.net/self-hosting/.
| Компонент | Путь к хосту | Путь контейнера |
|---|---|---|
| MongoDB | ./mongo-backups |
/backups |
| Редис | ./redis-data |
/data |
| SQLite | ./sqlite-data |
/mnt/{SQLITE_STORAGE_PATH} |
| Файл Env | ./.env |
/app/.env |
| SSL-сертификаты/ключи | ./ssl |
/app/ssl/ |
| Закрытый ключ | ./ssl/privkey.pem |
/app/ssl/privkey.pem |
| Сертификат полной цепочки | ./ssl/fullchain.pem |
/app/ssl/fullchain.pem |
| Сертифицированные центры сертификации | ./ssl/cert.pem |
/app/ssl/cert.pem |
| Закрытый ключ DKIM | ./ssl/dkim.key |
/app/ssl/dkim.key |
Important
Сохраните файл .env в безопасном месте. Он критически важен для восстановления в случае сбоя.
Вы можете найти его в /root/forwardemail.net/self-hosting/.env.
Конфигурация
Первоначальная настройка DNS
Настройте соответствующие записи DNS у выбранного вами DNS-провайдера. Обратите внимание, что всё, что указано в скобках (<>), является динамическим и должно быть обновлено с учётом вашего значения.
| Тип | Имя | Содержание | TTL |
|---|---|---|---|
| A | «@», «.» или пробел | <ip_адрес> | авто |
| CNAME | API | <имя_домена> | авто |
| CNAME | калдав | <имя_домена> | авто |
| CNAME | карддав | <имя_домена> | авто |
| CNAME | fe-отскоки | <имя_домена> | авто |
| CNAME | IMAP | <имя_домена> | авто |
| CNAME | мх | <имя_домена> | авто |
| CNAME | поп3 | <имя_домена> | авто |
| CNAME | SMTP-сервер | <имя_домена> | авто |
| MX | «@», «.» или пробел | mx.<имя_домена> (приоритет 0) | авто |
| TXT | «@», «.» или пробел | "v=spf1 a -all" | авто |
Обратная запись DNS/PTR
Обратные записи DNS (rDNS) или записи обратных указателей (PTR) необходимы для почтовых серверов, поскольку они помогают проверить легитимность сервера, отправляющего электронное письмо. Каждый провайдер облачных услуг делает это по-своему, поэтому вам нужно будет узнать, как добавить «Обратный DNS» для сопоставления хоста и IP-адреса с соответствующим именем хоста. Скорее всего, это можно сделать в разделе «Сетевые настройки» провайдера.
Порт 25 заблокирован
Некоторые интернет-провайдеры и облачные провайдеры блокируют порт 25, чтобы избежать атак злоумышленников. Вам может потребоваться отправить запрос в службу поддержки, чтобы открыть порт 25 для SMTP/исходящей почты.
Вводная
-
Откройте целевую страницу. Перейдите по адресу https://<имя_домена>, заменив <имя_домена> на домен, указанный в настройках DNS. Вы увидите целевую страницу «Пересылка электронной почты».
-
Войдите в систему и подключите свой домен.
- Войдите, используя действительный адрес электронной почты и пароль.
- Введите доменное имя, которое вы хотите настроить (оно должно соответствовать настройкам DNS).
- Следуйте инструкциям, чтобы добавить необходимые записи MX и TXT для проверки.
- Завершите настройку
- После проверки перейдите на страницу «Псевдонимы», чтобы создать свой первый псевдоним.
- При желании настройте SMTP для исходящей почты в Настройках домена. Для этого потребуются дополнительные записи DNS.
Note
Никакая информация не отправляется за пределы вашего сервера. Вариант с самостоятельным размещением и первоначальной учётной записью предназначен только для входа администратора и веб-просмотра для управления доменами, псевдонимами и связанными настройками электронной почты.
Тестирование
Создание вашего первого псевдонима
- Перейдите на страницу «Псевдонимы». Откройте страницу управления псевдонимами:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
- Добавить новый псевдоним
- Нажмите Добавить псевдоним (вверху справа).
- Введите псевдоним и при необходимости измените настройки электронной почты.
- (Необязательно) Включите поддержку IMAP/POP3/CalDAV/CardDAV, установив флажок.
- Нажмите Создать псевдоним.
- Установите пароль
- Нажмите «Сгенерировать пароль», чтобы создать безопасный пароль.
- Этот пароль потребуется для входа в ваш почтовый клиент.
- Настройте свой почтовый клиент
- Используйте почтовый клиент, например Thunderbird.
- Введите псевдоним и сгенерированный пароль.
- Настройте параметры IMAP и SMTP соответствующим образом.
Настройки почтового сервера
Имя пользователя: <alias name>
| Тип | Имя хоста | Порт | Безопасность соединения | Аутентификация |
|---|---|---|---|---|
| SMTP | smtp.<имя_домена> | 465 | SSL / TLS | Обычный пароль |
| IMAP | imap.<имя_домена> | 993 | SSL / TLS | Обычный пароль |
Отправка/получение вашего первого электронного письма
После настройки вы сможете отправлять и получать электронную почту на свой новый и размещенный на вашем собственном сервере адрес электронной почты!
Устранение неполадок
Почему это не работает за пределами Ubuntu и Debian
В настоящее время мы ищем поддержку MacOS и будем рассматривать другие варианты. Если вы хотите, чтобы другие поддерживались, откройте файл обсуждение или внесите свой вклад.
Почему certbot acme challenge не проходит
Самая распространённая ошибка заключается в том, что certbot / letsencrypt иногда запрашивает 2 запроса. Необходимо добавить ОБЕ txt-записи.
Пример: Вы можете увидеть два таких задания: _acme-challenge.example.com -> "randomstring1" _acme-challenge.example.com -> "randomstring2"
Также возможно, что распространение DNS не завершено. Вы можете использовать такие инструменты, как https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.<your_domain>. Это даст вам представление о том, следует ли отражать изменения в TXT-записи. Также возможно, что локальный DNS-кэш на вашем хосте всё ещё использует устаревшее значение или не отразил последние изменения.
Другой вариант — использовать автоматические изменения DNS с помощью Cerbot, установив файл /root/.cloudflare.ini с токеном API в папке cloud-init/user-data при первоначальной настройке VPS, или создать этот файл и повторно запустить скрипт. Это позволит автоматически управлять изменениями DNS и обновлениями запросов.
Какое имя пользователя и пароль для базовой аутентификации
Для самостоятельного хостинга мы добавляем всплывающее окно для первоначальной аутентификации в браузере с простым именем пользователя (admin) и паролем (сгенерированным случайным образом при первоначальной настройке). Мы добавляем это просто для защиты на случай, если автоматизация или парсеры каким-либо образом помешают вам пройти первоначальную регистрацию на сайте. Этот пароль можно найти после первоначальной настройки в файле .env в разделах AUTH_BASIC_USERNAME и AUTH_BASIC_PASSWORD.
Как узнать, что запущено
Вы можете запустить docker ps, чтобы увидеть все запущенные контейнеры, которые запускаются из файла docker-compose-self-hosting.yml. Вы также можете запустить docker ps -a, чтобы увидеть всё (включая не запущенные контейнеры).
Как узнать, что не запущено что-то, что должно быть
Вы можете запустить docker ps -a, чтобы увидеть всё (включая неработающие контейнеры). Вы можете увидеть журнал выхода или примечание.
Как найти журналы
Дополнительные журналы можно получить через docker logs -f <container_name>. Если что-то отсутствует, это, вероятно, связано с неправильной настройкой файла .env.
В веб-интерфейсе вы можете просмотреть /admin/emails и /admin/logs для журналов исходящей электронной почты и журналов ошибок соответственно.
Почему мои исходящие письма истекают по тайм-ауту
Если вы видите сообщение «Время ожидания соединения истекло при подключении к MX-серверу...», возможно, вам следует проверить, не заблокирован ли порт 25. Интернет-провайдеры и поставщики облачных услуг часто блокируют его по умолчанию, и вам может потребоваться обратиться в службу поддержки или создать тикет, чтобы открыть порт.
Какие инструменты следует использовать для проверки рекомендаций по настройке электронной почты и репутации IP-адреса
Взгляните на наш Часто задаваемые вопросы здесь.