Nextcloud draaien op een Raspberry Pi en bereikbaar maken met Cloudflare Tunnel
Host je eigen cloudopslag: draai Nextcloud en PostgreSQL met Docker Compose op een Raspberry Pi, en bereik het veilig van overal via een Cloudflare Tunnel, zonder poorten open te zetten.
Bijgewerkt op 1 november 20265 min lezen
In deze gids zetten we Nextcloud op een Raspberry Pi en maken we het bereikbaar vanaf het internet met een Cloudflare Tunnel. Je hoeft geen poorten open te zetten op je router. Ik gebruik een Raspberry Pi 4B, maar een Pi 5 of een andere kleine Linux-server werkt op dezelfde manier.
Wat is Nextcloud, en waarom zou je het gebruiken?
Nextcloud is een self-hosted, open-source alternatief voor OneDrive of Google Drive. Je bewaart je bestanden, foto's en video's op je eigen hardware, en je krijgt er extra's bij zoals agenda's, contacten en notities. Ik wilde mijn eigen cloudopslag zonder afhankelijk te zijn van een derde partij, en een Raspberry Pi met een externe SSD is daar perfect voor.
Vereisten
- Een Raspberry Pi met Raspberry Pi OS (64-bit)
- Docker met de Compose-plugin geïnstalleerd op de Pi
- Een domeinnaam, toegevoegd aan een Cloudflare-account
- Basiskennis van Docker en Linux (nieuw met Docker? Lees mijn introductie tot Docker)
Ik bewaar alle data op een externe SSD die gemount is op /mnt/data en automatisch mount bij het opstarten. SD-kaarten slijten snel door database-writes, dus ik raad je aan hetzelfde te doen.
Nextcloud en PostgreSQL met Docker Compose
Nextcloud heeft een database nodig. Standaard is dat SQLite, maar dat wordt niet aangeraden voor echt gebruik, dus wij gebruiken PostgreSQL. In plaats van elke container met de hand te starten met lange docker run-commando's, beschrijven we ze allebei in één Compose-bestand.
Maak een map, bijvoorbeeld ~/nextcloud, en voeg een .env-bestand toe met een sterk wachtwoord (gebruik nooit iets als 123456):
POSTGRES_PASSWORD=vervang-door-een-lang-willekeurig-wachtwoordMaak ernaast een compose.yaml:
services:
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- /mnt/data/postgres:/var/lib/postgresql/data
nextcloud:
image: nextcloud:stable
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
volumes:
- /mnt/data/nextcloud:/var/www/htmlWat gebeurt hier:
dbdraait PostgreSQL 17 en maakt een database en gebruikernextcloudaan. De data staat in/mnt/data/postgresop de host, dus die blijft bewaard bij updates van de container.nextclouddraait het officiële Nextcloud-image. Poort80in de container wordt gepubliceerd op poort8080van de Pi, en alle Nextcloud-bestanden (app, config en je data) staan in/mnt/data/nextcloud.restart: unless-stoppedstart beide containers opnieuw na een herstart, endepends_onstart de database vóór Nextcloud.- Netwerk: Compose zet beide services automatisch op een gedeeld netwerk, zodat Nextcloud de database gewoon bereikt via de hostnaam
db. Een handmatigedocker network createis niet nodig.
Start alles:
docker compose up -dJe Nextcloud-account aanmaken
Open http://<ip-van-je-pi>:8080 in je browser. Je ziet de installatiepagina van Nextcloud:
- Kies een gebruikersnaam en een sterk wachtwoord voor je beheerdersaccount.
- Open Storage & database en kies PostgreSQL.
- Vul de databasegebruiker
nextcloudin, het wachtwoord uit je.env-bestand, de databasenaamnextclouden de hostdb:5432. - Klik op Install en laat Nextcloud zijn werk doen. Daarna kom je op het dashboard terecht.
De Cloudflare Tunnel instellen
Nextcloud werkt nu op je lokale netwerk. Om het van overal te bereiken gebruiken we een Cloudflare Tunnel. Een kleine connector (cloudflared) op je Pi opent een uitgaande verbinding naar Cloudflare, en Cloudflare stuurt het verkeer voor je domein daardoor. Niets op je netwerk ligt rechtstreeks open, en je krijgt gratis HTTPS.
Open in het Cloudflare-dashboard Zero Trust. Cloudflare herschikt dit menu af en toe, dus de namen kunnen een beetje verschillen van mijn screenshots.
Ga naar Networks > Tunnels en maak een nieuwe tunnel aan.
Kies het connectortype Cloudflared en geef je tunnel een naam. Kies op de volgende pagina Docker. Cloudflare toont een docker run-commando met je tunneltoken.
In plaats van dat commando met de hand uit te voeren, kopieer je het token (de lange waarde na --token) naar je .env-bestand:
TUNNEL_TOKEN=plak-hier-je-tunneltokenVoeg de connector daarna toe als derde service in compose.yaml:
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}Voer opnieuw docker compose up -d uit. Na een paar seconden staat de connector als verbonden in het Cloudflare-dashboard.
Vertel de tunnel nu waar het verkeer naartoe moet. Open de configuratie van de tunnel, ga naar het tabblad Public Hostname en voeg een hostnaam toe:
Kies een subdomein (bijvoorbeeld cloud) en je domein. Kies als service HTTP. Omdat cloudflared in hetzelfde Compose-project draait, bereikt het Nextcloud rechtstreeks op nextcloud:80. Draai je de connector ergens anders, gebruik dan het IP-adres van je Pi en poort 8080, zoals in mijn screenshot:
Sla de hostnaam op. Je Nextcloud staat nu op het internet, maar als je het nieuwe adres opent, krijg je een foutmelding: Nextcloud vertrouwt het domein nog niet.
Je domein vertrouwen in Nextcloud
Nextcloud antwoordt alleen op domeinen in zijn lijst trusted_domains. Omdat Cloudflare de HTTPS ervoor afhandelt, moet Nextcloud ook weten dat bezoekers https en je publieke hostnaam gebruiken. Stel alle drie in met het occ-commando van Nextcloud (vervang cloud.example.com door je hostnaam):
docker compose exec -u www-data nextcloud php occ config:system:set trusted_domains 1 --value=cloud.example.com
docker compose exec -u www-data nextcloud php occ config:system:set overwriteprotocol --value=https
docker compose exec -u www-data nextcloud php occ config:system:set overwritehost --value=cloud.example.comJe kunt het configuratiebestand ook met de hand aanpassen. Het staat in /mnt/data/nextcloud/config/config.php op de Pi:
'trusted_domains' =>
array (
0 => '192.168.1.10:8080',
1 => 'cloud.example.com',
),
'overwriteprotocol' => 'https',
'overwritehost' => 'cloud.example.com',De instelling overwriteprotocol lost ook een veelvoorkomend probleem op waarbij inloggen vanuit de desktop- of mobiele app blijft hangen, omdat Nextcloud anders http-links aanmaakt. Herstart met docker compose restart nextcloud als een wijziging niet meteen zichtbaar is.
Up-to-date blijven
Om te updaten haal je de nieuwe images op en maak je de containers opnieuw aan:
docker compose pull
docker compose up -dNextcloud ondersteunt alleen upgrades van één grote versie per keer. De tag stable volgt dat pad, maar sla geen maanden aan updates over. Maak ook regelmatig back-ups van /mnt/data: wie zelf host, is zijn eigen cloudprovider.
Conclusie
Je hebt nu je eigen Nextcloud op een Raspberry Pi, van overal bereikbaar via HTTPS dankzij een Cloudflare Tunnel, zonder ook maar één poort open te zetten. Installeer de desktop- en mobiele apps van Nextcloud, en begin met het synchroniseren van je bestanden, foto's en meer naar je eigen cloud.
Bronnen
Veelgestelde vragen
Waarom toont Nextcloud een fout over een niet-vertrouwd domein achter Cloudflare Tunnel?
Nextcloud antwoordt alleen op domeinen in zijn lijst trusted_domains. Voeg je publieke hostnaam toe met occ config:system:set trusted_domains, en stel overwriteprotocol in op https en overwritehost op je hostnaam.
Moet ik poorten openzetten op mijn router voor een Cloudflare Tunnel?
Nee. De cloudflared-connector opent een uitgaande verbinding naar Cloudflare, en het verkeer voor je hostnaam komt binnen via die verbinding.
- Raspberry Pi
- Docker
- Nextcloud
- Cloudflare
- Self-hosting