Wenn du Nextcloud auf Ku­ber­netes ein­rich­ten möchtest, sind S3 als Speicher-Backend sowie MariaDB als Datenbank emp­feh­lens­wert. Die Per­for­mance steigerst du mit gezielten An­pas­sun­gen in der Kon­fi­gu­ra­ti­on.

Nextcloud und Ku­ber­netes: Ein starkes Duo

Die Kom­bi­na­ti­on von Nextcloud und Ku­ber­netes mit S3 als Speicher-Backend ist oft die ideale Lösung für private und ge­schäft­li­che Zwecke. Die Open-Source-Cloud-Software eignet sich für lokale Server ebenso wie für externe Hosts und punktet im Vergleich zu vielen Nextcloud-Al­ter­na­ti­ven durch eine erst­klas­si­ge Si­cher­heits­ar­chi­tek­tur. Ku­ber­netes als Ver­wal­tungs­sys­tem für Container-An­wen­dun­gen ist extrem flexibel, ska­lier­bar und aus­fall­si­cher. Wir zeigen dir, wie du Nextcloud auf Ku­ber­netes ein­rich­test.

Welche Vor­aus­set­zun­gen gibt es?

Bevor du startest, müssen die Rah­men­be­din­gun­gen passen. Du benötigst aus­rei­chend Spei­cher­platz und solltest bereits einen Ku­ber­netes Cluster erstellt haben – ob lokal oder in der Cloud, hängt von deinem Bedarf ab. Zudem sollte der Pa­ket­ma­na­ger Helm für Ku­ber­netes bereits ein­ge­rich­tet sein. Sobald das erledigt ist, kann es losgehen.

Nextcloud auf Ku­ber­netes ein­rich­ten: So gehst du vor

Mit der passenden Basis startest du nun die Ein­rich­tung. Wir haben die we­sent­li­chen Schritte in den folgenden Ab­schnit­ten für dich zu­sam­men­ge­fasst.

DNS kon­fi­gu­rie­ren

Zuerst legst du einen A-Record für eine Subdomain an, die auf deine ge­wünsch­te IP-Adresse zeigt. Bei einer lokalen Lösung ist das deine öf­fent­li­che IP, ansonsten nutzt du die IP deines Cloud-Anbieters. Je nach DNS-Provider variiert der Vorgang minimal.

Helm hin­zu­fü­gen und ak­tua­li­sie­ren

Die Be­reit­stel­lung erfolgt über den Pa­ket­ma­na­ger Helm. Dieser muss auf deinem Client in­stal­liert sein und eine Ver­bin­dung zum Cluster bestehen. Füge dann das Helm-Re­po­si­to­ry hinzu und ak­tua­li­sie­re es mit diesen Befehlen:

helm repo add nextcloud https://nextcloud.github.io/helm/
helm repo update
shell

values.yaml erstellen

Erstelle ein neues Helmchart mit folgendem Befehl:

nano values.yaml
shell

Füge an­schlie­ßend die not­wen­di­gen Spe­zi­fi­ka­tio­nen in die Datei ein.

Cronjobs kon­fi­gu­rie­ren

Definiere ein Zeitlimit für Cronjobs. Diese au­to­ma­ti­sier­ten Aufgaben erledigen im Hin­ter­grund War­tungs­ar­bei­ten. In unserem Beispiel triggern wir die Aus­füh­rung alle 5 Minuten. Bei großen Da­ten­men­gen kann ein kürzeres Intervall sinnvoll sein. Hier der passende Code:

cronjob:
    annotations: {}
    curlInsecure: false
    enabled: true
    failedJobsHistoryLimit: 5
    image: {}
    schedule: '*/5*     *** '
    successfulJobsHistoryLimit: 2
shell

HPA de­ak­ti­vie­ren

De­ak­ti­vie­re den Ho­ri­zon­tal Pod Au­t­o­s­ca­ler (HPA). Wenn du Re­ad­Wri­te­On­ce nutzt und die Ska­lie­rung selbst steuern möchtest, ist ein einzelner Pod oft die stabilere Wahl – besonders bei über­schau­ba­ren Zu­griffs­zah­len. Der Code dazu:

hpa:
    cputhreshold: 60
    enabled: false
    maxPods: 10
    minPods: 1
shell

Image-Tag über­schrei­ben

Um die aktuelle Version si­cher­zu­stel­len, über­schreibst du den Image-Tag mit folgendem Code:

image:
    repositor: nextcloud
    tag: 28.0.2-apache
    pullPolicy: IfNotPresent
shell

Damit wird Version 28.0.2 oder neuer verwendet.

Datenbank festlegen

Du hast die Wahl zwischen MariaDB, Post­greS­QL oder Sqlite. Wir setzen in diesem Beispiel auf MariaDB. Kon­fi­gu­rie­re das System wie folgt und de­ak­ti­vie­re die Al­ter­na­ti­ven.

internalDatabase:
    enabled: false
mariadb:
    db:
        name: nextcloud
        password: db-password
        user: nextcloud
    enabled: true
    master:
        persistence:
            accessMode: ReadWriteOnce
            enabled: true
            size: 8Gi
    replication:
        enabled: false
    rootUser:
        password: root-db-password
        forcePassword: true
postgresql:
    enabled: false
shell

Mo­ni­to­ring für Metrics

