So hostest du deine eigene Cloud - mit Nextcloud

So hostest du deine eigene Cloud - mit Nextcloud

Übersicht

In diesem Beitrag zeige ich dir, wie du dir deine eigene Nextcloud-Instanz aufsetzt und damit deine ganz persönliche Cloud betreibst, unabhängig von Anbietern wie Google Drive oder iCloud.

Wir gehen dabei einmal den kompletten Weg durch:

  • von der passenden Hardware
  • über die Einrichtung des Systems
  • bis hin zur fertigen Nextcloud-Instanz

Das Setup basiert auf dem offiziellen Nextcloud All-in-One Container, den wir mit Docker betreiben und über einen Reverse Proxy erreichbar machen. Dadurch bleibt das Ganze flexibel und funktioniert auch in Setups ohne klassische Portfreigaben.

Am Ende hast du eine vollständig funktionierende Cloud, auf die du von überall zugreifen kannst und die komplett unter deiner eigenen Kontrolle steht.

Das Video zum Artikel findest du hier: https://youtu.be/rRzl-YY7QPo

Hardware

Für meine Nextcloud wollte ich ein Setup, das drei Dinge erfüllt:

  • kompakt & stromsparend
  • genug Leistung für mehrere Container
  • skalierbarer Speicher für meine Daten

Das ist eins von vielen Setups, das man super mit einem ZimaBoard 2 umsetzen kann. Daher nutze ich das ZimaBoard in Kombination mit dem passenden HDD-Bay und zwei HDDs, konfiguriert im Software-RAID, worauf dann später die Dateien kommen, die in Nextcloud abgelegt werden. Alles Weitere soll auf dem schnellen Speicher vom ZimaBoard selber laufen.

Das ZimaBoard wurde mir für dieses Projekt zur Verfügung gestellt. Wenn du dir selbst so ein Setup bauen willst, kannst du es dir hier anschauen: Mit dem Code jusec15 sparst du 15$.

RAID

Zuerst installieren wir ein einfaches Ubuntu Server OS, hier können wir direkt im Setup für die beiden HDDs ein Software-RAID konfigurieren, um eine gewisse Ausfallsicherheit zu haben.

Dafür gehen wir im Setup, wenn es um das Storage geht, auf den Punkt Custom storage Layout.

Damit landen wir im nächsten Fenster im Konfigurator für unsere Platten. Wir sehen den 60GB großen internen Speicher, den wir für unser root Verzeichnis haben wollen, und außerdem die beiden 1TB HDDs.

Unter den Platten gibt es den Punkt Create Software RAID (md), den wir auswählen.

Dort wählen wir jetzt unsere beiden HDDs aus und klicken Create.

Jetzt müssen wir das neue Software-RAID noch entsprechend formatieren. Ich formatiere es zu ext4 und mounte es dann unter /mnt/nextcloud-data.

Nun erstellen wir auf dem internen Speicher noch eine GPT-Partition.

Damit haben wir alle Partitionen, die wir brauchen.

Name & Benutzer

Weiter im Setup vergeben wir jetzt noch einen Namen für den Server und erstellen unseren Benutzer.

SSH Zugang

Außerdem installieren wir den OpenSSH Server, um gleich via SSH auf den Server zugreifen zu können.

Jetzt heißt es, einen kleinen Moment warten

Installation

Docker

Da wir Nextcloud mit Docker betreiben möchten, installieren wir als Erstes natürlich erstmal Docker selbst, falls noch nicht geschehen. Das können wir ganz einfach mit dem offiziellen Convenience Script von Docker machen.

 curl -fsSL https://get.docker.com -o get-docker.sh
 sudo sh get-docker.sh

Verzeichnis

Bevor wir fortfahren, müssen wir uns ein geeignetes Verzeichnis für die Nextcloud-AiO Compose überlegen. Ich habe meine Docker-Compose Stacks immer gerne unter /opt, darunter erstelle ich einen neuen Ordner für Nextcloud mit:

sudo mkdir /opt/nextcloud
cd /opt/nextcloud

Docker Compose

Bei Nextcloud ist der Aufbau etwas anders als gewohnt. Es gibt einen sogenannten All-In-One Container, dem wir mit einer Konfiguration sagen, wie er die komplette Nextcloud-Instanz, bestehend aus vielen verschiedenen Containern für die verschiedenen Anwendungen, Datenbanken etc., aufbauen soll.

