fix(infra): GlitchTip EMAIL_URL dummy:// → consolemail:// (crashes Django on start) #223

Merged
lekss361 merged 1 commit from fix/glitchtip-email-url-consolemail into main 2026-05-16 17:56:54 +00:00
Owner

Контекст

После merge #205 и развёртывания GlitchTip 6.1.6 в проде, контейнер glitchtip-web упал в restart-loop с ошибкой Django:

File "/usr/local/lib/python3.14/site-packages/environ/environ.py", line 826
    raise ImproperlyConfigured(f'Invalid email schema {url.scheme}')
django.core.exceptions.ImproperlyConfigured: Invalid email schema dummy

Причина

django-environ в новой версии GlitchTip валидирует схему email_url() на старте и НЕ знает dummy://. Допустимые схемы:

  • smtp:// / smtps:// / submission:// — реальная отправка
  • consolemail:// — печатает в stdout, удобно для self-hosted без SMTP
  • dummymail:// — silent no-op (то что я изначально хотел указать в брифе)
  • filemail:// / memorymail:// / locmemmail://

Это была моя ошибка в брифе devops-агенту для PR #205.

Фикс

Одна строка в docker-compose.prod.yml:

-      EMAIL_URL: dummy://
+      EMAIL_URL: consolemail://

consolemail:// лучше dummymail:// потому что в docker logs видна попытка отправки email (например, при reset-password) — удобно дебажить. Шлёт никуда, безопасно.

Hotfix на VPS

Та же замена была применена руками через sed -i 's|EMAIL_URL: dummy://|EMAIL_URL: consolemail://|g' /opt/gendesign/docker-compose.prod.yml чтобы разблокировать GlitchTip без ожидания этого PR. Но git reset --hard при следующем deploy перетёр hotfix → этот PR делает фикс постоянным.

Test plan

  • GlitchTip consolemail:// стартует на VPS под hotfix (verified)
  • После merge: deploy не сломает контейнер, glitchtip-web остаётся healthy
  • Smoke: docker exec glitchtip-web ./manage.py shellfrom django.core.mail import send_mail; send_mail(...) печатает в stdout
  • #204 — основной issue GlitchTip
  • #205 — PR где был внесён баг
## Контекст После merge #205 и развёртывания GlitchTip 6.1.6 в проде, контейнер `glitchtip-web` упал в restart-loop с ошибкой Django: ``` File "/usr/local/lib/python3.14/site-packages/environ/environ.py", line 826 raise ImproperlyConfigured(f'Invalid email schema {url.scheme}') django.core.exceptions.ImproperlyConfigured: Invalid email schema dummy ``` ## Причина `django-environ` в новой версии GlitchTip валидирует схему `email_url()` на старте и НЕ знает `dummy://`. Допустимые схемы: - `smtp://` / `smtps://` / `submission://` — реальная отправка - `consolemail://` — печатает в stdout, удобно для self-hosted без SMTP - `dummymail://` — silent no-op (то что я изначально хотел указать в брифе) - `filemail://` / `memorymail://` / `locmemmail://` Это была моя ошибка в брифе devops-агенту для PR #205. ## Фикс Одна строка в `docker-compose.prod.yml`: ```diff - EMAIL_URL: dummy:// + EMAIL_URL: consolemail:// ``` `consolemail://` лучше `dummymail://` потому что в `docker logs` видна попытка отправки email (например, при reset-password) — удобно дебажить. Шлёт никуда, безопасно. ## Hotfix на VPS Та же замена была применена руками через `sed -i 's|EMAIL_URL: dummy://|EMAIL_URL: consolemail://|g' /opt/gendesign/docker-compose.prod.yml` чтобы разблокировать GlitchTip без ожидания этого PR. Но `git reset --hard` при следующем deploy перетёр hotfix → этот PR делает фикс постоянным. ## Test plan - [x] GlitchTip `consolemail://` стартует на VPS под hotfix (verified) - [ ] После merge: deploy не сломает контейнер, `glitchtip-web` остаётся healthy - [ ] Smoke: `docker exec glitchtip-web ./manage.py shell` → `from django.core.mail import send_mail; send_mail(...)` печатает в stdout ## Related - #204 — основной issue GlitchTip - #205 — PR где был внесён баг
lekss361 added 1 commit 2026-05-16 17:39:11 +00:00
Author
Owner

Code review: APPROVE

Scope: 1 file, +1/-1 — hotfix для glitchtip-web restart-loop после merge #205.

