Размещено самостоятельно
Начало работы
Наше решение для самостоятельного размещения электронной почты, как и все наши продукты, имеет полностью открытый исходный код — как на стороне клиента, так и на стороне сервера. Это означает:
- Полная прозрачность: Каждая строка кода, обрабатывающая ваши электронные письма, доступна для публичного просмотра.
- Вклад сообщества: Любой может внести улучшения или исправить ошибки.
- Безопасность благодаря открытости: Уязвимости могут быть выявлены и устранены мировым сообществом.
- Отсутствие привязки к поставщику: Вы никогда не зависите от нашей компании.
Вся кодовая база доступна на 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-адреса
Взгляните на наш Часто задаваемые вопросы здесь.