sdw

@sdw@lemmy.ca
0 Post – 7 Comments
Joined 1 years ago

Where do y'all get your programming drama? I'm missing out

Just want to say that I've been there. There was a time my Nextcloud install was incredibly slow. Fortunately (or unfortunately?), it is featureful enough and widely supported that once you figure this issue out, it is a nice service to keep running.

For me, adding Redis was essential. It doesn't really make sense to me why (nothing I do on Nextcloud is intensive or data heavy) but it has greatly improved the performance of my app.

My entire setup is a containerized Nextcloud, Nextcloud Cron, MariaDB (if I knew Postgres was an option, I would've chosen that), and Redis:

version: '2'
services:
  nextcloud:
    container_name: nextcloud
    image: nextcloud:27-apache
    restart: unless-stopped
    environment:
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    labels:
      - 'public-service=true'
      - 'traefik.enable=true'
      - 'traefik.http.routers.cloud.rule=Host(`nextcloud.some.domain`)'
      - 'traefik.http.routers.cloud.tls=true'
      - 'traefik.http.services.cloud.loadbalancer.server.port=80'
    volumes:
      - /some/data/dir/nextcloud/data:/var/www/html
      - /some/external/dir:/wew:ro

  nextcloud-cron:
    image: nextcloud:27-apache
    restart: unless-stopped
    command: [/cron.sh]
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloud
    volumes:
      - /some/data/dir/nextcloud/data:/var/www/html
      - /some/external/dir/:/wew:ro

  db:
    image: mariadb:10.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_ROOT_PASSWORD: nextcloud
    volumes:
      - /some/data/dir/nextcloud/db:/var/lib/mysql

  mysqldump:
    image: mariadb:10.4
    depends_on: [db]
    # restart: never # cronjob
    labels:
      - 'cron.schedule=0 0 8 * * ?'
    entrypoint: [mysqldump, -h, db, -u, nextcloud, -pnextcloud, --all-databases, -r, /out/nextcloud.sql]
    user: root
    volumes:
      - /some/data/dir/nextcloud/db-dump:/out

  redis:
    image: redis
    restart: unless-stopped
8 more...

Wait, you're serious?

The separate cron container made the most sense to me. Other variants "work" but imo are mostly workarounds to avoid setting up a real cronjob. Beyond this I have no real reason, nor can I vouch that is is more or less performant than others.

Yes, the mysqldump container is for easier restores. It's much easier to restore from a .sql file than a raw data dir that was copied while the DB was running ;) (speaking from experience...)

I configured it in config.php directly, probably following https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/caching_configuration.html#id2

  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
  array (
    'host' => 'redis',
    'port' => 6379,
  ),

I'll try this next time I need to restore the DB from backup, cheers!