chore(ops): почта GlitchTip настраивается из окружения и на worker'е тоже #2914

Merged
lekss361 merged 1 commit from chore/glitchtip-email-alerts into main 2026-08-15 19:47:38 +00:00
Owner

Что не работало

Замер 15.08.2026 на проде:

docker exec glitchtip-web printenv EMAIL_URL  →  consolemail://

consolemail:// — бэкенд, который печатает письмо в stdout и никуда не отправляет. То есть почтовых уведомлений GlitchTip не было вообще, независимо от настроек внутри интерфейса.

Главное — не в web, а в worker. Письма и веб-хуки шлёт celery, то есть контейнер glitchtip-worker. У него в окружении не было ни EMAIL_URL, ни DEFAULT_FROM_EMAIL, ни GLITCHTIP_DOMAIN — вообще ни одной почтовой переменной. Настройка одного glitchtip-web не дала бы ни единого отправленного письма; это самая дорогая часть находки.

Правка

Оба сервиса читают адрес из окружения, с прежним поведением по умолчанию:

EMAIL_URL: ${GLITCHTIP_EMAIL_URL:-consolemail://}
DEFAULT_FROM_EMAIL: ${GLITCHTIP_FROM_EMAIL:-errors@gendsgn.ru}

Плюс GLITCHTIP_DOMAIN добавлен worker'у — без него ссылки внутри писем ведут в никуда.

Пароль почтового ящика в репозиторий не попадает: значение живёт в файле окружения на сервере.

Ловушка со схемой DSN — зафиксирована комментарием в коде

GlitchTip разбирает EMAIL_URL через django-environ. Подтверждено документацией библиотеки:

Схема Что включает Порт
smtp+ssl:// EMAIL_USE_SSL — implicit SSL 465
smtp+tls:// EMAIL_USE_TLS — STARTTLS 587
smtps:// deprecated, включает STARTTLS

У Beget работает только 465 с implicit SSL, поэтому нужна именно smtp+ssl://. Интуитивно похожая smtps:// даст STARTTLS и оборванное соединение — ровно та ошибка, на которую легко потратить вечер.

Что нужно сделать руками (без этого правка ничего не меняет)

В файл окружения на сервере (/opt/gendesign/, тот же, где GLITCHTIP_DB_PASS) добавить:

GLITCHTIP_EMAIL_URL=smtp+ssl://alerts%40meraocenka.ru:ПАРОЛЬ@smtp.beget.com:465
GLITCHTIP_FROM_EMAIL=alerts@meraocenka.ru

@ внутри логина кодируется как %40 — иначе разбор адреса сломается.

Затем пересоздать оба контейнера (перезапуск не перечитывает окружение):

docker compose -p gendesign -f docker-compose.prod.yml up -d --force-recreate --no-deps glitchtip-web glitchtip-worker

Проверка сквозняка — отправить тестовое письмо из shell worker'а:

docker exec glitchtip-worker ./manage.py shell -c \
  "from django.core.mail import send_mail; send_mail('проверка','тело',None,['alerts@meraocenka.ru'])"

Чего эта правка НЕ делает

Почтовый транспорт — только половина. В GlitchTip не заведено ни одного правила алертов: таблицы alerts_projectalert и alerts_alertrecipient пусты (замер 15.08.2026). Пока правил нет, рабочий SMTP всё равно никому ничего не пришлёт. Правила и второй канал (Telegram) идут отдельно.

## Что не работало Замер 15.08.2026 на проде: ``` docker exec glitchtip-web printenv EMAIL_URL → consolemail:// ``` `consolemail://` — бэкенд, который печатает письмо в stdout и никуда не отправляет. То есть почтовых уведомлений GlitchTip не было вообще, независимо от настроек внутри интерфейса. **Главное — не в web, а в worker.** Письма и веб-хуки шлёт celery, то есть контейнер `glitchtip-worker`. У него в окружении не было ни `EMAIL_URL`, ни `DEFAULT_FROM_EMAIL`, ни `GLITCHTIP_DOMAIN` — вообще ни одной почтовой переменной. Настройка одного `glitchtip-web` не дала бы ни единого отправленного письма; это самая дорогая часть находки. ## Правка Оба сервиса читают адрес из окружения, с прежним поведением по умолчанию: ```yaml EMAIL_URL: ${GLITCHTIP_EMAIL_URL:-consolemail://} DEFAULT_FROM_EMAIL: ${GLITCHTIP_FROM_EMAIL:-errors@gendsgn.ru} ``` Плюс `GLITCHTIP_DOMAIN` добавлен worker'у — без него ссылки внутри писем ведут в никуда. Пароль почтового ящика в репозиторий не попадает: значение живёт в файле окружения на сервере. ## Ловушка со схемой DSN — зафиксирована комментарием в коде GlitchTip разбирает `EMAIL_URL` через django-environ. Подтверждено документацией библиотеки: | Схема | Что включает | Порт | |---|---|---| | `smtp+ssl://` | `EMAIL_USE_SSL` — implicit SSL | **465** | | `smtp+tls://` | `EMAIL_USE_TLS` — STARTTLS | 587 | | `smtps://` | deprecated, включает STARTTLS | — | У Beget работает только 465 с implicit SSL, поэтому нужна именно `smtp+ssl://`. Интуитивно похожая `smtps://` даст STARTTLS и оборванное соединение — ровно та ошибка, на которую легко потратить вечер. ## Что нужно сделать руками (без этого правка ничего не меняет) В файл окружения на сервере (`/opt/gendesign/`, тот же, где `GLITCHTIP_DB_PASS`) добавить: ``` GLITCHTIP_EMAIL_URL=smtp+ssl://alerts%40meraocenka.ru:ПАРОЛЬ@smtp.beget.com:465 GLITCHTIP_FROM_EMAIL=alerts@meraocenka.ru ``` `@` внутри логина кодируется как `%40` — иначе разбор адреса сломается. Затем пересоздать оба контейнера (перезапуск не перечитывает окружение): ``` docker compose -p gendesign -f docker-compose.prod.yml up -d --force-recreate --no-deps glitchtip-web glitchtip-worker ``` Проверка сквозняка — отправить тестовое письмо из shell worker'а: ``` docker exec glitchtip-worker ./manage.py shell -c \ "from django.core.mail import send_mail; send_mail('проверка','тело',None,['alerts@meraocenka.ru'])" ``` ## Чего эта правка НЕ делает Почтовый транспорт — только половина. В GlitchTip **не заведено ни одного правила алертов**: таблицы `alerts_projectalert` и `alerts_alertrecipient` пусты (замер 15.08.2026). Пока правил нет, рабочий SMTP всё равно никому ничего не пришлёт. Правила и второй канал (Telegram) идут отдельно.
lekss361 added 1 commit 2026-08-15 19:39:34 +00:00
chore(ops): почта GlitchTip настраивается из окружения и на worker'е тоже
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 11s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
db68a15cc4
EMAIL_URL был захардкожен как consolemail:// — письма печатались в stdout
и никуда не уходили. Теперь адрес приходит из файла окружения на сервере
(GLITCHTIP_EMAIL_URL), пароль почтового ящика в репозиторий не попадает.

Главное здесь не web, а worker: письма и веб-хуки шлёт celery, а у
glitchtip-worker почтовых переменных не было вовсе. Настройка одного
web-сервиса не дала бы ни одного отправленного письма.

Схема DSN зафиксирована комментарием: для 465 нужен smtp+ssl://, а не
smtps:// — вторая помечена deprecated и включает STARTTLS, с которым
Beget рвёт соединение на 465.
lekss361 merged commit 677edd5f1b into main 2026-08-15 19:47:38 +00:00
lekss361 deleted branch chore/glitchtip-email-alerts 2026-08-15 19:47:38 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2914
No description provided.