build(qa): take the SMTP host, port and TLS flag from QA_ stack variables (#258)
Linting / lint (pull_request) Successful in 2m9s
SonarQube Analysis / sonarqube (pull_request) Successful in 28m7s

QA_SMTP_HOST, QA_SMTP_PORT and QA_SMTP_SECURE were set on the stack but nothing read them: the compose file hardcoded all three, so changing one in Portainer had no effect and gave no sign of that. They now interpolate like the credentials beside them.

Each keeps its Brevo value as a default rather than being left to fall through. The mailer's own fallbacks are Gmail's — smtp.gmail.com, 465, implicit TLS — and Brevo is STARTTLS on 587, so an unset variable with no default here would quietly aim QA at Gmail and fail at send time rather than at boot. `:-` supplies the default only when the variable is unset or empty, so setting one still wins.

Verified with `docker compose config` both ways: unset resolves to smtp-relay.brevo.com/587/false, and set resolves to the supplied values. The #107 compose guard still passes.

Production is deliberately untouched. It hardcodes the same three and nobody has asked to vary them there, and a needless change to the production stack is not worth the deploy.

Closes #258

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 11:46:17 -05:00
co-authored by Claude Opus 5
parent 46f5064567
commit cbb0090579
+18 -7
View File
@@ -37,6 +37,13 @@
# QA_SMTP_USER — Brevo SMTP login. Named QA_ for the same reason as the
# QA_SMTP_PASSWORD database password: pasting production's variables in here
# QA_SMTP_FROM must not silently work.
#
# Optional, each defaulting to the Brevo value it used to be hardcoded to, so
# QA can be aimed at another relay without editing this file:
# QA_SMTP_HOST — default smtp-relay.brevo.com
# QA_SMTP_PORT — default 587
# QA_SMTP_SECURE — default false. Brevo is STARTTLS on 587, so this stays
# false unless the relay is changed to an implicit-TLS one.
# ADMIN_GATE_SECRET — the shared secret Nginx Proxy Manager injects as the
# X-Admin-Gate header on the gated location. Both sides must
# hold the same value or the admin API returns 403. See #63.
@@ -80,13 +87,17 @@ services:
# flows — verification, password reset, favorite-sold alerts and the
# cart-reminder cron — cannot be regression tested without it. See #87.
#
# Host, port and secure are not secrets and are pinned here rather than
# inherited: the mailer's fallbacks are Gmail's (smtp.gmail.com, 465,
# TLS) and Brevo needs 587 with STARTTLS, which is why SMTP_SECURE is
# false. Getting these wrong fails at send time, not at boot.
- SMTP_HOST=smtp-relay.brevo.com
- SMTP_PORT=587
- SMTP_SECURE=false
# Host, port and secure are not secrets, and they are now settable from
# the stack so QA can be pointed at a different relay without editing this
# file. Each keeps the Brevo value as its default rather than being left
# to fall through: the mailer's own fallbacks are Gmail's (smtp.gmail.com,
# 465, TLS) and Brevo needs 587 with STARTTLS, so an unset variable with
# no default here would silently aim QA at Gmail and fail at send time
# rather than at boot. `:-` supplies the default only when the variable is
# unset or empty, so setting one still wins.
- SMTP_HOST=${QA_SMTP_HOST:-smtp-relay.brevo.com}
- SMTP_PORT=${QA_SMTP_PORT:-587}
- SMTP_SECURE=${QA_SMTP_SECURE:-false}
- SMTP_USER=${QA_SMTP_USER}
- SMTP_PASSWORD=${QA_SMTP_PASSWORD}
- SMTP_FROM=${QA_SMTP_FROM}