Nextcloud optimiert eingerichtet

Seit gut einem Jahr läuft meine Nextcloud ohne jegliche Probleme auf meinem Dell Precision 3540 unter macOS Ventura und Docker Desktop v4.47.0. Ventura kann mit maximal Docker Desktop v4.48.0 verwendet werden. Neuere Docker Desktop Versionen benötigen höhere macOS Versionen. Für mich passt das aber so. Ich verwende Nextcloud im Grunde nur für mich alleine im single user Betrieb.

 

Schon bei der 1st Einrichtung war es mir wichtig die Daten für Nexcloud außerhalb meiner macOS System Partition (/Volumes/Daten/docker/data/nextcloud/data) zu halten während die Docker Instanzen selbst unter meinem user account laufen. Damit Updates einfacher vor allem sicherer sind und ein zurück einfach möglich ist, lege vor jedem Major update ich immer eine Kopie an, die dann die komplette config und ganz wichtig eine Kopie der DB hat. Ganz klar, das die Docker Instanz vor dem Anlegen einer Kopie gestoppt sein muss. Vom Data Verzeichnis mache ich nie eine Kopie. Im Moment, wo diese Seite geschrieben wird, läuft Nextcloud bereits auf Rev. 33. Vor einem Jahr war ich bei Rev. 29.

Im Zuge vom Update auf Rev. 33 gab es diverse Optimierungen. Es kamen 2 Dienste hinzu: RDIS und CRON. Damit CRON innerhalb von NC funktioniert musste ich ein weiteres Volume „nextcloud_apps:/var/www/html/custom_apps“ in meiner YAML für den service nexcloud und cron definieren. Nur so ist es sauber konfiguriert.

services:
  nextcloud:
    image: nextcloud:33
    container_name: nextcloud_app
    restart: unless-stopped
    depends_on:
      - db
      - redis
    ports:
      - 8002:80
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: **********************

      REDIS_HOST: redis

      NEXTCLOUD_TRUSTED_DOMAINS: cloud.easyr.de 192.168.1.222
      TRUSTED_PROXIES: 192.168.1.222
      OVERWRITEHOST: cloud.easyr.de
      OVERWRITEPROTOCOL: https

    volumes:
      - /Volumes/Daten/docker/data/nextcloud/data:/var/www/html/data
      - ./config:/var/www/html/config
      - nextcloud_apps:/var/www/html/custom_apps

    networks:
      - web
      - default

  cron:
    image: nextcloud:33
    container_name: nextcloud_cron
    restart: unless-stopped
    entrypoint: /cron.sh
    depends_on:
      - nextcloud
    volumes:
      - /Volumes/Daten/docker/data/nextcloud/data:/var/www/html/data
      - ./config:/var/www/html/config
      - nextcloud_apps:/var/www/html/custom_apps
    networks:
      - default

  db:
    image: mariadb:11.4
    container_name: nextcloud_db
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: **********************
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: **********************
    networks:
      - default

  redis:
    image: redis:7-alpine
    container_name: nextcloud_redis
    restart: unless-stopped
    command: redis-server --save "" --appendonly no
    networks:
      - default

volumes:
  nextcloud_apps:

networks:
  web:
    external: true

 

Damit RDIS auch funktioniert muss die config.php angepasst werden, die bei mir so aussieht:

