9.3 KiB
Stappenplan: Umami op Hostinger VPS
Omgeving: Ubuntu 24.04 LTS · 8 GB RAM · 2 vCPU · 100 GB SSD
Doel: Umami analytics bereikbaar op analytics.iso27diy.com
Overzicht
- Server beveiligen (gebruiker, firewall, SSH)
- Docker installeren
- Subdomein aanmaken in Netlify DNS
- Umami deployen met Docker Compose
- Nginx instellen als reverse proxy
- SSL certificaat installeren (Let's Encrypt)
- Tracking script toevoegen aan Netlify site
- UTM-tracking testen
Geschatte tijd: 45–60 minuten
Stap 1 — Server beveiligen
1.1 Inloggen als root
ssh root@<jouw-server-ip>
1.2 Systeem updaten
apt update && apt upgrade -y
1.3 Nieuwe gebruiker aanmaken
Werken als root is risicovol. Maak een aparte gebruiker aan:
adduser deploy
usermod -aG sudo deploy
Kies een sterk wachtwoord wanneer daarom gevraagd wordt.
1.4 SSH-toegang instellen voor nieuwe gebruiker
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
Test in een nieuw terminalvenster (sluit de huidige sessie nog niet):
ssh deploy@<jouw-server-ip>
Als dat werkt: goed. Sluit nu de root-sessie.
1.5 Root-login via SSH uitschakelen
sudo nano /etc/ssh/sshd_config
Zoek de regel PermitRootLogin yes en verander die naar:
PermitRootLogin no
Sla op met Ctrl+O, sluit met Ctrl+X. Herstart SSH:
sudo systemctl restart ssh
1.6 Firewall instellen
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Controleer de status:
sudo ufw status
Je zou dit moeten zien:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
1.7 fail2ban installeren
sudo apt install -y fail2ban
Maak een configuratiebestand aan:
sudo nano /etc/fail2ban/jail.local
Plak:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Activeer en start:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Status controleren:
sudo fail2ban-client status sshd
Een gebanned IP handmatig deblokkeren:
sudo fail2ban-client set sshd unbanip <ip-adres>
Stap 2 — Docker installeren
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Voeg je gebruiker toe aan de docker-groep (zodat je geen sudo nodig hebt):
sudo usermod -aG docker deploy
newgrp docker
Test of het werkt:
docker run hello-world
Stap 3 — Subdomein aanmaken in Netlify DNS
Je domein iso27diy.com gebruikt Netlify als DNS. Zo voeg je het subdomein toe:
- Log in op app.netlify.com
- Ga naar Domains (linksboven in het menu)
- Klik op
iso27diy.com - Klik op Add new record
- Vul in:
- Type:
A - Name:
analytics - Value:
<jouw-server-ip>(het IP-adres van je Hostinger VPS) - TTL: laat op standaard staan
- Type:
- Klik Save
Het DNS-record propageert doorgaans binnen 5–15 minuten. Je kunt het controleren via:
dig analytics.iso27diy.com
Wacht met de volgende stap tot het IP-adres correct terugkomt.
Stap 4 — Umami deployen met Docker Compose
4.1 Map aanmaken
mkdir -p ~/umami && cd ~/umami
4.2 docker-compose.yml aanmaken
nano docker-compose.yml
Plak de volgende inhoud:
version: '3'
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami_password@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: vervang_dit_door_een_willekeurige_lange_string
depends_on:
db:
condition: service_healthy
restart: always
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami_password
volumes:
- umami-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami"]
interval: 5s
timeout: 5s
retries: 5
restart: always
volumes:
umami-db:
Belangrijk: vervang umami_password door een sterk wachtwoord, en vervang_dit_door_een_willekeurige_lange_string door een willekeurige string (bijv. via openssl rand -base64 32).
Genereer een willekeurige APP_SECRET:
openssl rand -base64 32
Kopieer de output en plak die als waarde voor APP_SECRET.
Sla op met Ctrl+O, sluit met Ctrl+X.
4.3 Umami starten
docker compose up -d
Controleer of de containers draaien:
docker compose ps
Beide services (umami en db) moeten de status running hebben. Dit kan 1–2 minuten duren bij de eerste start.
Controleer de logs als iets niet klopt:
docker compose logs -f
Stap 5 — Nginx instellen als reverse proxy
Nginx ontvangt het verkeer op poort 80/443 en stuurt het door naar Umami op poort 3000.
5.1 Nginx installeren
sudo apt install -y nginx
5.2 Configuratie aanmaken
sudo nano /etc/nginx/sites-available/analytics.iso27diy.com
Plak:
server {
listen 80;
server_name analytics.iso27diy.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Sla op en sluit.
5.3 Configuratie activeren
sudo ln -s /etc/nginx/sites-available/analytics.iso27diy.com \
/etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
nginx -t moet syntax is ok teruggeven.
Stap 6 — SSL certificaat installeren
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d analytics.iso27diy.com
Certbot vraagt om een e-mailadres en of je akkoord gaat met de voorwaarden. Na afloop past het de Nginx-configuratie automatisch aan voor HTTPS en regelt het automatische verlenging.
Controleer automatische verlenging:
sudo certbot renew --dry-run
Stap 7 — Eerste login en wachtwoord wijzigen
Ga naar https://analytics.iso27diy.com in je browser.
- Gebruikersnaam:
admin - Wachtwoord:
umami
Ga direct naar Settings → Profile en stel een sterk wachtwoord in.
Website toevoegen
- Ga naar Settings → Websites → Add website
- Vul in:
- Name: iso27diy.com
- Domain: iso27diy.com
- Klik Save
- Klik op het tracking code icoontje naast de website om je
data-website-idte kopiëren
Stap 8 — Tracking script toevoegen aan Netlify site
Voeg dit toe aan de <head> van je site. Hoe je dat doet hangt af van hoe je site gebouwd is, maar in de meeste gevallen is er een hoofd-HTML-template.
<script
defer
src="https://analytics.iso27diy.com/script.js"
data-website-id="jouw-website-id-hier"
data-domains="iso27diy.com">
</script>
Het data-domains attribuut zorgt dat bezoeken vanaf andere domeinen (zoals localhost tijdens ontwikkeling) niet meegeteld worden.
Na een Netlify deploy: ga naar je site, wacht een paar seconden, en controleer of er een bezoek verschijnt in het Umami dashboard onder Realtime.
Stap 9 — UTM-tracking testen
Maak een test-URL met UTM-parameters:
https://iso27diy.com/?utm_source=linkedin&utm_medium=post&utm_campaign=test&utm_content=cta-hero
Bezoek die URL in een browser. Ga dan in Umami naar:
Reports → UTM (of in het hoofddashboard onder Sources)
Je ziet daar de uitsplitsing per source, medium, campaign en content.
Updates uitvoeren
Umami brengt regelmatig updates uit. Updaten gaat zo:
cd ~/umami
docker compose pull
docker compose up -d
Database backup
Railway maakte geen automatische backups — op je eigen VPS ook niet, tenzij je dat instelt. Maak periodiek een handmatige backup:
docker compose exec db pg_dump -U umami umami > \
~/umami/backup-$(date +%Y%m%d).sql
Bewaar backups op een andere locatie (bijv. je lokale machine of een cloud opslag).
Samenvatting gebruikte poorten en services
| Service | Poort | Bereikbaar vanaf |
|---|---|---|
| Nginx | 80, 443 | Internet |
| Umami (Node.js) | 3000 | Alleen localhost |
| PostgreSQL | 5432 | Alleen Docker intern |