Verified

  • Diff exactly matches описание PR: docker-compose.prod.yml line ~141, env block сервиса glitchtip-web, EMAIL_URL: dummy://EMAIL_URL: consolemail://. Никакие другие строки/сервисы не затронуты.
  • consolemail:// — валидная django-environ схема (resolves to django.core.mail.backends.console.EmailBackend). Полный allowlist django-environ: smtp/smtps/submission/consolemail/dummymail/filemail/memorymail/locmemmail — bug Invalid email schema dummy устраняется.
  • Выбор consolemail:// over dummymail:// обоснован: stdout-видимость попыток отправки в docker logs помогает дебажить (например, password-reset attempts), при этом email никуда реально не уходит → безопасно для self-hosted без SMTP.
  • Mergeable: true, base SHA 5a7d405 совпадает с current main HEAD, no conflicts.
  • Parallel PR #222 (feat(nspd): denorm) затрагивает data/sql/ + backend/app/ — no overlap с docker-compose.prod.yml.

Findings

Нет blocking issues. Nitpicks:

  • NIT: Стоит зафиксировать django-environ allowlist в .claude/rules/deploy.md или vault fixes/glitchtip-email-url-schema.md чтобы не наступить повторно при добавлении email-зависимых Django-сервисов (Sentry-like). Не блокирует merge.
  • NIT: GlitchTip docs упоминают DEFAULT_FROM_EMAIL как opt-in для real SMTP — текущее errors@gendsgn.ru остаётся, но при consolemail:// оно фактически no-op (only printed). Не баг, но можно в follow-up закомментировать с пометкой "activate when SMTP configured" для чистоты конфига.

Test plan post-merge

  • docker compose -f docker-compose.prod.yml up -d glitchtip-web после deploy — контейнер healthy, нет ImproperlyConfigured в логах
  • docker logs glitchtip-web 2>&1 | grep -i "email schema" → empty
  • (optional) smoke send_mail() в Django shell → видно в docker logs

Verdict: APPROVE — fix корректный, минимальный, точно соответствует root cause.


Blocked for auto-merge per .claude/rules/git-pr.md (touches docker-compose*.yml). Human merge required to make hotfix permanent (VPS already patched manually, git reset --hard следующего deploy перетрёт hotfix без этого merge).

<!-- gendesign-review-bot: sha=1ec0a72 verdict=approve --> ## Code review: APPROVE **Scope**: 1 file, +1/-1 — hotfix для `glitchtip-web` restart-loop после merge #205. ### Verified - Diff exactly matches описание PR: `docker-compose.prod.yml` line ~141, env block сервиса `glitchtip-web`, `EMAIL_URL: dummy://` → `EMAIL_URL: consolemail://`. Никакие другие строки/сервисы не затронуты. - `consolemail://` — валидная django-environ схема (resolves to `django.core.mail.backends.console.EmailBackend`). Полный allowlist django-environ: `smtp/smtps/submission/consolemail/dummymail/filemail/memorymail/locmemmail` — bug `Invalid email schema dummy` устраняется. - Выбор `consolemail://` over `dummymail://` обоснован: stdout-видимость попыток отправки в `docker logs` помогает дебажить (например, password-reset attempts), при этом email никуда реально не уходит → безопасно для self-hosted без SMTP. - Mergeable: `true`, base SHA `5a7d405` совпадает с current main HEAD, no conflicts. - Parallel PR #222 (`feat(nspd): denorm`) затрагивает `data/sql/` + `backend/app/` — no overlap с `docker-compose.prod.yml`. ### Findings Нет blocking issues. Nitpicks: - **NIT**: Стоит зафиксировать django-environ allowlist в `.claude/rules/deploy.md` или vault `fixes/glitchtip-email-url-schema.md` чтобы не наступить повторно при добавлении email-зависимых Django-сервисов (Sentry-like). Не блокирует merge. - **NIT**: GlitchTip docs упоминают `DEFAULT_FROM_EMAIL` как opt-in для real SMTP — текущее `errors@gendsgn.ru` остаётся, но при `consolemail://` оно фактически no-op (only printed). Не баг, но можно в follow-up закомментировать с пометкой "activate when SMTP configured" для чистоты конфига. ### Test plan post-merge - [ ] `docker compose -f docker-compose.prod.yml up -d glitchtip-web` после deploy — контейнер healthy, нет `ImproperlyConfigured` в логах - [ ] `docker logs glitchtip-web 2>&1 | grep -i "email schema"` → empty - [ ] (optional) smoke `send_mail()` в Django shell → видно в `docker logs` ### Verdict: APPROVE — fix корректный, минимальный, точно соответствует root cause. --- Blocked for auto-merge per `.claude/rules/git-pr.md` (touches `docker-compose*.yml`). Human merge required to make hotfix permanent (VPS already patched manually, `git reset --hard` следующего deploy перетрёт hotfix без этого merge).
lekss361 merged commit 813b8bd589 into main 2026-05-16 17:56:54 +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#223
No description provided.