Самостоятельный хостинг
Начало работы
Наше решение для самостоятельного хостинга электронной почты, как и все наши продукты, является 100% открытым исходным кодом — как фронтенд, так и бэкенд. Это означает:
- Полная прозрачность: Каждая строка кода, обрабатывающая ваши письма, доступна для публичного просмотра
- Вклад сообщества: Любой может внести улучшения или исправить ошибки
- Безопасность через открытость: Уязвимости могут быть выявлены и исправлены глобальным сообществом
- Отсутствие зависимости от поставщика: Вы никогда не зависите от существования нашей компании
Весь исходный код доступен на 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
Tip
Смотрите наш список отличных провайдеров почтовых серверов
Cloud-init / User-data
Большинство облачных провайдеров поддерживают конфигурацию cloud-init для настройки при развертывании виртуального частного сервера (VPS). Это отличный способ заранее задать некоторые файлы и переменные окружения для использования в логике начальной настройки скрипта, что позволит избежать дополнительных запросов во время выполнения скрипта.
Опции
EMAIL- email, используемый для напоминаний о сроке действия сертификата certbotDOMAIN- пользовательский домен (например,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 / исходящей почты.
Начало работы
-
Откройте целевую страницу Перейдите по адресу https://<domain_name>, заменив <domain_name> на домен, настроенный в ваших DNS. Вы должны увидеть целевую страницу Forward Email.
-
Войдите и добавьте ваш домен
- Войдите с помощью действующего email и пароля.
- Введите доменное имя, которое хотите настроить (оно должно совпадать с 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.<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 здесь.