I am hosting more than 10 services currently but only Nextcloud sends me errors periodically and only Nextcloud is super extremely painfully slow. I quit this sh*t. No more troubleshooting and optimization.

There are mainly 4 services in Nextcloud I’m using:

  • Files: as simple server for upload and download binaries
  • Calendar (with DAVx5): as sync server without web UI
  • Notes: simple note-taking
  • Network folder: mounted on Linux dolphin

Could you recommend me the alternatives for these? All services are supposed to be exposed by HTTPS, so authentication like login is needed. And I’ve tried note-taking apps like Joplin or trillium but couldn’t like it.

Thanks in advance.

  • @rangerelfB
    link
    fedilink
    English
    17 months ago

    Not OP, but I run it on docker with postgres and redis, behind a reverse proxy. All apps on NC have pretty good performance and haven’t had any weird issues. It’s on an old xeon with 32gb and on spinning rust.

    • @ilikepie71B
      link
      fedilink
      English
      17 months ago

      Do you have redis talking to nextcloud over the unix socket or just regular TCP? The former is apparently another way to speed up nextcloud, but I’m struggling to understand to get containers using the unix socket instead.

      • @rangerelfB
        link
        fedilink
        English
        17 months ago

        I have both Postgres and Redis talking to Nextcloud through their respective unix sockets; I store the sockets in a named volume, so I can mount it on whatever containers need to reach them.

        • @ilikepie71B
          link
          fedilink
          English
          17 months ago

          Do you mind sharing your docker config, so I can try and replicate it. Thank you

          • @rangerelfB
            link
            fedilink
            English
            17 months ago

            Sure:

            POSTGRES

            ---
            version: '3.8'
            services:
              postgres:
                container_name: postgres
                image: postgres:14-alpine
                environment:
                  POSTGRES_PASSWORD: "XXXXXXXXXXXXXXXX"
                  PGDATA: "/var/lib/postgresql/data/pgdata"
                volumes:
                  - type: bind
                    source: ./data
                    target: /var/lib/postgresql/data
                  - type: volume
                    source: postgres-socket
                    target: /run/postgresql
                logging:
                  driver: json-file
                  options:
                    max-size: 2m
                restart: unless-stopped
            networks:
              default:
                external:
                  name: backend
            volumes:
              postgres-socket:
                name: postgres-socket
            

            REDIS

            ---
            version: '3.8'
            services:
              redis:
                image: redis:7.2-alpine
                command:
                  - /data/redis.conf
                  - --loglevel
                  - verbose
                volumes:
                  - type: bind
                    source: ./data
                    target: /data
                  - type: volume
                    source: redis-socket
                    target: /var/run
                logging:
                  driver: json-file
                  options:
                    max-size: 2m
                restart: unless-stopped
            networks:
              default:
                external:
                  name: backend
            volumes:
              redis-socket:
                name: redis-socket
            

            Here’s redis.conf, it took me a couple of tries to get it just right:

            # create a unix domain socket to listen on
            unixsocket /var/run/redis/redis.sock
            unixsocketperm 666
            # protected-mode no
            requirepass rrrrrrrrrrrrr
            bind 0.0.0.0
            port 6379
            tcp-keepalive 300
            daemonize no
            stop-writes-on-bgsave-error no
            rdbcompression yes
            rdbchecksum yes
            # maximum memory allowed for redis
            maxmemory 50M
            # how redis will evice old objects - least recently used
            maxmemory-policy allkeys-lru
            # logging
            # levels: debug verbose notice warning
            loglevel notice
            logfile ""
            always-show-logo yes
            

            NEXTCLOUD

            ---
            version: '3.8'
            services:
              nextcloud:
                image: nextcloud:27-fpm
                env_file:
                  - data/environment.txt
                volumes:
                  - type: bind
                    source: ./data/html
                    target: /var/www/html
                  - type: volume
                    source: redis-socket
                    target: /redis
                  - type: volume
                    source: postgres-socket
                    target: /postgres
                  - type: tmpfs
                    target: /tmp:exec
                  - type: bind
                    source: ./data/zz-docker.conf
                    target: /usr/local/etc/php-fpm.d/zz-docker.conf
                  - type: bind
                    source: ./data/opcache_cli.conf
                    target: /usr/local/etc/php/conf.d/opcache_cli.conf
                networks:
                  - web
                  - backend
                logging:
                  driver: json-file
                  options:
                    max-size: 2m
                restart: unless-stopped
              crond:
                image: nextcloud:27-fpm
                entrypoint: /cron.sh
                env_file:
                  - data/environment.txt
                volumes:
                  - type: bind
                    source: ./data/html
                    target: /var/www/html
                  - type: bind
                    source: ./data/zz-docker.conf
                    target: /usr/local/etc/php-fpm.d/zz-docker.conf
                  - type: volume
                    source: redis-socket
                    target: /redis
                  - type: volume
                    source: postgres-socket
                    target: /postgres
                  - type: tmpfs
                    target: /tmp:exec
                networks:
                  - web
                  - backend
                logging:
                  driver: json-file
                  options:
                    max-size: 2m
                restart: unless-stopped
              collabora:
                image: collabora/code:23.05.5.4.1
                privileged: true
                environment:
                  extra_params: "--o:ssl.enable=false --o:ssl.termination=true"
                  aliasgroup1: 'https://my.nextcloud.domain.org:443'
                cap_add:
                  - MKNOD
                networks:
                  - web
                logging:
                  driver: json-file
                  options:
                    max-size: 2m
                restart: unless-stopped
            networks:
              backend:
                external:
                  name: backend
              web:
                external:
                  name: web
            volumes:
              redis-socket:
                name: redis-socket
              postgres-socket:
                name: postgres-socket
            

            The environment.txt file is hostnames, logins, passwords, etc…

            POSTGRES_DB=nextcloud
            POSTGRES_USER=xxxxxxx
            POSTGRES_PASSWORD=yyyyyyyyyyyyyyyyyyy
            POSTGRES_SERVER=postgres
            POSTGRES_HOST=/postgres/.s.PGSQL.5432
            NEXTCLOUD_ADMIN_USER=aaaaa
            NEXTCLOUD_ADMIN_PASSWORD=hhhhhhhhhhhhhhhhhhh
            REDIS_HOST=redis
            REDIS_HOST_PORT=6379
            REDIS_HOST_PASSWORD=rrrrrrrrrrrrr
            

            The zz-docker.conf file sets some process tuning and log format, some might not even be necessary:

            [global]
            daemonize = no
            error_log = /proc/self/fd/2
            log_limit = 8192
            
            [www]
            access.log = /proc/self/fd/2
            access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
            catch_workers_output = yes
            decorate_workers_output = no
            clear_env = no
            
            user = www-data
            group = www-data
            
            listen = 9000
            listen = /var/www/html/.fpm-sock
            listen.owner = www-data
            listen.group = www-data
            listen.mode = 0666
            listen.backlog = 512
            
            pm = dynamic
            pm.max_children = 16
            pm.start_servers = 6
            pm.min_spare_servers = 4
            pm.max_spare_servers = 6
            pm.process_idle_timeout = 30s;
            pm.max_requests = 512
            

            The opcache_cli.conf file has a single line:

            opcache.enable_cli=1
            

            I don’t remember why it’s there but it’s working so I’m not touching it :-D

            Good luck :-)