Im Standard ist diese All-in-One Docker-Compose so aufgebaut, dass sich der Container auch um Zertifikate und Co. kümmert, um später auf Nextcloud zugreifen zu können. In diesem Setup möchte ich aber gerne meinen eigenen Reverse-Proxy verwenden. Das gibt uns die Möglichkeit, bspw. Nextcloud zuhause zu verwenden ohne Portforwarding auf 80 + 443, hinter einem CG-NAT oder auch wenn wir ggf. einen Reverse-Proxy für unsere IP haben und dort mehr als nur Nextcloud erreichbar machen wollen.

In diesem Setup baue ich einen Reverse-Proxy mittels separatem Caddy-Container auf demselben Host, dieser erhält Zertifikate via DNS-Challenge, da der Host nicht von außen erreichbar ist. Das Ganze kann aber auch bspw. mit einem woanders laufenden Reverse-Proxy auf ähnlichem Wege umgesetzt werden.

Wie Caddy mit DNS-Challenge eingerichtet wird, findet ihr in diesem Beitrag.

Die compose.yml für den AiO Container, gekürzt auf das benötigte, sieht dann so aus.

name: nextcloud-aio # Add the container to the same compose project like all the sibling containers are added to automatically.
services:
  nextcloud-aio-mastercontainer:
    image: ghcr.io/nextcloud-releases/all-in-one:latest # This is the container image used. You can switch to ghcr.io/nextcloud-releases/all-in-one:beta if you want to help testing new releases. See https://github.com/nextcloud/all-in-one#how-to-switch-the-channel
    init: true # This setting makes sure that signals from main process inside the container are correctly forwarded to children. See https://docs.docker.com/reference/compose-file/services/#init
    restart: always # This makes sure that the container starts always together with the host OS. See https://docs.docker.com/reference/compose-file/services/#restart
    container_name: nextcloud-aio-mastercontainer # This line is not allowed to be changed as otherwise AIO will not work correctly
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config # This line is not allowed to be changed as otherwise the built-in backup solution will not work
      - /var/run/docker.sock:/var/run/docker.sock:ro # May be changed on macOS, Windows or docker rootless. See the applicable documentation. If adjusting, don't forget to also set 'WATCHTOWER_DOCKER_SOCKET_PATH'!
    networks:
      - caddy_net
    #ports:
      #- "80:80" # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
      #- "8080:8080" # This is the AIO interface, served via https and self-signed certificate. See https://github.com/nextcloud/all-in-one#explanation-of-used-ports
      #- "8443:8443" # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
    # security_opt: ["label:disable"] # Is needed when using SELinux. See https://github.com/nextcloud/all-in-one#are-there-known-problems-when-selinux-is-enabled
    environment: # Is needed when using any of the options below
      AIO_DISABLE_BACKUP_SECTION: true # Setting this to true allows to hide the backup section in the AIO interface. See https://github.com/nextcloud/all-in-one#how-to-disable-the-backup-section
      APACHE_PORT: 11000 # Is needed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
      # APACHE_IP_BINDING: 127.0.0.1 # Should be set when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) that is running on the same host. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
      APACHE_ADDITIONAL_NETWORK: caddy_net # (Optional) Connect the apache container to an additional docker network. Needed when behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) running in a different docker network on same server. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
      # BORG_RETENTION_POLICY: --keep-within=7d --keep-weekly=4 --keep-monthly=6 # Allows to adjust borgs retention policy. See https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy
      # COLLABORA_SECCOMP_DISABLED: false # Setting this to true allows to disable Collabora's Seccomp feature. See https://github.com/nextcloud/all-in-one#how-to-disable-collaboras-seccomp-feature
      # DOCKER_API_VERSION: 1.44 # You can adjust the internally used docker api version with this variable. ⚠️⚠️⚠️ Warning: please note that only the default api version (unset this variable) is supported and tested by the maintainers of Nextcloud AIO. So use this on your own risk and things might break without warning. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-internally-used-docker-api-version
      # FULLTEXTSEARCH_JAVA_OPTIONS: "-Xms1024M -Xmx1024M" # Allows to adjust the fulltextsearch java options. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-fulltextsearch-java-options
      NEXTCLOUD_DATADIR: /mnt/nextcloud-data # Allows to set the host directory for Nextcloud's datadir. ⚠️⚠️⚠️ Warning: do not set or adjust this value after the initial Nextcloud installation is done! See https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir
      # NEXTCLOUD_MOUNT: /mnt/ # Allows the Nextcloud container to access the chosen directory on the host. See https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host
      # NEXTCLOUD_UPLOAD_LIMIT: 16G # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud
      # NEXTCLOUD_MAX_TIME: 3600 # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud
      # NEXTCLOUD_MEMORY_LIMIT: 512M # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud
      # NEXTCLOUD_TRUSTED_CACERTS_DIR: /path/to/my/cacerts # CA certificates in this directory will be trusted by the OS of the nextcloud container (Useful e.g. for LDAPS) See https://github.com/nextcloud/all-in-one#how-to-trust-user-defined-certification-authorities-ca
      # NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # Allows to modify the Nextcloud apps that are installed on starting AIO the first time. See https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup
      # NEXTCLOUD_ADDITIONAL_APKS: imagemagick # This allows to add additional packages to the Nextcloud container permanently. Default is imagemagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-os-packages-permanently-to-the-nextcloud-container
      # NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS: imagick # This allows to add additional php extensions to the Nextcloud container permanently. Default is imagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-php-extensions-permanently-to-the-nextcloud-container
      # NEXTCLOUD_ENABLE_DRI_DEVICE: true # This allows to enable the /dev/dri device for containers that profit from it. ⚠️⚠️⚠️ Warning: this only works if the '/dev/dri' device is present on the host! If it should not exist on your host, don't set this to true as otherwise the Nextcloud container will fail to start! See https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud
      # NEXTCLOUD_ENABLE_NVIDIA_GPU: true # This allows to enable the NVIDIA runtime and GPU access for containers that profit from it. ⚠️⚠️⚠️ Warning: this only works if an NVIDIA gpu is installed on the server. See https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud.
      # NEXTCLOUD_KEEP_DISABLED_APPS: false # Setting this to true will keep Nextcloud apps that are disabled in the AIO interface and not uninstall them if they should be installed. See https://github.com/nextcloud/all-in-one#how-to-keep-disabled-apps
      # SKIP_DOMAIN_VALIDATION: false # This should only be set to true if things are correctly configured. See https://github.com/nextcloud/all-in-one#how-to-skip-the-domain-validation
      # TALK_PORT: 3478 # This allows to adjust the port that the talk container is using which is exposed on the host. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-talk-port
      # WATCHTOWER_DOCKER_SOCKET_PATH: /var/run/docker.sock # Needs to be specified if the docker socket on the host is not located in the default '/var/run/docker.sock'. Otherwise mastercontainer updates will fail. For macos it needs to be '/var/run/docker.sock'

volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive
  nextcloud_aio_mastercontainer:
    name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work

# # Adjust the MTU size of the docker network. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-mtu-size-of-the-docker-network
networks:
   caddy_net:
     external: true

Caddyfile

Das zugehörige Caddyfile beinhaltet die Konfiguration für die DNS-Challenge & 2 Einträge. Einmal das All-in-One Webinterface, wo wir Nextcloud mit installieren und später die Container mit verwalten. Hier gibt es ein paar Zusatzparameter, damit wir darauf zugreifen können und die Verlinkung über die Nextcloud-Settings korrekt ist.

Dann haben wir den zweiten Eintrag für Nextcloud selbst.

{
    acme_dns cloudflare <api-key>
}

aio.juseclab.de {
    reverse_proxy https://nextcloud-aio-mastercontainer:8080 {
        header_up Host {host}
        transport http {
                tls_insecure_skip_verify
        }
    }
}

nextcloud.juseclab.de {
    reverse_proxy http://nextcloud-aio-apache:11000
}

Start

Es ist soweit, nun ist alles vorbereitet und wir können den All-in-One-Container starten. Nach einem kurzen Augenblick erreichen wir diesen dann unter der, in meinem Fall, aio.juseclab.de Domain.

cd /opt/nextcloud
sudo docker compose up -d

Setup Nextcloud

Auf der Domain angekommen, bekommen wir eine Passphrase genannt, die wir uns gut dokumentieren sollten. Mit der können wir auf das Setup zugreifen.

Mit Klick auf Open Nextcloud AIO Login müssen wir die Passphrase auch direkt das erste Mal eingeben.

Jetzt landen wir im eigentlichen Setup für Nextcloud. Zuerst geben wir jetzt hier die Domain an, wo wir Nextcloud später erreichen wollen (identisch wie auch im Caddyfile). Außerdem haben wir die Möglichkeit, ein Backup einer alten Nextcloud-Instanz einzuspielen.

