Hvorfor Nextcloud?

Google Drive er bekvemt. Det er billigt. Det virker overalt. Men du betaler med noget andet end penge: Google scanner dine filer, dine billeder og din kalender. Det bruger de til at vise dig reklamer og til at forstå dine vaner.

iCloud er bedre på privatlivsfronten, men du betaler 35 kr. om måneden for 200 GB. Og du er stadig afhængig af Apples infrastruktur.

Nextcloud koster ingenting at køre, når du har hardwaren. Dine billeder er dine. Ikke Googles. Familiens feriefotos fra 2019 sidder ikke på en server i Oregon.

Det virker også offline. Er du hjemme på dit LAN, kan du tilgå alle dine filer, selv om internettet er nede.

Hvad du skal bruge

⚠️ Brug ikke SD-kortet til data. Raspberry Pi OS kan sagtens ligge på et SD-kort, men Nextcloud-data og databasen skal ligge på en SSD. SD-kort er ikke beregnet til at håndtere konstante databaseskrivninger.

Forbered SSD

Find ud af hvad din SSD hedder på systemet:

lsblk

Den vil typisk hedde sda eller sdb. Opret et filsystem på den (kun nødvendigt første gang):

sudo mkfs.ext4 /dev/sda1

Opret en mappe og mount SSD'en:

sudo mkdir -p /data
sudo mount /dev/sda1 /data

For at den monteres automatisk ved genstart, tilføj en linje til /etc/fstab:

# Find UUID på SSD
sudo blkid /dev/sda1

# Tilføj til /etc/fstab (udskift UUID med din)
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /data  ext4  defaults  0  2

Opret mapperne Nextcloud skal bruge og sæt rettigheder:

sudo mkdir -p /data/nextcloud
sudo chown -R 33:33 /data/nextcloud
📝 Brugeren 33: Nextcloud-containeren kører som bruger www-data, der har UID 33. Derfor sætter vi ejerskabet til 33:33.

Docker Compose opsætning

Opret en mappe til din Nextcloud-installation:

mkdir -p ~/nextcloud
cd ~/nextcloud

Opret filen docker-compose.yml:

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: skift-dette-til-et-stærkt-password
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: skift-dette-til-et-andet-stærkt-password

  nextcloud:
    image: nextcloud:latest
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - /data/nextcloud:/var/www/html/data
      - nextcloud_html:/var/www/html
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: skift-dette-til-et-andet-stærkt-password
      NEXTCLOUD_ADMIN_USER: admin
      NEXTCLOUD_ADMIN_PASSWORD: skift-dette-til-admin-password
      NEXTCLOUD_TRUSTED_DOMAINS: "192.168.1.100 nextcloud.ditdomæne.dk"
    depends_on:
      - db

volumes:
  db_data:
  nextcloud_html:
⚠️ Brug MariaDB, ikke SQLite. Nextcloud tilbyder SQLite som en let løsning, men den er ikke egnet til familiens daglige brug. MariaDB er langt hurtigere og mere stabil, og det er hvad denne guide bruger.
💡 Udskift IP-adressen. I NEXTCLOUD_TRUSTED_DOMAINS skal du bruge din Pi's faktiske IP-adresse. Find den med hostname -I.

Start Nextcloud

Start hele stacken:

docker compose up -d

Første gang tager det lidt tid. Docker henter images og Nextcloud sætter databasen op. Følg med i hvad der sker:

docker compose logs -f nextcloud

Når du ser linjer om at Nextcloud er klar, åbn en browser og gå til:

http://[din-pi-ip]:8080

Du burde se Nextcloud velkomstskærmen.

📝 Første opstart tager tid. Det kan tage 2-5 minutter første gang, fordi Nextcloud kører en masse databaseopsætning. Vær tålmodig og hold øje med loggen.

Første opsætning

Log ind med admin-brugeren du satte i docker-compose.yml. Nextcloud spørger om du vil installere anbefalede apps. Sig ja. Det inkluderer typisk:

Du kan altid installere flere apps senere under Indstillinger → Apps.

Tilføj familiemedlemmer

Gå til øverste højre hjørne, klik på dit avatar, og vælg Brugere. Opret en konto til hvert familiemedlem.

Sæt en kvote på hver bruger. Det forhindrer, at ét familiemedlem utilsigtet fylder hele SSD'en med video. 50-100 GB pr. person er et fornuftigt udgangspunkt.

For at dele en mappe: højreklik på mappen i filbrowseren, vælg Del, og skriv brugernavnet. Du kan give læseadgang eller fuld skriveadgang.

💡 Fælles fotoalbum: Opret en delt mappe kaldet "Familie" og giv alle brugere adgang. Nu kan alle uploade billeder til det samme album fra deres telefon.

