diff --git a/apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx b/apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx
index a037dfbf00..e5dc7c6248 100644
--- a/apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx
+++ b/apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx
@@ -125,16 +125,35 @@ docker compose --profile postgres --profile observability --profile backup up -d
docker compose --profile observability up -d always starts clean even before
you've configured anywhere to send notifications. This is intentional — the shipped config
can't bake in a Slack/Discord/email destination that works for everyone — but it means
- nothing pages anyone until you edit alertmanager/alertmanager.yml yourself.
- Treat this as a required step, not an optional one, for any deployment you expect to run
- unattended.
+ nothing pages anyone until you enable a real receiver. Treat this as a required step, not an
+ optional one, for any deployment you expect to run unattended.
- The fastest verified path: create a Discord channel webhook (channel settings → Integrations
- → Webhooks → New Webhook), then uncomment the discord receiver block in{" "}
- alertmanager/alertmanager.yml and point the root route at it. Slack, email, and
- a generic webhook receiver (for PagerDuty or a custom handler) are also ready to uncomment
- in the same file.
+ Don't edit the committed alertmanager/alertmanager.yml in place — deploys
+ git pull this repo, so a local edit to a tracked file either blocks the next
+ pull or gets silently overwritten by it. Instead, copy it to a gitignored{" "}
+ alertmanager/alertmanager.local (matches the existing *.local{" "}
+ ignore rule) and make your receiver/route changes there — the fastest verified path is
+ uncommenting the discord receiver block and pointing the root route at it,
+ using webhook_url_file: /etc/alertmanager/discord_url so the webhook URL itself
+ lives in its own gitignored file next to it, never in a file docker-compose.yml or git ever
+ tracks. Slack, email, and a generic webhook receiver (for PagerDuty or a custom handler) are
+ also ready to uncomment in the same template. Then point Alertmanager at your local copy via{" "}
+ docker-compose.override.yml:
+
+ Restart with docker compose up -d --no-deps alertmanager to pick up both files.
+ The whole alertmanager/ directory is mounted read-only into the container, so
+ any gitignored file you add there (the local config, a secret file it references) shows up
+ at the same path with no docker-compose.yml edit required.
Until you do, alerts are still visible without any extra setup: open Grafana and check the{" "}
diff --git a/docker-compose.yml b/docker-compose.yml
index 4aa8a931b0..b7752eded6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -520,7 +520,12 @@ services:
expose:
- "9093" # in-network only; reach the UI/API via `docker compose port` or a tunnel
volumes:
- - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
+ # Mounts the whole host directory (not just the yml) so an operator's private overrides are visible
+ # inside the container at the same paths, with no docker-compose.yml edit needed per file added:
+ # a real receiver config (e.g. ./alertmanager/alertmanager.local, gitignored via the *.local rule
+ # above -- point docker-compose.override.yml's alertmanager `command:` at it) and/or a secret file a
+ # local config's webhook_url_file /etc/alertmanager/