Самостоятельный хостинг

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

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

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

Весь исходный код доступен на GitHub по адресу https://github.com/forwardemail/forwardemail.net, лицензирован под MIT License.

Архитектура включает контейнеры для:

  • SMTP-сервера для исходящей почты
  • IMAP/POP3 серверов для получения почты
  • Веб-интерфейса для администрирования
  • Базы данных для хранения конфигурации
  • Redis для кэширования и повышения производительности
  • SQLite для безопасного, зашифрованного хранения почтовых ящиков

Note

Обязательно ознакомьтесь с нашим блогом о самостоятельном хостинге

А для тех, кто заинтересован в более подробном пошаговом руководстве, смотрите наши гайды для Ubuntu или Debian.

Требования

Перед запуском скрипта установки убедитесь, что у вас есть следующее:

  • Операционная система: Сервер на базе Linux (в настоящее время поддерживается Ubuntu 22.04+).
  • Ресурсы: 1 vCPU и 2 ГБ ОЗУ
  • Права root: Административные привилегии для выполнения команд.
  • Доменное имя: Пользовательский домен, готовый к настройке DNS.
  • Чистый IP: Убедитесь, что у вашего сервера чистый IP-адрес без предыдущей спам-репутации, проверив черные списки. Подробнее здесь.
  • Публичный IP-адрес с поддержкой порта 25
  • Возможность настроить обратный PTR
  • Поддержка IPv4 и IPv6

Cloud-init / User-data

Большинство облачных провайдеров поддерживают конфигурацию cloud-init для настройки при развертывании виртуального частного сервера (VPS). Это отличный способ заранее задать некоторые файлы и переменные окружения для использования в логике начальной настройки скрипта, что позволит избежать дополнительных запросов во время выполнения скрипта.

Опции

  • EMAIL - 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. Первоначальная настройка
2. Настройка резервного копирования
3. Настройка автоматических обновлений
4. Обновить сертификаты
5. Восстановить из резервной копии
6. Помощь
7. Выход
  • Первоначальная настройка: Скачивает последний код forward email, настраивает окружение, запрашивает ваш пользовательский домен и настраивает все необходимые сертификаты, ключи и секреты.
  • Настройка резервного копирования: Настроит cron для резервного копирования mongoDB и redis с использованием совместимого с S3 хранилища для безопасного удалённого хранения. Отдельно sqlite будет резервироваться при входе в систему, если есть изменения, для безопасного зашифрованного резервного копирования.
  • Настройка обновлений: Настроит cron для поиска ночных обновлений, которые безопасно перестроят и перезапустят компоненты инфраструктуры.
  • Обновить сертификаты: Для SSL сертификатов используется Certbot / lets encrypt, ключи истекают каждые 3 месяца. Эта опция обновит сертификаты для вашего домена и поместит их в необходимую папку для использования соответствующими компонентами. См. важные пути к файлам
  • Восстановить из резервной копии: Запустит восстановление mongodb и redis из резервных данных.

Первоначальная настройка (Опция 1)

Выберите опцию 1. Первоначальная настройка для начала.

После завершения вы должны увидеть сообщение об успешном выполнении. Вы даже можете выполнить docker ps, чтобы увидеть запущенные компоненты. Подробнее о компонентах ниже.

Сервисы

Название сервиса Порт по умолчанию Описание
Веб 443 Веб-интерфейс для всех административных взаимодействий
API 4000 API-слой для абстрагирования баз данных
Bree Нет Фоновый обработчик задач и заданий
SMTP 465 (рекомендуется) / 587 SMTP-сервер для исходящей почты
SMTP Bree Нет Фоновая задача SMTP
MX 2525 Почтовый обменник для входящей почты и пересылки
IMAP 993/2993 IMAP-сервер для входящей почты и управления почтовым ящиком
POP3 995/2995 POP3-сервер для входящей почты и управления почтовым ящиком
SQLite 3456 SQLite-сервер для взаимодействия с базами данных sqlite
SQLite Bree Нет Фоновая задача SQLite
CalDAV 5000 CalDAV-сервер для управления календарём
CardDAV 6000 CardDAV-сервер для управления календарём
MongoDB 27017 База данных MongoDB для управления большинством данных
Redis 6379 Redis для кэширования и управления состоянием
SQLite Нет Базы данных SQLite для зашифрованных почтовых ящиков

