# Onderhoudsplan — iso27diy.com VPS & analytics stack

## Dagelijks (geautomatiseerd)

Niets te doen — de volgende zaken lopen automatisch:

- fail2ban monitort SSH-pogingen en blokkeert aanvallers
- Docker herstart Umami en PostgreSQL bij crashes (`restart: always`)
- Nginx en fail2ban herstarten automatisch na een server-reboot (`systemctl enable`)
- Let's Encrypt vernieuwt het SSL-certificaat automatisch via Certbot

---

## Wekelijks (~10 minuten)

### Services controleren

```bash
# Nginx en fail2ban
sudo systemctl status nginx fail2ban

# Umami en PostgreSQL
cd ~/umami && docker compose ps
```

Wat je wil zien: `active (running)` voor systemd-services, `running` voor Docker containers.

### fail2ban activiteit bekijken

```bash
sudo fail2ban-client status sshd
```

Veel bans op korte tijd kan wijzen op een gerichte aanval — overweeg dan `bantime` te verhogen in `jail.local`.

### Schijfruimte controleren

```bash
df -h
```

Let op de partitie waar `/` op staat. Bij meer dan 80% gebruik actie ondernemen (logs opruimen, Docker images opschonen).

### Docker logs vluchtig controleren

```bash
cd ~/umami && docker compose logs --since 24h umami
```

Zoek naar foutmeldingen of crashes.

---

## Maandelijks (~30 minuten)

### Systeemupdates installeren

```bash
sudo apt update && apt list --upgradable
sudo apt upgrade -y
```

Herstart daarna de server als de kernel geüpdatet is:

```bash
sudo reboot
```

Controleer na herstart of alle services weer draaien (zie wekelijkse check).

### Umami updaten

```bash
cd ~/umami
docker compose pull
docker compose up -d
```

### Database backup maken

```bash
docker compose exec db pg_dump -U umami umami > \
  ~/umami/backup-$(date +%Y%m%d).sql
```

Kopieer de backup naar een externe locatie (lokale machine of cloud opslag):

```bash
# Vanaf je lokale machine:
scp deploy@<server-ip>:~/umami/backup-$(date +%Y%m%d).sql ~/backups/
```

Verwijder oude backups op de server (bewaar de laatste 3):

```bash
ls -t ~/umami/backup-*.sql | tail -n +4 | xargs rm -f
```

### SSL-certificaat controleren

```bash
sudo certbot renew --dry-run
```

Dit simuleert vernieuwing zonder het certificaat daadwerkelijk te vervangen. Als het slaagt, is automatische vernieuwing correct ingesteld.

Vervaldatum handmatig inzien:

```bash
sudo certbot certificates
```

### Nginx-logs bekijken op verdacht verkeer

```bash
sudo tail -n 100 /var/log/nginx/access.log
sudo tail -n 50 /var/log/nginx/error.log
```

Veel 404-verzoeken op vreemde paden (bijv. `/wp-admin`, `/.env`) zijn normaal scannerverkeer — fail2ban pakt dit gedeeltelijk af. Bij aanhoudend verkeer van één IP kun je dat handmatig blokkeren:

```bash
sudo ufw deny from <ip-adres>
```

### Docker opschonen

Ongebruikte images en containers stapelen zich op en verbruiken schijfruimte:

```bash
docker system prune -f
```

---

## Kwartaal (~1 uur)

### UTM campagnes updaten

- Voeg nieuwe campagnewaarden toe aan het UTM-scheme (nieuwe kwartaalcodes)
- Archiveer verlopen campagnes in de UTM tracker spreadsheet (status → `archived`)
- Controleer in Umami welke bronnen en campagnes het meest verkeer opleveren

### Wachtwoorden roteren

- Umami admin-wachtwoord wijzigen via **Settings → Profile**
- Overweeg het database-wachtwoord in `docker-compose.yml` te roteren (vereist herstart van de stack)

### Firewall-regels reviewen

```bash
sudo ufw status verbose
```

Verwijder regels die niet meer nodig zijn.

### Serverresources evalueren

```bash
# CPU en geheugen
htop

# Schijfruimte per map
du -sh ~/umami/*
sudo du -sh /var/log/*
```

Bij structureel hoog geheugen- of CPU-gebruik: overweeg een groter Hostinger-pakket.

---

## Bij incidenten

### Service ligt plat

```bash
# Herstart individuele service
sudo systemctl restart nginx
sudo systemctl restart fail2ban
cd ~/umami && docker compose restart
```

### Umami dashboard niet bereikbaar

Controleer in volgorde:

1. Draaien de Docker containers? → `docker compose ps`
2. Luistert Nginx? → `sudo systemctl status nginx`
3. Klopt de DNS? → `dig analytics.iso27diy.com`
4. Is het SSL-certificaat geldig? → `sudo certbot certificates`

### Database herstellen vanuit backup

```bash
cd ~/umami
docker compose stop umami
docker compose exec db psql -U umami -c "DROP DATABASE umami;"
docker compose exec db psql -U umami -c "CREATE DATABASE umami;"
docker compose exec -T db psql -U umami umami < backup-YYYYMMDD.sql
docker compose start umami
```

### Jezelf buitengesloten via fail2ban

Doe dit vanaf een andere internetverbinding (bijv. mobiel):

```bash
sudo fail2ban-client set sshd unbanip <jouw-ip>
```

---

## Handige commando's — spiekbriefje

| Wat | Commando |
|-----|----------|
| Services checken | `sudo systemctl status nginx fail2ban` |
| Docker containers checken | `cd ~/umami && docker compose ps` |
| Schijfruimte | `df -h` |
| fail2ban status | `sudo fail2ban-client status sshd` |
| Umami logs | `cd ~/umami && docker compose logs -f umami` |
| Nginx logs | `sudo tail -n 100 /var/log/nginx/access.log` |
| Database backup | `docker compose exec db pg_dump -U umami umami > backup-$(date +%Y%m%d).sql` |
| Systeem updaten | `sudo apt update && sudo apt upgrade -y` |
| Umami updaten | `cd ~/umami && docker compose pull && docker compose up -d` |
| Docker opschonen | `docker system prune -f` |
| IP blokkeren | `sudo ufw deny from <ip>` |
| IP deblokkeren (fail2ban) | `sudo fail2ban-client set sshd unbanip <ip>` |