<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'apps_paths' => 
  array (
    0 => 
    array (
      'path' => '/var/www/html/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 => 
    array (
      'path' => '/var/www/html/custom_apps',
      'url' => '/custom_apps',
      'writable' => true,
    ),
  ),
  'upgrade.disable-web' => true,
  'instanceid' => '***********************',
  'passwordsalt' => '***********************',
  'secret' => '***********************',
  'trusted_domains' => 
  array (
    0 => 'cloud.easyr.de',
  ),
  'datadirectory' => '/var/www/html/data',
  'dbtype' => 'mysql',
  'version' => '33.0.0.16',
  'overwrite.cli.url' => 'https://cloud.easyr.de',
  'dbname' => 'nextcloud',
  'dbhost' => 'db',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => '***********************',
  'installed' => true,
  'overwritehost' => 'cloud.easyr.de',
  'overwriteprotocol' => 'https',
  'trusted_proxies' => 
  array (
    0 => '192.168.1.222',
  ),
  'twofactor_enforced' => 'false',
  'twofactor_enforced_groups' => 
  array (
    0 => 'admin',
  ),
  'twofactor_enforced_excluded_groups' => 
  array (
  ),
  'mail_smtpmode' => 'smtp',
  'mail_smtpsecure' => 'ssl',
  'mail_sendmailmode' => 'smtp',
  'mail_smtpauth' => 1,
  'mail_smtphost' => 'smtp.1blu.de',
  'mail_smtpport' => '465',
  'mail_from_address' => 'info',
  'mail_domain' => 'easyr.de',
  'mail_smtpname' => '***********************',
  'mail_smtppassword' => '***********************',
  'forbidden_filename_basenames' => 
  array (
    0 => 'con',
    1 => 'prn',
    2 => 'aux',
    3 => 'nul',
    4 => 'com0',
    5 => 'com1',
    6 => 'com2',
    7 => 'com3',
    8 => 'com4',
    9 => 'com5',
    10 => 'com6',
    11 => 'com7',
    12 => 'com8',
    13 => 'com9',
    14 => 'com¹',
    15 => 'com²',
    16 => 'com³',
    17 => 'lpt0',
    18 => 'lpt1',
    19 => 'lpt2',
    20 => 'lpt3',
    21 => 'lpt4',
    22 => 'lpt5',
    23 => 'lpt6',
    24 => 'lpt7',
    25 => 'lpt8',
    26 => 'lpt9',
    27 => 'lpt¹',
    28 => 'lpt²',
    29 => 'lpt³',
  ),
  'forbidden_filename_characters' => 
  array (
    0 => '<',
    1 => '>',
    2 => ':',
    3 => '"',
    4 => '|',
    5 => '?',
    6 => '*',
    7 => '\\',
    8 => '/',
  ),
  'forbidden_filename_extensions' => 
  array (
    0 => ' ',
    1 => '.',
    2 => '.filepart',
    3 => '.part',
  ),
  'loglevel' => 2,
  'maintenance' => false,
  'filelocking.enabled' => true,
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
  array (
    'host' => 'redis',
    'port' => 6379,
    'timeout' => 0.0,
    'password' => '',
  ),
  'enable_previews' => true,
  'preview_max_x' => 2048,
  'preview_max_y' => 2048,
  'preview_max_scale_factor' => 1,
  'preview_concurrency_new' => 4,
  'preview_concurrency_all' => 2,
  
  'log_type' => 'file',
  'logfile' => '/var/www/html/data/nextcloud.log',
  'loglevel' => 2,                // 2 = WARN, 0 = Debug, 1 = Info
  'log_rotate_size' => 104857600, // 100 MB in Bytes  
  
);

 

Der Preview Generator bringt bei Nextcloud einen der größten sichtbaren Performance-Gewinne überhaupt (Galerie, Thumbnails, Scrollen). Deshalb habe ich den auch installiert und aktiviert.

1. App installieren

docker compose exec nextcloud php occ app:install previewgenerator
docker compose exec nextcloud php occ app:enable previewgenerator

2. config.php erweitern (wichtig)

'enable_previews' => true,
'preview_max_x' => 2048,
'preview_max_y' => 2048,
'preview_max_scale_factor' => 1,
'preview_concurrency_new' => 4,
'preview_concurrency_all' => 2,

3. Erste Generierung starten

docker compose exec nextcloud php occ preview:generate-all

das kann je nach Datenmenge etwas dauern.

4. Automatisch über Cron laufen lassen

docker compose exec nextcloud php occ preview:pre-generate

5. Log-Rotation aktivieren

Füge in deine config/config.php (im gemounteten ./config-Ordner) folgende Einträge hinzu:

<?php
$CONFIG = array (
  // … deine bestehenden Einträge …

  'log_type' => 'file',
  'logfile' => '/var/www/html/data/nextcloud.log',
  'loglevel' => 2,                // 2 = WARN, 0 = Debug, 1 = Info
  'log_rotate_size' => 104857600, // 100 MB in Bytes
);

6. Docker-spezifische Lösung: „Minor Update manuell“

Ich mache Nexcloud updates nur manuell gesteuert und auf gar keinen Fall ein Major update ohne vorherige Sicherung. Dazu wird Docker Nextcloud vorher gestoppt und auf der shell folgende Kommandos im entsprechenden Verzeichnis ausgeführt. Da in meiner YAML „image: nextcloud:33“ definiert ist, erhalte ich auch nur minor updates passend zur Version 33.

docker compose pull nextcloud
docker compose up -d

Wenn’s am Ende so aussieht, ist man schon sehr gut aufgestellt und hat eine saubere Nextcloud Installation. Ein Wartungsfenster macht bei meiner Instanz natürlich gar keinen Sinn.

#