Mit Klick auf Submit Domain kommen wir zum eigentlichen Setup. Hier können wir jetzt alles nach unseren Bedürfnissen angeben und anschließend auf Download and start Container klicken. Der AIO Container kümmert sich dann um den Rest und gibt uns Bescheid, wenn alles fertig ist.

Ganz unten versteckt finden wir auch noch Community Containers. Hier gibt es nochmal eine weitere große Auswahl an Containern, die der AIO für uns mit deployen kann, welche von der Community entwickelt wurden.

Mit Klick auf Download and start Containers starten wir nun aber die "Installation" an.

Nachdem alle Images gezogen wurden, bekommen wir eine neue Seite, wo wir sehen, dass die Container aktuell alle gestartet werden.

Das dauert jetzt einen Moment. Sobald alles gestartet ist, erhalten wir unser initiales Passwort und einen Button, um zu unserer neuen Nextcloud-Instanz zu gelangen.

Mit Klick auf Open your Nextcloud landen wir auf der Domain, die wir festgelegt haben, und können uns jetzt hier mit admin und dem Passwort einloggen.

Administration

Nachdem wir in Nextcloud angekommen sind, haben wir rechts bei unserem Profilbild ein Menü. Dort gibt es den Punkt Administrationseinstellungen. Dort können wir unsere Nextcloud-Instanz entsprechend administrieren und konfigurieren.

In dem Übersichts-Tab gibt es einen Button, der uns auch jederzeit wieder zum All-in-One-Fenster bringt, wo wir alle Container stoppen können.

Benutzer anlegen

Admin Passwort ändern

Als Erstes solltet ihr natürlich das Default-Passwort vom Administrator ändern. Das könnt ihr, wenn ihr rechts bei eurem Symbol auf Konten geht.

Dort angekommen gibt es aktuell nur den Administrator. Entweder passt ihr das Passwort von dem Account an oder tauscht den Account komplett gegen einen neuen Admin.

Ändern könnt ihr das Passwort, wenn ihr auf den Stift rechts beim Admin-Konto geht.

Weitere Benutzer anlegen

Ansonsten könnt ihr hier weitere Benutzer nach Belieben anlegen.


Weitere Apps

Sollten mehr Funktionen benötigt werden, gibt es einen großen "Appstore" unter dem Punkt Apps in dem Menü rechts. Dort habt ihr die Möglichkeit, aus einer Vielzahl von zusätzlichen Apps zu installieren, was ihr benötigt.


Nextcloud Clients

Um bspw. unsere Dateien komfortabel verwalten zu können, gibt es für so gut wie alle Betriebssysteme einen entsprechenden Client. Mit dem haben wir die Möglichkeit, Dateien kinderleicht synchron zu halten und Zugriff zu haben. Außerdem gibt es auch einen extra Client für Nextcloud Talk, worüber man dann direkt chatten und Video-Calls abhalten kann.

Eine Übersicht finden wir in unseren persönlichen Einstellungen unter Mobil & Desktop.

Nextcloud Files

Nextcloud Files ist für das Synchronisieren und Zugreifen von Files da. Heruntergeladen und installiert können wir uns damit an unserer Nextcloud-Instanz anmelden.

Anschließend können wir hier festlegen, ob wir alle Dateien immer auf unserem Gerät verfügbar haben oder mit virtuellen Dateien arbeiten wollen. Außerdem können wir den Ordner, wo Nextcloud alles ablegt, festlegen.

Hinzugefügt haben wir in unserem Windows-Explorer dann Nextcloud mit Zugriff auf unsere Dateien.

Nextcloud Talk

Der Nextcloud Talk Client dient zur Kommunikation mit anderen Personen auf der Nextcloud-Instanz. Wir können hier chatten und Video-Anrufe abhalten.

Auch hier melden wir uns nach der Installation an unserem Server an.

Anschließend haben wir Zugriff auf alle Talk-Funktionen.

Fazit

Mit Nextcloud bekommst du eine extrem vielseitige Lösung, um deine eigenen Daten zentral zu verwalten und von überall darauf zuzugreifen.

Durch das gezeigte Setup mit Docker und dem All-in-One-Container ist die Installation vergleichsweise einfach gehalten, während du trotzdem eine sehr flexible und erweiterbare Umgebung bekommst.

Gerade in Kombination mit einem kleinen, dedizierten System wie dem ZimaBoard eignet sich das perfekt als eigene Cloud für Zuhause oder dein Homelab.

Am Ende hast du damit eine echte Alternative zu klassischen Cloud-Anbietern, nur eben selbst gehostet, datenschutzfreundlich und komplett in deiner eigenen Hand.