Deze handleiding beschrijft de volledige installatie van Nextcloud All-in-One (AIO) op een Ubuntu VPS — van de eerste root-login tot een volledig werkende en beveiligde omgeving. De stappen zijn uitgeschreven voor Hetzner maar werken op elke VPS-provider die Ubuntu 24.04 aanbiedt en losse datadisks ondersteunt (DigitalOcean Volumes, Vultr Block Storage, Linode Block Storage, etc.).
Wat je nodig hebt voordat je begint:
- Een VPS met Ubuntu 24.04 LTS — minimaal 2 vCPU en 4 GB RAM
- Een losse datadisk/volume gekoppeld aan de VPS (minimaal 20 GB)
- SSH-toegang als root
- Een domeinnaam met de mogelijkheid om DNS-records aan te passen
- Optioneel: een S3-compatibele bucket voor offsite backups (Hetzner Object Storage, Backblaze B2, etc.)
Docker en UFW werken niet zoals je verwacht. Docker schrijft iptables-regels direct — buiten UFW om. Een poort die je met ufw deny blokkeert kan toch bereikbaar zijn als Docker er een binding op heeft. De betrouwbare manier om poorten te blokkeren is de externe firewall van je VPS-provider. UFW zetten we ook in, maar als aanvullende laag — niet als enige bescherming.
Overzicht van de stappen
- Systeem updaten
- Niet-root gebruiker aanmaken
- SSH hardenen
- Datadisk formatteren en koppelen
- Docker installeren
- Firewall instellen (provider + UFW)
- Fail2ban instellen
- Automatische beveiligingsupdates
- Mappenstructuur aanmaken
- DNS controleren
- AIO starten via Docker Compose
- AIO configureren: domein en containers
- Poort 8080 sluiten
- Nextcloud inrichten: 2FA, taal, cron
- Backup instellen
Systeem updaten
Log in op de VPS als root en werk het systeem meteen bij. Dit zorgt dat beveiligingspatches actief zijn voordat je iets installeert.
apt update && apt upgrade -y
apt install -y curl wget ca-certificatesNiet-root gebruiker aanmaken
Werken als root is onnodig risicovol — een typefout met de verkeerde rechten kan de hele server kapotmaken. Maak een gewone beheerdergebruiker aan en kopieer de SSH-sleutel van root naar die gebruiker.
# Vervang 'beheerder' door je eigen gebruikersnaam
adduser beheerder
usermod -aG sudo beheerder
# SSH-sleutel kopiëren van root
mkdir -p /home/beheerder/.ssh
cp /root/.ssh/authorized_keys /home/beheerder/.ssh/authorized_keys
chown -R beheerder:beheerder /home/beheerder/.ssh
chmod 700 /home/beheerder/.ssh
chmod 600 /home/beheerder/.ssh/authorized_keysOpen nu een nieuw terminalvenster en log in als de nieuwe gebruiker. Test of sudo werkt voordat je de huidige root-sessie sluit:
ssh beheerder@ip-adres-vps
sudo whoami # moet 'root' teruggevenSSH hardenen
Zet root-login via SSH uit. Dat kan nu veilig omdat je in de vorige stap hebt geverifieerd dat de nieuwe gebruiker sudo-rechten heeft.
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# Controleer
grep PermitRootLogin /etc/ssh/sshd_configGebruik je alleen SSH-sleutels en geen wachtwoorden? Zet dan ook PasswordAuthentication no in /etc/ssh/sshd_config. Dat maakt brute-force aanvallen via SSH onmogelijk.
Datadisk formatteren en koppelen
Een losse datadisk houdt de Nextcloud-data gescheiden van de OS-schijf. Zo kun je de disk later vergroten of losgekoppeld overzetten naar een andere server zonder het besturingssysteem aan te raken.
Zoek eerst de naam van de aangekoppelde disk:
lsblkJe ziet iets als sdb zonder mountpoint — dat is de losse datadisk. Bij Hetzner verschijnt die ook als /dev/disk/by-id/scsi-0HC_Volume_[ID]. Gebruik de naam die lsblk toont.
# Vervang sdb door de naam die lsblk toonde
sudo mkfs.ext4 /dev/sdb
# Mountpunt aanmaken
sudo mkdir -p /mnt/data
# Tijdelijk mounten om te testen
sudo mount /dev/sdb /mnt/dataVoeg de disk toe aan /etc/fstab zodat hij automatisch wordt gekoppeld na een reboot:
# UUID ophalen van de disk
sudo blkid /dev/sdbKopieer de UUID-waarde en voeg deze regel toe aan /etc/fstab:
UUID=jouw-uuid-hier /mnt/data ext4 defaults,nofail 0 2# Testen of fstab correct is
sudo mount -a
df -h /mnt/data # moet de disk tonenStel daarna de rechten in zodat Nextcloud AIO naar de disk kan schrijven:
sudo mkdir -p /mnt/data/nextcloud
sudo chown -R root:root /mnt/data/nextcloud
sudo chmod 750 /mnt/data/nextcloudDocker installeren
Installeer Docker via de officiële repository — niet via apt install docker.io, want die versie in Ubuntu's standaardrepo is verouderd.
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
# Gebruiker toevoegen aan docker-groep
sudo usermod -aG docker $USER
newgrp docker
# Controleren
docker --versionFirewall instellen
Stel eerst de externe firewall van je VPS-provider in — dat is de betrouwbare laag. Daarna UFW als aanvullende bescherming.
In de firewall van je VPS-provider, sta de volgende inkomende poorten toe:
- Poort 22 (TCP) — SSH. Beperk dit bij voorkeur tot je eigen IP-adres.
- Poort 80 (TCP) — HTTP, nodig voor Let's Encrypt-validatie.
- Poort 443 (TCP) — HTTPS voor Nextcloud.
- Poort 8443 (TCP) — Nextcloud zelf (AIO gebruikt poort 8443 in directe modus).
- Poort 8080 (TCP) — AIO admin interface, tijdelijk nodig tijdens setup. Daarna sluiten.
Stel daarna UFW in als aanvullende laag:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8443/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw statusFail2ban instellen
Fail2ban monitort logbestanden en blokkeert automatisch IP-adressen die te vaak mislukken bij inlogpogingen. Een geautomatiseerd script dat duizenden wachtwoorden probeert op je SSH-server wordt na 5 mislukte pogingen voor een uur geblokkeerd.
sudo apt install -y fail2ban
# Lokale configuratie aanmaken (overschrijft nooit de standaard)
sudo tee /etc/fail2ban/jail.local > /dev/null <Automatische beveiligingsupdates
Ubuntu kan beveiligingsupdates automatisch installeren via unattended-upgrades. Zo blijft de server veilig zonder dat je er dagelijks naar hoeft te kijken.
sudo apt install -y unattended-upgrades
sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null <Mappenstructuur aanmaken
AIO beheert zelf zijn containers, maar de data-locatie geef je zelf op. We slaan die op de losse datadisk op.
sudo mkdir -p /mnt/data/nextcloud
sudo mkdir -p /opt/nextcloud
# Rechten voor AIO
sudo chown -R root:root /mnt/data/nextcloud
sudo chmod 750 /mnt/data/nextcloudDNS controleren
AIO valideert bij de setup of je domeinnaam naar het juiste IP-adres wijst. Doe dit dus vóórdat je AIO start. Maak een A-record aan bij je DNS-provider:
- Naam: cloud (of nextcloud, of wat je wilt)
- Type: A
- Waarde: het publieke IPv4-adres van de VPS
- TTL: 300
Controleer na een paar minuten of het record al actief is:
# Vervang cloud.jouwdomein.nl door je eigen domein
dig +short cloud.jouwdomein.nl
# Vergelijk met het IP van de VPS
curl -s ifconfig.meBeide moeten hetzelfde IP-adres tonen. Is dat nog niet zo, wacht dan tot de DNS-propagatie klaar is (kan tot een uur duren).
Let's Encrypt heeft een ratelimiet. Na 5 mislukte certificaataanvragen voor hetzelfde domein in één week ben je geblokkeerd. Controleer het DNS-record zorgvuldig voordat je AIO start.
AIO starten via Docker Compose
Maak een Docker Compose-bestand aan in /opt/nextcloud. Docker Compose maakt het later eenvoudiger om de configuratie aan te passen en bij te houden.
sudo nano /opt/nextcloud/docker-compose.ymlPlak de volgende inhoud. Vervang /mnt/data/nextcloud alleen als je een andere datadisk-locatie hebt gebruikt:
services:
nextcloud-aio-mastercontainer:
image: ghcr.io/nextcloud-releases/all-in-one:latest
init: true
restart: always
container_name: nextcloud-aio-mastercontainer
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 80:80
- 8080:8080
- 8443:8443
environment:
- NEXTCLOUD_DATADIR=/mnt/data/nextcloud
volumes:
nextcloud_aio_mastercontainer:
name: nextcloud_aio_mastercontainerStart de container:
cd /opt/nextcloud
sudo docker compose up -d
# Logs bekijken
sudo docker logs -f nextcloud-aio-mastercontainerWacht tot de logs melden dat de mastercontainer klaar is (ongeveer 30 seconden). Druk daarna op Ctrl+C om de logweergave te sluiten — de container blijft gewoon draaien.
# Controleer of de container actief is
sudo docker psAIO configureren: domein en containers
Open een browser en ga naar https://ip-adres-vps:8080. Je krijgt een certificaatwaarschuwing — dat is normaal, de AIO admin interface gebruikt een zelfondertekend certificaat. Klik op Geavanceerd → Doorgaan.
Je ziet het AIO-setupscherm met een initieel wachtwoord. Sla dit direct op — in een wachtwoordmanager of op een veilige plek. Recovery is omslachtig: docker exec nextcloud-aio-mastercontainer grep password /mnt/docker-aio-config/data/configuration.json
Voer je domeinnaam in (bijv. cloud.jouwdomein.nl) en klik op Submit. AIO controleert of het domein naar dit IP wijst en of poort 80 bereikbaar is. Als de validatie slaagt, ga je naar het volgende scherm.
Optionele modules: je kunt extra diensten toevoegen. Begin conservatief — je kunt ze later altijd nog aanzetten:
- Collabora Online — Office-documenten bewerken in de browser. Vereist minimaal 2 GB extra RAM.
- Nextcloud Talk — videobellen en chat. Zet ook poort 3478 (TCP + UDP) open voor TURN-serververkeer als je dit inschakelt.
- ClamAV — virusscanner. Gebruikt ~1 GB RAM constant. Alleen zinvol bij veel externe bestandsuploads.
- Imaginary — snellere voorbeeldweergave van afbeeldingen. Lichtgewicht.
Klik op Start containers. AIO downloadt alle images en start de stack op — dit duurt de eerste keer 5 tot 15 minuten. Wacht tot alle containers groen zijn.
Zodra alle containers draaien, is Nextcloud bereikbaar via https://cloud.jouwdomein.nl. De admin-inloggegevens staan in de AIO interface — kopieer ze.
Poort 8080 sluiten
Poort 8080 staat nu open voor het hele internet. Iedereen die het IP-adres kent, kan de AIO admin interface bereiken. Sluit deze poort direct na de installatie — zowel in de provider-firewall als in UFW.
sudo ufw delete allow 8080/tcp
sudo ufw statusSluit ook poort 8080 in de externe firewall van je VPS-provider.
Als je later toch toegang nodig hebt tot de AIO admin interface, gebruik dan een SSH-tunnel:
# Voer dit uit op je eigen computer (niet op de VPS)
ssh -L 8080:localhost:8080 beheerder@ip-adres-vpsGa daarna naar https://localhost:8080. De tunnel is actief zolang het terminalvenster open staat.
Nextcloud inrichten: 2FA, taal en cron
Log in op Nextcloud als admin en doe de volgende instellingen meteen na de eerste login.
Beheer → Overzicht — controleer of er waarschuwingen zijn. Een schone AIO-installatie geeft hier normaal geen meldingen.
Taal en regio: Instellingen → Beheer → Basisinstellingen → Standaardtaal: Nederlands, Standaardlocatie: nl_NL.
Achtergrondtaken: AIO beheert dit automatisch via een ingebouwde cron-container. Je hoeft niets in te stellen, maar check of de cron-container actief is:
sudo docker ps | grep cronTwee-factor authenticatie: Instellingen → Beheer → Beveiliging → Twee-factor verificatie afdwingen. Verplicht voor het admin-account — aanbevolen voor alle gebruikers.
Redis: AIO configureert Redis automatisch. Controleer of het correct is ingesteld:
sudo docker exec -it nextcloud-aio-nextcloud php occ config:system:get memcache.localBackup instellen
AIO heeft een ingebouwde back-upfunctie op basis van BorgBackup. Ga in de AIO admin interface (via SSH-tunnel naar https://localhost:8080) naar Backup & Restore.
Als back-uplocatie heb je twee opties:
- Lokale map — bijv.
/mnt/backupop een aparte gemounte disk. Simpel, maar geen offsite bescherming. - S3-compatibele opslag — Hetzner Object Storage, Backblaze B2 of een vergelijkbare dienst. Offsite, aanbevolen.
Voor S3-opslag vul je in: bucket-naam, regio, endpoint-URL, access key en secret key van je provider. Stel de backup-frequentie in op dagelijks (bijv. 02:00) met een retentie van 30 dagen.
Maak daarna direct een eerste handmatige backup en controleer of die aankomt in je bucket of op de backup-locatie.
Zorg dat de back-uplocatie niet op dezelfde VPS staat als Nextcloud. Een falende server of corrupt bestandssysteem vernietigt dan zowel je data als je backup.
Na de installatie: wat je niet mag overslaan
- Wachtwoord van het admin-account wijzigen via Instellingen → Beveiliging naar een sterk, uniek wachtwoord
- 2FA instellen op het admin-account
- Backup testen — niet alleen aanmaken, maar ook een testrestore uitvoeren
- Serverupdates bijhouden:
sudo apt update && sudo apt upgrade(of vertrouwen op unattended-upgrades) - AIO-updates uitvoeren via de admin interface — altijd eerst een backup maken
- Periodiek controleren of poort 8080 dicht is via canyouseeme.org
Veelgemaakte fouten
Domeinvalidatie mislukt: "Domain does not point to this server"
Het A-record wijst nog niet naar het juiste IP, of DNS-propagatie is nog bezig. Controleer met dig +short cloud.jouwdomein.nl en vergelijk met curl -s ifconfig.me.
Domeinvalidatie mislukt: "Port 80 is not reachable"
Poort 80 is geblokkeerd in de provider-firewall, of er draait al iets op poort 80. Controleer: sudo ss -tlnp | grep ':80'.
Containers hangen op "Starting"
Waarschijnlijk te weinig geheugen. Controleer: free -h. Als Collabora actief is op 2 GB RAM, schakel het dan uit via de AIO admin interface.
Na een reboot zijn de beheerde containers weg
De mastercontainer herstart wel (restart: always), maar AIO herstart de beheerde containers (Nextcloud, MariaDB, Redis) soms pas nadat je inlogt in de admin interface en op "Start containers" klikt. Log in via de SSH-tunnel en start de stack opnieuw.
Let's Encrypt-certificaat mislukt
Poort 80 is niet bereikbaar of het DNS-record klopt nog niet. Controleer ook via crt.sh of je de ratelimiet hebt bereikt (5 aanvragen per domein per week).
AIO neemt veel werk uit handen — maar het is geen brandkast. De sloten werken alleen als je ze ook op slot doet: poort 8080 dicht, backups actief, updates bijhouden.
Nextcloud AIO laten installeren op een VPS?
Ik installeer en configureer Nextcloud AIO voor kleine organisaties die hun data zelf willen beheren, maar niet zelf de technische last willen dragen. Inclusief firewall, back-upstrategie, gebruikersbeheer en documentatie.
Plan een gesprek