Самохостинг

Початок роботи

Наше рішення для самохостингу електронної пошти, як і всі наші продукти, є 100% відкритим — як фронтенд, так і бекенд. Це означає:

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

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

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

  • 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 - електронна пошта для нагадувань про закінчення терміну дії сертифікатів certbot
  • DOMAIN - власний домен (наприклад, example.com) для налаштування самохостингу
  • AUTH_BASIC_USERNAME - ім’я користувача для першого налаштування захисту сайту
  • AUTH_BASIC_PASSWORD - пароль для першого налаштування захисту сайту
  • /root/.cloudflare.ini - (тільки для користувачів Cloudflare) конфігураційний файл Cloudflare, який використовується certbot для налаштування DNS. Потрібно встановити ваш API токен через dns_cloudflare_api_token. Докладніше тут. Example:
#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 для пошуку нічних оновлень, які безпечно перебудують і перезапустять компоненти інфраструктури.
  • Оновлення сертифікатів: Certbot / lets encrypt використовується для SSL сертифікатів, які та ключі закінчуються кожні 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 записи) є важливими для поштових серверів, оскільки вони допомагають перевірити легітимність сервера, що надсилає лист. Кожен хмарний провайдер робить це по-своєму, тому вам потрібно дізнатися, як додати "Reverse DNS", щоб зіставити хост і IP з відповідним ім’ям хоста. Найімовірніше, це знаходиться в розділі мережі провайдера.

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

Деякі інтернет-провайдери та хмарні провайдери блокують порт 25, щоб уникнути зловмисників. Можливо, вам доведеться звернутися до служби підтримки, щоб відкрити порт 25 для SMTP / вихідної пошти.

Початок роботи

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

  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.<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 тут.