Alle berichten

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):

Shell
POSTGRES_PASSWORD=vervang-door-een-lang-willekeurig-wachtwoord

Maak ernaast een compose.yaml:

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/html

Wat gebeurt hier:

  • db draait PostgreSQL 17 en maakt een database en gebruiker nextcloud aan. De data staat in /mnt/data/postgres op de host, dus die blijft bewaard bij updates van de container.
  • nextcloud draait het officiële Nextcloud-image. Poort 80 in de container wordt gepubliceerd op poort 8080 van de Pi, en alle Nextcloud-bestanden (app, config en je data) staan in /mnt/data/nextcloud.
  • restart: unless-stopped start beide containers opnieuw na een herstart, en depends_on start 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 handmatige docker network create is niet nodig.

Start alles:

Shell
docker compose up -d

Je Nextcloud-account aanmaken

Open http://<ip-van-je-pi>:8080 in je browser. Je ziet de installatiepagina van Nextcloud:

  1. Kies een gebruikersnaam en een sterk wachtwoord voor je beheerdersaccount.
  2. Open Storage & database en kies PostgreSQL.
  3. Vul de databasegebruiker nextcloud in, het wachtwoord uit je .env-bestand, de databasenaam nextcloud en de host db:5432.
  4. 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:

Shell
TUNNEL_TOKEN=plak-hier-je-tunneltoken

Voeg de connector daarna toe als derde service in compose.yaml:

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):

Shell
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.com

Je kunt het configuratiebestand ook met de hand aanpassen. Het staat in /mnt/data/nextcloud/config/config.php op de Pi:

PHP
'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:

Shell
docker compose pull
docker compose up -d

Nextcloud 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

Knijp, scroll of tik twee keer om te zoomen. Sleep om te verplaatsen.