Размещено самостоятельно

Начало работы

Наше решение для самостоятельного размещения электронной почты, как и все наши продукты, имеет полностью открытый исходный код — как на стороне клиента, так и на стороне сервера. Это означает:

  1. Полная прозрачность: Каждая строка кода, обрабатывающая ваши электронные письма, доступна для публичного просмотра.
  2. Вклад сообщества: Любой может внести улучшения или исправить ошибки.
  3. Безопасность благодаря открытости: Уязвимости могут быть выявлены и устранены мировым сообществом.
  4. Отсутствие привязки к поставщику: Вы никогда не зависите от нашей компании.

Вся кодовая база доступна на 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

Облачная инициализация / Пользовательские данные

Большинство поставщиков облачных услуг поддерживают конфигурацию 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/исходящей почты.

Вводная

  1. Откройте целевую страницу. Перейдите по адресу https://<имя_домена>, заменив <имя_домена> на домен, указанный в настройках DNS. Вы увидите целевую страницу «Пересылка электронной почты».

  2. Войдите в систему и подключите свой домен.

  • Войдите, используя действительный адрес электронной почты и пароль.
  • Введите доменное имя, которое вы хотите настроить (оно должно соответствовать настройкам DNS).
  • Следуйте инструкциям, чтобы добавить необходимые записи MX и TXT для проверки.
  1. Завершите настройку
  • После проверки перейдите на страницу «Псевдонимы», чтобы создать свой первый псевдоним.
  • При желании настройте SMTP для исходящей почты в Настройках домена. Для этого потребуются дополнительные записи DNS.

Note

Никакая информация не отправляется за пределы вашего сервера. Вариант с самостоятельным размещением и первоначальной учётной записью предназначен только для входа администратора и веб-просмотра для управления доменами, псевдонимами и связанными настройками электронной почты.

Тестирование

Создание вашего первого псевдонима

  1. Перейдите на страницу «Псевдонимы». Откройте страницу управления псевдонимами:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
  1. Добавить новый псевдоним
  • Нажмите Добавить псевдоним (вверху справа).
  • Введите псевдоним и при необходимости измените настройки электронной почты.
  • (Необязательно) Включите поддержку IMAP/POP3/CalDAV/CardDAV, установив флажок.
  • Нажмите Создать псевдоним.
  1. Установите пароль
  • Нажмите «Сгенерировать пароль», чтобы создать безопасный пароль.
  • Этот пароль потребуется для входа в ваш почтовый клиент.
  1. Настройте свой почтовый клиент
  • Используйте почтовый клиент, например 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-адреса

Взгляните на наш Часто задаваемые вопросы здесь.