server-up/docs/meldingen.md
Ramon 87fb9d19d1
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m22s
v0.7.50-beta - meldingen, schijfruimte, backups controleren en extern wegzetten
Het onbewaakte deel was de zwakke plek: geplande taken draaiden 's nachts en
een storing kwam alleen in het auditlog terecht.

Meldingen (core/notify.py):
- ntfy, webhook (Discord/Slack/Gotify) en e-mail, alle drie met de
  standaardbibliotheek.
- Gebeurtenissen: mislukte backup, onleesbaar archief, vastgelopen taak,
  weinig schijfruimte, beschikbare update, gestopte container.
- Eén bericht per ronde; bij schijfruimte en gestopte containers alleen bij
  de overgang, zodat je niet elk uur hetzelfde krijgt.
- Testknop die eerst opslaat, zodat je test wat je net hebt ingevuld.
- send() gooit nooit: het kanaal mag de taak die de melding veroorzaakte niet
  alsnog laten omvallen.

Schijfruimte (core/diskspace.py):
- Controle vóór elke backup; past het niet, dan weigeren in plaats van
  halverwege afbreken.
- DISK_MIN_FREE_GB blijft gereserveerd, DISK_WARN_PCT kleurt de balk rood.
- Per filesystem één regel in de backuplijst.

Backups controleren:
- Elk nieuw archief wordt helemaal uitgelezen (tar-structuur plus
  gzip-checksum, die aan het eind staat).
- Diepe variant pakt echt uit naar een tijdelijke map, met dezelfde
  beperkingen als een echt herstel.
- Resultaat staat in de metadata en als schildje in de lijst.

Backups de deur uit:
- Downloadknop.
- BACKUP_OFFSITE_DIR kopieert elke nieuwe backup naar een gemounte schijf,
  NFS- of SMB-share, via .part zodat een afgebroken kopie herkenbaar onaf is.
- Ruimtecontrole op de bestemming, want een weggevallen mount laat vaak een
  lege map op de systeemschijf achter.

NOTIFY_TOKEN en NOTIFY_EMAIL_PASSWORD zijn write-only.

Nieuw: docs/meldingen.md; docs/backups.md uitgebreid. Getest tegen een
draaiende server met een echte ontvanger. 1064 tests groen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-28 19:41:35 +02:00

120 lines
4.2 KiB
Markdown

# Meldingen
Geplande backups, de updatecheck en de bewaking van je containers draaien in de
achtergrond, meestal 's nachts. Zonder meldingen komt een storing alleen in het
auditlog terecht — en dat lees je pas als je al een probleem hebt. Een backup
die drie weken stilletjes faalt, ontdek je op het slechtst denkbare moment.
Instellen doe je onder **Instellingen → Meldingen**.
---
## Kanalen
Alle drie werken met wat er al in Server Up zit; er komt geen extra software of
account aan te pas.
### ntfy
Het eenvoudigst als je iets op je telefoon wil. Installeer de ntfy-app, verzin
een topicnaam die niet te raden is, en vul de URL in:
```
https://ntfy.sh/serverup-a7f3k9x2
```
Iedereen die de topicnaam kent kan meelezen én zelf berichten sturen, dus kies
iets willekeurigs. Draai je een eigen ntfy-server met toegangscontrole, vul dan
ook het **token** in; dat gaat mee als `Authorization: Bearer …`.
### Webhook
Een POST met een JSON-body. Dezelfde instelling werkt voor Discord, Slack,
Gotify en zelfgebouwde ontvangers: de body bevat naast `title` en `message` ook
`content` (wat Discord leest) en `text` (wat Slack leest).
```json
{
"title": "1 backup(s) mislukt",
"message": "De geplande backup is niet gelukt voor:\n\n• vaultwarden: …",
"content": "**1 backup(s) mislukt**\n…",
"text": "*1 backup(s) mislukt*\n…",
"priority": "hoog",
"source": "server-up"
}
```
Voor Discord gebruik je de webhook-URL uit **Kanaalinstellingen → Integraties**.
### E-mail
SMTP met STARTTLS (standaard), SSL/TLS of onversleuteld. Vul server, poort,
gebruikersnaam, wachtwoord, afzender en ontvanger in.
> Gebruik je Gmail of Microsoft 365, dan heb je een app-wachtwoord nodig; je
> gewone wachtwoord wordt geweigerd.
---
## Waarover je bericht krijgt
| Gebeurtenis | Wanneer |
|---|---|
| `backup_failed` | Een geplande backup is voor een of meer stacks mislukt |
| `backup_verify` | Een archief bleek niet leesbaar bij de controle |
| `job_failed` | Een geplande taak liep vast |
| `disk_low` | Een schijf zakte onder de ingestelde drempel |
| `update_available` | Er staat een nieuwe versie klaar |
| `stack_down` | Een container die zou moeten draaien, draait niet meer |
Standaard staan alleen de storingen aan. "Update beschikbaar" is nuttig maar
geen probleem, dus die vink je zelf aan.
Er komt één bericht per ronde, niet één per stack: bij een volle schijf faalt
alles tegelijk en dan wil je geen twintig meldingen. Voor `disk_low` en
`stack_down` wordt alleen de *overgang* gemeld — anders krijg je elk uur
hetzelfde bericht tot je het oplost.
---
## Testen
Met **Test versturen** stuurt Server Up meteen een bericht via het ingestelde
kanaal. De instellingen worden eerst opgeslagen, zodat je test wat je net hebt
ingevuld en niet de vorige waarden.
Komt het niet aan, dan staat de foutmelding erbij: een HTTP-code bij ntfy en
webhooks, de SMTP-fout bij e-mail. Elke poging komt ook in het auditlog onder
bron `notify`, dus je kunt teruglezen of er gemeld is — en of dat lukte.
---
## Wat er níét gebeurt
Een storing in het meldingskanaal mag nooit de taak omvergooien die de melding
veroorzaakte. Mislukt het versturen, dan gaat de backup gewoon door en vind je
het terug in het auditlog. Een onbereikbare ntfy-server maakt dus geen kapotte
backup.
---
## Instellingen
| Sleutel | Standaard | Betekenis |
|---|---|---|
| `NOTIFY_CHANNEL` | leeg | `ntfy`, `webhook`, `email`, of leeg voor uit |
| `NOTIFY_URL` | leeg | Topic- of webhook-URL |
| `NOTIFY_TOKEN` | leeg | Bearer-token; wordt nooit teruggegeven door de API |
| `NOTIFY_EVENTS` | storingen | Lijst met gebeurtenissen hierboven |
| `NOTIFY_EMAIL_HOST` | leeg | SMTP-server |
| `NOTIFY_EMAIL_PORT` | `587` | SMTP-poort |
| `NOTIFY_EMAIL_SECURITY` | `starttls` | `starttls`, `ssl` of `geen` |
| `NOTIFY_EMAIL_USER` | leeg | Gebruikersnaam |
| `NOTIFY_EMAIL_PASSWORD` | leeg | Wachtwoord; wordt nooit teruggegeven |
| `NOTIFY_EMAIL_FROM` | leeg | Afzender |
| `NOTIFY_EMAIL_TO` | leeg | Ontvanger |
| `STACK_DOWN_CHECK` | `true` | Containers bewaken die zouden moeten draaien |
Het token en het SMTP-wachtwoord zijn **write-only**: je kunt ze instellen, maar
de API geeft ze nooit terug — alleen of ze gevuld zijn. Een leeg veld betekent
bij het opslaan "niet wijzigen", net als bij de git-tokens.