Minor changes
This commit is contained in:
parent
347706835e
commit
a7ace0d021
8 changed files with 853 additions and 0 deletions
67
business-server/Easy-Appointments.md
Normal file
67
business-server/Easy-Appointments.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Easy!Appointments docker-compose.yaml example
|
||||
|
||||
https://github.com/alextselegidis/easyappointments
|
||||
|
||||
```
|
||||
services:
|
||||
easyappointments:
|
||||
image: alextselegidis/easyappointments:${APP_VERSION}
|
||||
restart: always
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
environment:
|
||||
- BASE_URL=${SITE_URL}
|
||||
- DEBUG_MODE=FALSE
|
||||
- DB_HOST=mysql
|
||||
- DB_NAME=easyappointments
|
||||
- DB_USERNAME=${DB_USER}
|
||||
- DB_PASSWORD=${DB_PASS}
|
||||
- MAIL_PROTOCOL=mail
|
||||
- MAIL_SMTP_DEBUG=0
|
||||
- MAIL_SMTP_AUTH=0
|
||||
- MAIL_SMTP_HOST=${EMAIL_SMTP_HOST}
|
||||
- MAIL_SMTP_USER=${EMAIL_SMTP_USER}
|
||||
- MAIL_SMTP_PASS=${EMAIL_SMTP_PASS}
|
||||
- MAIL_SMTP_CRYPTO=tls
|
||||
- MAIL_SMTP_PORT=${EMAIL_SMTP_PORT}
|
||||
- MAIL_FROM_ADDRESS=${EMAIL_SMTP_FROM}
|
||||
- MAIL_FROM_NAME=${EMAIL_SMTP_FROM}
|
||||
- MAIL_REPLY_TO_ADDRESS=${EMAIL_SMTP_FROM}
|
||||
|
||||
mysql:
|
||||
image: mysql:8.4
|
||||
restart: always
|
||||
command: [
|
||||
'--mysql-native-password=ON',
|
||||
]
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${DB_PASS}
|
||||
- MYSQL_DATABASE=easyappointments
|
||||
- MYSQL_USER=${DB_USER}
|
||||
- MYSQL_PASSWORD=${DB_PASS}
|
||||
volumes:
|
||||
- mysql:/var/lib/mysql
|
||||
|
||||
db-backup:
|
||||
image: tiredofit/db-backup
|
||||
volumes:
|
||||
- db_backup:/backup
|
||||
environment:
|
||||
- CONTAINER_ENABLE_MONITORING=false
|
||||
- DB_HOST=mysql
|
||||
- DB_TYPE=mariadb
|
||||
- DB_NAME=easyappointments
|
||||
- DB_USER=${DB_USER}
|
||||
- DB_PASS=${DB_PASS}
|
||||
- DEFAULT_DB_DUMP_FREQ=1440
|
||||
- DEFAULT_DB_DUMP_BEGIN=0000
|
||||
- DEFAULT_COMPRESSION=BZ
|
||||
- DB_CLEANUP_TIME=8640
|
||||
- MD5=TRUE
|
||||
- DEFAULT_BACKUP_BEGIN=+1
|
||||
restart: always
|
||||
|
||||
volumes:
|
||||
mysql:
|
||||
db_backup:
|
||||
```
|
||||
5
business-server/Hostinger How-to's.md
Normal file
5
business-server/Hostinger How-to's.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[VPS Setup Guide](https://www.hostinger.com/support/5723772-how-to-connect-to-your-vps-via-ssh-at-hostinger/)
|
||||
[Setting up the Firewall](https://www.hostinger.com/support/8172641-how-to-use-a-managed-vps-firewall-at-hostinger/)
|
||||
[Best practices](https://www.hostinger.com/tutorials/vps-security)
|
||||
[VPS monitoring with Kodee](https://www.youtube.com/watch?v=LpmOMzQDxFk)
|
||||
[VPS support articles](https://www.hostinger.com/support/vps/)
|
||||
34
business-server/Only-Office.md
Normal file
34
business-server/Only-Office.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
Here’s a **Docker Compose** file for ONLYOFFICE Workspace Community Edition, configured to work with your existing nginx setup and avoiding ports 3000/3001. This setup uses ports **3002** (for the Community Server) and **3003** (for the Document Server), which you can proxy via nginx to `docs.iso27diy.com`.
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
onlyoffice-community-server:
|
||||
image: onlyoffice/communityserver:latest
|
||||
container_name: onlyoffice-community-server
|
||||
restart: always
|
||||
environment:
|
||||
- DOCUMENT_SERVER_PORT_3003=3003
|
||||
volumes:
|
||||
- ./community-data:/var/www/onlyoffice/Data
|
||||
- ./community-logs:/var/log/onlyoffice
|
||||
ports:
|
||||
- "3002:80"
|
||||
depends_on:
|
||||
- onlyoffice-document-server
|
||||
|
||||
onlyoffice-document-server:
|
||||
image: onlyoffice/documentserver:latest
|
||||
container_name: onlyoffice-document-server
|
||||
restart: always
|
||||
environment:
|
||||
- JWT_SECRET=your_jwt_secret_here # Change this to a secure random string
|
||||
volumes:
|
||||
- ./document-data:/var/www/onlyoffice/Data
|
||||
- ./document-logs:/var/log/onlyoffice
|
||||
ports:
|
||||
- "3003:80"
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
```
|
||||
228
business-server/VPS administration.md
Normal file
228
business-server/VPS administration.md
Normal file
|
|
@ -0,0 +1,228 @@
|
|||
# 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>` |
|
||||
449
business-server/VPS install playbook for Umami.md
Normal file
449
business-server/VPS install playbook for Umami.md
Normal file
|
|
@ -0,0 +1,449 @@
|
|||
# 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@<jouw-server-ip>
|
||||
```
|
||||
|
||||
### 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@<jouw-server-ip>
|
||||
```
|
||||
|
||||
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 <ip-adres>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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:** `<jouw-server-ip>` (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 `<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.
|
||||
|
||||
```html
|
||||
<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:
|
||||
|
||||
```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 |
|
||||
24
business-server/VPS security.md
Normal file
24
business-server/VPS security.md
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# VPS Beveiligingsmaatregelen
|
||||
|
||||
### Server hardening
|
||||
- Root SSH-login uitgeschakeld
|
||||
- Dedicated non-root gebruiker (`deploy`) met sudo-rechten
|
||||
- SSH key authenticatie
|
||||
- UFW firewall — alleen poorten 22, 80 en 443 open
|
||||
- fail2ban actief — IP-adressen worden 1 uur geblokkeerd na 5 mislukte SSH-pogingen binnen 10 minuten
|
||||
|
||||
### Netwerk & encryptie
|
||||
- HTTPS afgedwongen via Nginx + Let's Encrypt
|
||||
- Umami gebonden aan `127.0.0.1` — niet publiek bereikbaar
|
||||
- PostgreSQL alleen op intern Docker-netwerk
|
||||
- SSL automatisch vernieuwd via Certbot
|
||||
|
||||
### Applicatiebeveiliging
|
||||
- Umami standaardwachtwoord direct wijzigen bij eerste login
|
||||
- `APP_SECRET` gerandomiseerd met `openssl rand -base64 32`
|
||||
- Cookieloze tracking — geen persoonsgegevens opgeslagen
|
||||
- `data-domains` attribuut beperkt tracking tot productiedomein
|
||||
|
||||
### Nog te doen
|
||||
- [ ] Periodieke database backups instellen (cronjob) — een cronjob op de VPS die dagelijks een dump maakt en bijv. naar je lokale machine of een object storage stuurt. Nu verlies je bij een VPS-crash alles wat na je laatste handmatige backup binnenkomt.
|
||||
- [ ] fail2ban installeren voor SSH brute-force bescherming — blokkeert automatisch IP-adressen die te vaak fout inloggen via SSH. Eén commando om te installeren, vrijwel geen configuratie nodig.
|
||||
28
business-server/VPS specs.md
Normal file
28
business-server/VPS specs.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# VPS specificaties
|
||||
|
||||
- srv1119777.hstgr.cloud
|
||||
- ssh root@72.61.188.15
|
||||
- IPv4: 72.61.188.15
|
||||
- IPv6: 2a02:4780:41:a7e5::1
|
||||
|
||||
* Plan: KVM 2 VPS, datacenter Frankfurt (DE), Verloopt op 2027-12-04
|
||||
* OS: Ubuntu 24.04 LTS
|
||||
* Resources: 8 GB RAM, 2 vCPU, 100 GB SSD (≈ 2.8 GB used), bandwidth 8 TB/maand (≈ 0.01% used)
|
||||
* Back-ups: Automatische dagelijkse back-up: **uitgeschakeld**
|
||||
|
||||
## Samenvatting gebruikte poorten en services
|
||||
per 10 April 2026
|
||||
|
||||
| Service | Poort | Bereikbaar vanaf |
|
||||
| --------------- | ------- | -------------------- |
|
||||
| Nginx | 80, 443 | Internet |
|
||||
| Umami (Node.js) | 3000 | Alleen localhost |
|
||||
| PostgreSQL | 5432 | Alleen Docker intern |
|
||||
Docker draait ook, natuurlijk
|
||||
|
||||
- [ ] regelmatig updates en backups draaien
|
||||
- [ ] logs draaien voor afwijkingen
|
||||
|
||||
|
||||
|
||||
|
||||
18
business-server/VPS stack.md
Normal file
18
business-server/VPS stack.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# VPS Infrastructure stack
|
||||
per 11 April 2026
|
||||
|
||||
| Component | Details | Platform |
|
||||
|-----------|---------|----------|
|
||||
| Website hosting | iso27diy.com — statische site | Netlify |
|
||||
| DNS | iso27diy.com + analytics.iso27diy.com | Netlify DNS |
|
||||
| Domeinregistrar | iso27diy.com gekocht hier | Hover |
|
||||
| VPS | Ubuntu 24.04 · 8 GB RAM · 2 vCPU · 100 GB SSD | Hostinger |
|
||||
| Analytics app | analytics.iso27diy.com · poort 3000 (intern) | Umami |
|
||||
| Database | PostgreSQL 15 · alleen Docker intern netwerk | Docker |
|
||||
| Reverse proxy | Handelt HTTPS af, stuurt door naar Umami op :3000 | Nginx |
|
||||
| SSL | Automatisch vernieuwd · analytics.iso27diy.com | Let's Encrypt |
|
||||
| fail2ban | SSH brute-force bescherming | Hostinger VPS |
|
||||
|
||||
---
|
||||
|
||||
[VPS security](VPS%20security.md)
|
||||
Loading…
Add table
Add a link
Reference in a new issue