NoctisNode
← HandleidingenSelf-hosting2026-10-239 min

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.

DienstRolTypisch RAMOpmerkingen
OS + sshd + journaldBasissysteem150–250 MBDebian of Ubuntu minimal
Docker Engine + containerdContainer-runtime80–120 MBVaste kosten van het gebruik van containers
CaddyReverse proxy, automatische HTTPS20–50 MBEén binary, geen database
VaultwardenBitwarden-compatibele wachtwoordserver20–60 MBGeschreven in Rust, SQLite
Uptime KumaMonitoring van uptime en certificaten100–200 MBNode.js; groeit met het aantal monitors
ForgejoGit-hosting, issues, CI-hooks150–300 MBGo, SQLite prima voor kleine teams
Nextcloud + MariaDB + RedisBestanden, agenda, contacten600 MB–1,2 GBPHP-FPM-workers domineren
SyncthingBestandssynchronisatie, geen websuite50–150 MBLichter alternatief voor Nextcloud
File BrowserWebbestandsbeheer20–40 MBBestanden uploaden en delen via HTTPS
RadicaleCalDAV en CardDAV30–50 MBAgenda 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

  1. 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.
  2. 02.Maak `/srv/stack` aan, zet `compose.yaml`, `Caddyfile` en `.env` daarin en voer `docker compose up -d` uit.
  3. 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.
  4. 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.
  5. 05.Maak direct na de start de beheerder van Uptime Kuma aan, want de installatiepagina staat open voor iedereen tot je dat doet.
  6. 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 --prune

Basisbeveiliging

  • ▹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.

Self-hostingstack voor een kleine VPS: wat past in 2 GB en 4 GB RAM · NoctisNode