Sikr din Pi inden du fortsætter

Inden du eksponerer Nextcloud ud mod internettet, er det værd at sikre selve Pi'en. To ting er særligt vigtige:

Tilgå udefra med Cloudflare Tunnel

Som standard kan Nextcloud kun tilgås fra dit LAN. Hvis familien vil bruge det fra telefonen ude i byen, skal du eksponere det.

Den sikre måde er via Cloudflare Tunnel. Du åbner ingen porte i din router. Cloudflare håndterer HTTPS. Se vores guide til Cloudflare Tunnel på Raspberry Pi for den fulde opsætning.

Foretrækker du VPN frem for en Cloudflare-afhængighed, er WireGuard et godt alternativ. Se vores WireGuard guide.

Når du har opsat tunnelen, skal du tilføje dit domæne til Nextclouds betroede domæner. Rediger config/config.php inde i containeren:

docker exec -it nextcloud-nextcloud-1 bash
nano /var/www/html/config/config.php

Find trusted_domains og tilføj dit domæne:

'trusted_domains' =>
  array (
    0 => '192.168.1.100:8080',
    1 => 'nextcloud.ditdomæne.dk',
  ),
⚠️ Brug kun Cloudflare Tunnel til ekstern adgang. Åbn ikke port 8080 direkte i din router. Uden HTTPS og uden en WAF foran er det ikke sikkert at eksponere Nextcloud direkte mod internettet.

Mobilapp

Nextcloud-appen findes til både iOS og Android og er gratis.

Backup

En Pi kan gå ned. En SSD kan fejle. Backup er ikke valgfrit.

Den simple tilgang: stop Nextcloud, kopier data, start igen.

# Stop containerne
cd ~/nextcloud
docker compose stop

# Lav database-dump
docker exec nextcloud-db-1 sh -c \
  'mysqldump --all-databases -u root -p"dit-root-password"' \
  > backup-db-$(date +%Y%m%d).sql

# Kopier Nextcloud-data til ekstern disk (tilpas stien)
rsync -av /data/nextcloud/ /mnt/backup/nextcloud-data/

# Start containerne igen
docker compose start

Automatiser det med cron. Kør crontab -e og tilføj:

# Kør backup hver søndag kl. 02:00
0 2 * * 0 cd ~/nextcloud && docker compose stop && rsync -aq /data/nextcloud/ /mnt/backup/nextcloud/ && docker compose start
💡 3-2-1 backup: Nextcloud er lokal storage. Brand, tyveri eller en SSD-fejl kan fjerne alt. Kopiér backuppen til mindst ét eksternt sted, f.eks. en ekstern harddisk hos en familiemedlem eller en krypteret cloud-backup.

Performance tips

Nextcloud på en Pi 4 er fuldt brugbart for en familie, men der er et par ting der gør det markant hurtigere.

Redis til hukommelsescache

Tilføj Redis til din docker-compose.yml:

  redis:
    image: redis:alpine
    restart: unless-stopped

Tilføj derefter disse environment-variabler til nextcloud-servicen:

      REDIS_HOST: redis

Og tilføj redis til depends_on i nextcloud-servicen. Redis gemmer Nextclouds session-data og lock-information i hukommelsen, så databasen aflastes. Det mærkes tydeligt på svartiderne.

PHP OPcache

Tilføj disse environment-variabler til nextcloud-servicen:

      PHP_MEMORY_LIMIT: 512M
      PHP_UPLOAD_LIMIT: 512M

Cron-job til baggrundstasks

Nextcloud har baggrundstasks der skal køre regelmæssigt (indeksering, thumbnails m.m.). Tilføj et cron-job på Pi'en:

# Kør Nextcloud cron hvert 5. minut
*/5 * * * * docker exec -u www-data nextcloud-nextcloud-1 php -f /var/www/html/cron.php

Skift til Cron (ikke AJAX) i Nextcloud under Indstillinger → Grundlæggende opsætning.

Hvad Nextcloud ikke er

Nextcloud er ikke en cloud-backup. Det er lokal storage med en web-grænseflade. Brænder huset eller stjæles Pi'en, er dataene væk, medmindre du har en ekstern backup.

En Raspberry Pi 4 er ikke bygget til at håndtere 100 samtidige brugere. Til en familie på 4-6 personer virker det fint. Vil du køre det for en hel afdelings worth of kolleger, skal du have kraftigere hardware.

Det er heller ikke Google Fotos. Nextcloud Fotos er god, men den genkender ikke ansigter eller steder automatisk på samme måde som Googles AI. Det er prisen for privatlivet.

Kilder