Self-hostingstack voor een kleine VPS: wat past in 2 GB en 4 GB RAM
Een realistische self-hosted starterstack op een kleine VPS: Docker Compose, Caddy, Vaultwarden, Uptime Kuma en Forgejo, een RAM-budget per dienst, back-ups en basisbeveiliging.
Kort gezegd: een VPS met 2 GB draait met gemak een self-hosted kern van Caddy (HTTPS-reverse proxy), Vaultwarden (wachtwoorden), Uptime Kuma (monitoring) en Forgejo (git) onder Docker Compose, met ongeveer 0,6 tot 1 GB RAM. Voeg je Nextcloud toe, dan wil je 4 GB; kies je lichtere tools zoals Syncthing of File Browser, dan volstaat 2 GB nog steeds.
Deze gids geeft een werkend Compose-bestand, een RAM-budget per dienst en de twee dingen die de meeste selfhosted opzetten overslaan tot het te laat is: back-ups buiten de server en een dichtgetimmerd netwerkoppervlak. De commando's gaan uit van Debian 12/13 of Ubuntu 24.04 met Docker Engine en de Compose-plugin, geïnstalleerd vanuit de officiële repository van Docker.
RAM-budget per dienst
De cijfers zijn typisch resident geheugen bij inactief tot licht gebruik, voor één tot vijf gebruikers met SQLite waar dat wordt ondersteund. Pieken tijdens upgrades, git clones van grote repository's of Nextcloud-previews kunnen hoger liggen, dus houd minstens 20% marge aan en voeg een swapbestand van 1 tot 2 GB toe.
| Dienst | Rol | Typisch RAM | Opmerkingen |
|---|---|---|---|
| OS + sshd + journald | Basissysteem | 150–250 MB | Debian of Ubuntu minimal |
| Docker Engine + containerd | Container-runtime | 80–120 MB | Vaste kosten van het gebruik van containers |
| Caddy | Reverse proxy, automatische HTTPS | 20–50 MB | Eén binary, geen database |
| Vaultwarden | Bitwarden-compatibele wachtwoordserver | 20–60 MB | Geschreven in Rust, SQLite |
| Uptime Kuma | Monitoring van uptime en certificaten | 100–200 MB | Node.js; groeit met het aantal monitors |
| Forgejo | Git-hosting, issues, CI-hooks | 150–300 MB | Go, SQLite prima voor kleine teams |
| Nextcloud + MariaDB + Redis | Bestanden, agenda, contacten | 600 MB–1,2 GB | PHP-FPM-workers domineren |
| Syncthing | Bestandssynchronisatie, geen websuite | 50–150 MB | Lichter alternatief voor Nextcloud |
| File Browser | Webbestandsbeheer | 20–40 MB | Bestanden uploaden en delen via HTTPS |
| Radicale | CalDAV en CardDAV | 30–50 MB | Agenda en contacten zonder Nextcloud |
De grootte van de VPS kiezen
De kernstack (Caddy, Vaultwarden, Uptime Kuma, Forgejo) plus het basissysteem komt uit rond 0,6 tot 1 GB, wat past op een server met 2 vCPU / 2 GB met ruimte voor Syncthing en Radicale. Nextcloud met MariaDB en Redis duwt het totaal naar ongeveer 1,5 tot 2,2 GB, dus 4 GB is het realistische minimum als je de volledige suite plus al het andere wilt. Ook schijfruimte telt: Forgejo-repository's en gesynchroniseerde bestanden groeien, terwijl de diensten zelf maar een paar GB nodig hebben.
Bij NoctisNode past de kernstack op het Pulse-pakket (2 vCPU, 2 GB RAM, 40 GB NVMe, $10 per 28 dagen), en de kern plus Nextcloud op Umbra (4 vCPU, 4 GB, 60 GB NVMe, $15 per 28 dagen). Beide zijn KVM met volledige root en een dedicated IPv4, en kunnen met Monero of andere crypto worden betaald. Niets in deze gids hangt af van de provider.
Docker Compose-bestand
Alleen Caddy publiceert webpoorten; de apps zijn uitsluitend bereikbaar via het interne Compose-netwerk. Forgejo publiceert ook poort 2222 voor git via SSH, zodat OpenSSH op de host op zijn eigen poort blijft. Zet `FORGEJO_TAG` in een `.env`-bestand op de huidige hoofdversie van Forgejo en vervang de voorbeelddomeinen door je eigen DNS-records.
# /srv/stack/compose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy/data:/data
- ./caddy/config:/config
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "true" # set to "false" after creating your account
volumes:
- ./vaultwarden:/data
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./uptime-kuma:/app/data
forgejo:
image: codeberg.org/forgejo/forgejo:${FORGEJO_TAG}
restart: unless-stopped
environment:
USER_UID: "1000"
USER_GID: "1000"
FORGEJO__service__DISABLE_REGISTRATION: "true"
volumes:
- ./forgejo:/data
ports:
- "2222:22"
# /srv/stack/Caddyfile
# vault.example.com {
# reverse_proxy vaultwarden:80
# }
# status.example.com {
# reverse_proxy uptime-kuma:3001
# }
# git.example.com {
# reverse_proxy forgejo:3000
# }Opstarten
- 01.Laat A- (en AAAA-)records voor `vault`, `status` en `git` naar het IP van de server wijzen, zodat Caddy bij de eerste start certificaten kan ophalen.
- 02.Maak `/srv/stack` aan, zet `compose.yaml`, `Caddyfile` en `.env` daarin en voer `docker compose up -d` uit.
- 03.Open de Forgejo-URL en rond de installer af; het eerste account dat je daar aanmaakt wordt de beheerder, omdat openbare registratie is uitgeschakeld.
- 04.Maak je Vaultwarden-account aan, zet daarna `SIGNUPS_ALLOWED` op `"false"` en voer `docker compose up -d` opnieuw uit. Laat het beheerpaneel uitgeschakeld, tenzij je een met Argon2 gehashte `ADMIN_TOKEN` instelt.
- 05.Maak direct na de start de beheerder van Uptime Kuma aan, want de installatiepagina staat open voor iedereen tot je dat doet.
- 06.Voeg monitors toe voor elke dienst en voor het verlopen van certificaten, idealiter vanaf een tweede locatie, omdat een monitor op dezelfde server zijn eigen storing niet kan melden.
Note · Caddy regelt HTTPS automatisch. Voor headers, rate limits en complexere routering, zie de handleiding voor Caddy als reverse proxy.
Back-ups die echt terug te zetten zijn
Alles wat de moeite van het bewaren waard is, staat onder `/srv/stack`: SQLite-databases, Forgejo-repository's, Caddy-certificaten en je config. Reken niet op snapshots van de provider; houd je eigen versleutelde kopie buiten de server bij met restic, zoals beschreven in de handleiding voor restic-back-ups.
SQLite-bestanden die worden gekopieerd terwijl een dienst schrijft, kunnen inconsistent zijn. De eenvoudigste veilige aanpak op een kleine server is de stack stoppen voor de minuut die een back-up duurt. Voeg je Nextcloud met MariaDB toe, dump de database dan met `mariadb-dump` vóór de restic-run. Test minstens één keer een restore naar een tijdelijke map; een back-up die je nooit hebt teruggezet is een gok.
#!/bin/sh
# /usr/local/sbin/stack-backup (run nightly from cron or a systemd timer)
# needs RESTIC_REPOSITORY and RESTIC_PASSWORD_FILE in the environment
cd /srv/stack || exit 1
docker compose stop
rc=0
restic backup /srv/stack --tag stack || rc=$?
docker compose start
[ "$rc" -eq 0 ] || exit "$rc"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneBasisbeveiliging
- ▹SSH: alleen sleutels, geen root-login met wachtwoord, eventueel een niet-standaard poort; zie [de handleiding voor SSH-hardening](/guides/ssh-hardening).
- ▹Kanttekening bij de firewall: poorten die Docker publiceert omzeilen `ufw`-regels, omdat Docker zijn eigen iptables/nftables-chains schrijft. Publiceer alleen wat openbaar moet zijn (80, 443, 2222) en publiceer nooit database- of beheerpoorten.
- ▹Updates: schakel `unattended-upgrades` in voor de host en voer `docker compose pull && docker compose up -d` uit volgens een schema dat je ook echt aanhoudt.
- ▹Registratie: laat openbare aanmeldingen in Vaultwarden en Forgejo uit; nodig gebruikers in plaats daarvan uit.
- ▹Schijfversleuteling: zet `/srv` op een [versleutelde root](/guides/luks-encrypted-root) zodat een gekopieerd schijfimage niets prijsgeeft; gebruik op een externe server [LUKS op afstand ontgrendelen via SSH](/guides/luks-remote-unlock-ssh), en kies bij voorkeur het LUKS2-formaat, uitgelegd in [LUKS2 vs. LUKS1](/guides/luks2-vs-luks1).
- ▹Geheimen: `.env` en de datamap van Vaultwarden mogen alleen door root leesbaar zijn (`chmod 600`/`700`).
Veelgestelde vragen
QHoeveel RAM heb ik nodig voor self-hosting?
AEen self-hosted kernstack van Caddy, Vaultwarden, Uptime Kuma en Forgejo draait in ongeveer 0,6 tot 1 GB inclusief het OS en Docker, dus een VPS met 2 GB volstaat. Voeg je Nextcloud met MariaDB en Redis toe, dan is 4 GB het praktische minimum.
QKan ik Nextcloud draaien op een VPS met 2 GB?
AHet draait, maar naast andere diensten blijft er weinig marge over en wordt het traag bij previews of pieken in synchronisatie. Op 2 GB dekken Syncthing plus File Browser en Radicale bestanden, agenda en contacten met een fractie van het geheugen.
QIs Vaultwarden veilig om zelf te hosten?
AVaultwarden slaat alleen end-to-end versleutelde kluisgegevens op, dus een gecompromitteerde server legt niet direct wachtwoorden in platte tekst bloot. Houd aanmeldingen uit, houd het beheerpaneel uitgeschakeld of beschermd met een gehasht token, werk regelmatig bij en maak back-ups van de datamap.
QWat is de beste reverse proxy voor een selfhosted Docker-stack?
ACaddy is voor kleine opzetten het eenvoudigst, omdat het met een paar regels config automatisch HTTPS-certificaten haalt en vernieuwt. Nginx en Traefik werken ook, maar vergen meer configuratie.
QBeschermt ufw Docker-containers?
ANiet standaard. Poorten die met de Docker-optie `ports:` zijn gepubliceerd, omzeilen ufw omdat Docker zijn eigen firewallregels invoegt, dus publiceer alleen de poorten die openbaar moeten zijn.