Важные пути к файлам

Примечание: Путь на хосте ниже относительно /root/forwardemail.net/self-hosting/.

Компонент Путь на хосте Путь в контейнере
MongoDB ./mongo-backups /backups
Redis ./redis-data /data
Sqlite ./sqlite-data /mnt/{SQLITE_STORAGE_PATH}
Файл окружения ./.env /app/.env
SSL сертификаты/ключи ./ssl /app/ssl/
Приватный ключ ./ssl/privkey.pem /app/ssl/privkey.pem
Сертификат полного цепочки ./ssl/fullchain.pem /app/ssl/fullchain.pem
Сертификат CA ./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_address> auto
CNAME api <domain_name> auto
CNAME caldav <domain_name> auto
CNAME carddav <domain_name> auto
CNAME fe-bounces <domain_name> auto
CNAME imap <domain_name> auto
CNAME mx <domain_name> auto
CNAME pop3 <domain_name> auto
CNAME smtp <domain_name> auto
MX "@", ".", или пусто mx.<domain_name> (приоритет 0) auto
TXT "@", ".", или пусто "v=spf1 a -all" auto

Обратный DNS / PTR-запись

Обратный DNS (rDNS) или обратные указатели (PTR-записи) необходимы для почтовых серверов, так как они помогают проверить легитимность сервера, отправляющего письмо. Каждый облачный провайдер делает это по-своему, поэтому вам нужно узнать, как добавить "Обратный DNS", чтобы сопоставить хост и IP с соответствующим именем хоста. Скорее всего, это делается в разделе сетевых настроек провайдера.

Порт 25 заблокирован

Некоторые интернет-провайдеры и облачные провайдеры блокируют порт 25, чтобы избежать злоумышленников. Возможно, вам потребуется открыть тикет в службу поддержки, чтобы разблокировать порт 25 для SMTP / исходящей почты.

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

  1. Откройте целевую страницу Перейдите по адресу https://<domain_name>, заменив <domain_name> на домен, настроенный в ваших DNS. Вы должны увидеть целевую страницу Forward Email.

  2. Войдите и добавьте ваш домен

  • Войдите с помощью действующего email и пароля.
  • Введите доменное имя, которое хотите настроить (оно должно совпадать с 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.<domain_name> 465 SSL / TLS Обычный пароль
IMAP imap.<domain_name> 993 SSL / TLS Обычный пароль

Отправка / получение первого письма

После настройки вы сможете отправлять и получать письма на ваш новый созданный и самостоятельно размещённый почтовый адрес!

Устранение неполадок

Почему это не работает вне Ubuntu и Debian

В настоящее время мы работаем над поддержкой MacOS и планируем добавить другие системы. Пожалуйста, откройте обсуждение или внесите вклад, если хотите видеть поддержку других платформ.

Почему не проходит проверка certbot acme

Самая распространённая ошибка — 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 certbot, создав файл /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 для журналов исходящих писем и журналов ошибок соответственно.

Почему мои исходящие письма тайм-аутятся

Если вы видите сообщение вроде Connection timed out when connecting to MX server..., возможно, порт 25 заблокирован. Часто провайдеры интернет-услуг или облачные провайдеры блокируют этот порт по умолчанию, и вам может потребоваться обратиться в поддержку или создать заявку, чтобы его разблокировали.

Какие инструменты использовать для проверки лучших практик настройки почты и репутации IP

Посмотрите наш FAQ здесь.