Für ein Mo­ni­to­ring via Pro­me­theus oder Grafana fügst du diesen op­tio­na­len Code hinzu:

metrics:
    enabled: true
    https: false
    image:
        pullPolicy: IfNotPresent
        repository: xperimental/nextcloud-exporter
        tag: v0.3.0
    replicaCount: 1
    service:
        annotations:
            prometheus.io/port: '9205'
            prometheus.io/scrape: 'true'
        labels: {}
        type: ClusterIP
    timeout: 5s
shell

Eigene Kon­fi­gu­ra­ti­ons­da­tei­en nutzen

Nextcloud nutzt stan­dard­mä­ßig die config.php. Um flexibler zu sein, kannst du eigene Kon­fi­gu­ra­ti­ons­da­tei­en einbinden. Nutze dafür diesen Code:

nextcloud:
    configs:
        custom.config.php: |-
            <?php
            $CONFIG = array (
                'overwriteprotocol' => 'https',
                'overwrite.cli.url' => 'https://drive.beispiel.com',
                'filelocking.enabled' => 'true',
                'loglevel' => '2',
                'enable_previews' => true,
                'trusted_domains' =>
                     [
                        'nextcloud',
                        'drive.beispiel.com'
                     ]
            );
shell

Ersetze dabei „beispiel.com“ durch deine eigene Domain.

Redis kon­fi­gu­rie­ren

Mit Redis ver­bes­serst du das Caching und die Ge­samt­per­for­mance. Da Helm Redis stan­dard­mä­ßig ohne Passwort in­stal­liert, empfehlen wir eine zu­sätz­li­che Ab­si­che­rung, um Login-Probleme zu vermeiden:

redis.config.php: |-
    <?php
    $CONFIG = array (
      'memcache.local' => '\\OC\\Memcache\\Redis',
      'memcache.distributed' => '\OC\Memcache\Redis',
      'memcache.locking' => '\OC\Memcache\Redis',
      'redis' => array(
        'host' => getenv('REDIS_HOST'),
        'port' => getenv('REDIS_HOST_PORT') ?: 6379,
        'password' => getenv('ihr-passwort-für-redis')
      )
    );
shell

Speicher-Backend ein­rich­ten

Die Kon­fi­gu­ra­ti­on für das S3-Speicher-Backend wird wie folgt im Code hin­ter­legt:

s3.config.php: |-
    <?php
    $CONFIG = array (
      'objectstore' => array(
        'class' => '\\OC\\Files\\ObjectStore\\S3',
        'arguments' => array(
        'bucket'     => 'bucket-name',
        'autocreate' => true,
        'key'      => 's3-access-key',
        'secret'     => 's3-secret-key',
        'region'     => 's3-region',
        'hostname'   => 's3-endpoint',
        'use_ssl'    => true,
        'use_path_style' => true
        )
      )
    );
shell

Standard-Redis-Kon­fi­gu­ra­ti­on de­ak­ti­vie­ren

Da du oben eine eigene Redis-Kon­fi­gu­ra­ti­on erstellt hast, muss die Stan­dard­ein­stel­lung de­ak­ti­viert werden, um Konflikte zu vermeiden:

defaultConfigs:
    .htaccess: true
    apache-pretty-urls.config.php: true
    apcu.config.php: true
    apps.config.php: true
    autoconfig.php: false
    redis.config.php: false
    smtp.config.php: true
shell

Host, Admin und Passwort de­fi­nie­ren

Hin­ter­le­ge nun den Host, den Admin-User und das Passwort für deine Nextcloud-Instanz:

host: drive.beispiel.com
password: ihr-passwort
username: name-des-admins
shell

Tausche die Platz­hal­ter gegen deine in­di­vi­du­el­len Daten aus.

E-Mail-Be­nach­rich­ti­gun­gen ak­ti­vie­ren

Optional kannst du einen SMTP-Dienst für Be­nach­rich­ti­gun­gen ein­rich­ten:

mail:
    domain: beispiel.com
    enabled: false
    fromAddress: user
    smtp:
      authtype: LOGIN
      host: beispiel.com
      name: username
      password: ihr-passwort
      port: 465
      secure: ssl
shell

Per­sis­tence-Laufwerk ein­stel­len

Diese Ein­stel­lung betrifft Daten, die Nextcloud direkt auf dem Da­ten­trä­ger speichert (keine Nut­zer­da­ten, diese liegen im S3):

persistence:
    accessMode: ReadWriteOnce
    annotations: {}
    enabled: true
    size: 8Gi
shell

Pass­wort­schutz für Redis

Sichere Redis mit einem Passwort ab, um Au­then­ti­fi­zie­rungs­feh­ler zu vermeiden. Ersetze das Passwort im Code durch dein eigenes:

redis:
    enabled: true
    password: 'ihr-passwort-für-redis'
    usePassword: true
shell

Re­pli­ka­tio­nen li­mi­tie­ren

Da HPA de­ak­ti­viert ist, be­schränkst du die Anzahl der Re­pli­ka­tio­nen auf 1:

replicaCount: 1
shell

Nextcloud auf Ku­ber­netes in­stal­lie­ren

Zum Abschluss in­stal­lierst du Nextcloud inklusive MariaDB und Redis mit diesem Befehl:

kubectl create ns nextcloud
helm upgrade --install --namespace nextcloud -f your-values.yaml nextcloud nextcloud/nextcloud
shell
Zum Hauptmenü