# 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 1. Server beveiligen (gebruiker, firewall, SSH) 2. Docker installeren 3. Subdomein aanmaken in Netlify DNS 4. Umami deployen met Docker Compose 5. Nginx instellen als reverse proxy 6. SSL certificaat installeren (Let's Encrypt) 7. Tracking script toevoegen aan Netlify site 8. UTM-tracking testen Geschatte tijd: **45–60 minuten** --- ## Stap 1 — Server beveiligen ### 1.1 Inloggen als root ```bash ssh root@ ``` ### 1.2 Systeem updaten ```bash apt update && apt upgrade -y ``` ### 1.3 Nieuwe gebruiker aanmaken Werken als root is risicovol. Maak een aparte gebruiker aan: ```bash adduser deploy usermod -aG sudo deploy ``` Kies een sterk wachtwoord wanneer daarom gevraagd wordt. ### 1.4 SSH-toegang instellen voor nieuwe gebruiker ```bash rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy ``` Test in een **nieuw terminalvenster** (sluit de huidige sessie nog niet): ```bash ssh deploy@ ``` Als dat werkt: goed. Sluit nu de root-sessie. ### 1.5 Root-login via SSH uitschakelen ```bash 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: ```bash sudo systemctl restart ssh ``` ### 1.6 Firewall instellen ```bash sudo ufw allow OpenSSH sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable ``` Controleer de status: ```bash 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 ```bash sudo apt install -y fail2ban ``` Maak een configuratiebestand aan: ```bash sudo nano /etc/fail2ban/jail.local ``` Plak: ```ini [DEFAULT] bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s ``` Activeer en start: ```bash sudo systemctl enable fail2ban sudo systemctl start fail2ban ``` Status controleren: ```bash sudo fail2ban-client status sshd ``` Een gebanned IP handmatig deblokkeren: ```bash sudo fail2ban-client set sshd unbanip ``` --- ## Stap 2 — Docker installeren ```bash 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): ```bash sudo usermod -aG docker deploy newgrp docker ``` Test of het werkt: ```bash 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: 1. Log in op [app.netlify.com](https://app.netlify.com) 2. Ga naar **Domains** (linksboven in het menu) 3. Klik op `iso27diy.com` 4. Klik op **Add new record** 5. Vul in: - **Type:** `A` - **Name:** `analytics` - **Value:** `` (het IP-adres van je Hostinger VPS) - **TTL:** laat op standaard staan 1. Klik **Save** Het DNS-record propageert doorgaans binnen 5–15 minuten. Je kunt het controleren via: ```bash 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 ```bash mkdir -p ~/umami && cd ~/umami ``` ### 4.2 docker-compose.yml aanmaken ```bash nano docker-compose.yml ``` Plak de volgende inhoud: ```yaml 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: ```bash 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 ```bash docker compose up -d ``` Controleer of de containers draaien: ```bash 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: ```bash 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 ```bash sudo apt install -y nginx ``` ### 5.2 Configuratie aanmaken ```bash sudo nano /etc/nginx/sites-available/analytics.iso27diy.com ``` Plak: ```nginx 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 ```bash 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 ```bash 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: ```bash 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 1. Ga naar **Settings → Websites → Add website** 2. Vul in: - **Name:** iso27diy.com - **Domain:** iso27diy.com 3. Klik **Save** 4. Klik op het **tracking code** icoontje naast de website om je `data-website-id` te kopiëren --- ## Stap 8 — Tracking script toevoegen aan Netlify site Voeg dit toe aan de `` 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. ```html ``` 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: ```bash 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: ```bash 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 |