# Gotify — Push Notifications + Email Relay Self-hosted notification server with SMTP email forwarding sidecar. ## Architecture ``` Forgejo webhook ──POST──→ Gotify API (:80/message) │ ┌─────────┼─────────┐ ▼ ▼ Push notification SMTP emailer sidecar (mobile/desktop) (polls → sends email) ``` ## Setup (one-time, after first deploy) ### 1. Encrypt secrets before committing ```bash # Edit secrets.yaml with real values first, then: sops -e -i k8s/apps/gotify/secrets.yaml ``` ### 2. Create Gotify app + client tokens 1. Login to `https://gotify.riotpiao.com` with admin creds 2. **Applications** → Create `forgejo` → copy **app token** 3. **Clients** → Create `smtp-emailer` → copy **client token** 4. Update `gotify-tokens` secret: ```bash kubectl -n notifications create secret generic gotify-tokens \ --from-literal=app-token= \ --from-literal=client-token= \ --dry-run=client -o yaml | kubectl apply -f - ``` ### 3. Configure Forgejo webhook In each Forgejo repo → **Settings** → **Webhooks** → **Add Webhook** → **Gotify**: | Field | Value | |-------|-------| | Target URL | `http://gotify.notifications.svc.cluster.local/message` | | Token | The **app token** from step 2 | | Events | Pull Request (Created, Merged, Closed) | Or via API: ```bash FORGEJO_TOKEN="" APP_TOKEN="" curl -s -X POST "https://forgejo.riotpiao.com/api/v1/repos/rock/homelab/hooks" \ -H "Authorization: token $FORGEJO_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "type": "gotify", "active": true, "config": { "content_type": "json", "url": "http://gotify.notifications.svc.cluster.local/message?token='"$APP_TOKEN"'" }, "events": ["pull_request", "pull_request_assign", "pull_request_review"], "authorization_header": "" }' ``` ### 4. Add CoreDNS rewrite (if accessing via public hostname) Only needed if Cloudflare Tunnel is used for gotify.riotpiao.com: ``` # terraform/files/coredns/Corefile — add rewrite: rewrite name gotify.riotpiao.com ingress-nginx-controller.ingress-nginx.svc.cluster.local ``` Then: `cd terraform && terraform apply && cd .. && make apply-cp` ### 5. SMTP providers | Provider | Host | Port | Notes | |----------|------|------|-------| | Gmail | smtp.gmail.com | 587 | Use App Password (2FA required) | | Resend | smtp.resend.com | 587 | Free 100 emails/day | | Sendgrid | smtp.sendgrid.net | 587 | Free 100 emails/day | | Mailgun | smtp.mailgun.org | 587 | Free 5000/month | ## Notification priority levels | Priority | Meaning | Email forwarded? | |----------|---------|-----------------| | 0-4 | Low (info) | No (below MIN_PRIORITY=5) | | 5-7 | Normal (PR created) | Yes | | 8-10 | High (PR merged, failures) | Yes | ## Verify ```bash # Test push notification APP_TOKEN="" curl -X POST "https://gotify.riotpiao.com/message?token=$APP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"title":"Test","message":"Hello from homelab","priority":5}' # Check email sidecar logs kubectl -n notifications logs deployment/gotify -c smtp-emailer --tail=20 ```