Ir al contenido principal

Nextcloud + Traefik

Requerimientos previos

    Docker instalado Instancia de Traefik instalada y corriendo Red de Docker creada para conectar contenedor con Traefik Opcionalmente, usa un middleware configurado en Traefik:
      autodetectContenttype@file

      Pasos

        Preparar dominio/subdominio de la instancia a configurar
        Crear archivos de configuración Cambiar valores de acuerdo a las necesidades de la instancia Levantar contenedor (docker composer up) Visitar aplicación y comprobar que esté funcionando correctamente

        Configuración previa

        (nombre de paso)

        Por documentar

        Archivos de configuración

        .env

        INSTANCE_URL=ejemplo.com
        APP_CONTAINER_NAME=nextcloud-app
        APP_CONTAINER_USER=www-data
        MYSQL_ROOT_PASSWORD=abc123456
        PHP_UPLOAD_LIMIT=720
        REDIS_HOST_PASSWORD=abc123456
        MYSQL_DATABASE=nextcloud_db
        MYSQL_USER=nextcloud_db_admin
        MYSQL_PASSWORD=abc123456
        VOLUME_PATH=./data

        compose.yaml

        En la configuración de entrypoints y certresolver cambiar de acuerdo a los valores configurados en Traefik.

        services:
          nextcloud-db:
              image: mariadb:lts
              container_name: nextcloud-db
              command: --transaction-isolation=READ-COMMITTED --log-bin=ROW --skip-innodb-read-only-compressed
              restart: unless-stopped
              volumes:
                  - ${VOLUME_PATH}/db:/var/lib/mysql
                  - ./my.cnf:/etc/mysql/my.cnf
              environment:
                  - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
                  - MYSQL_DATABASE=${MYSQL_DATABASE}
                  - MYSQL_USER=${MYSQL_USER}
                  - MYSQL_PASSWORD=${MYSQL_PASSWORD}
              networks:
                  - traefik
          nextcloud-redis:
              image: redis:alpine
              container_name: nextcloud-redis
              hostname: nextcloud-redis
              restart: unless-stopped
              command: redis-server --requirepass ${REDIS_HOST_PASSWORD}
              networks:
                  - traefik
          nextcloud-app:
              image: nextcloud
              container_name: nextcloud-app
              restart: unless-stopped
              depends_on:
                  - nextcloud-db
                  - nextcloud-redis
              environment:
                  - REDIS_HOST=nextcloud-redis
                  - REDIS_HOST_PASSWORD=${REDIS_HOST_PASSWORD}
                  - MYSQL_HOST=nextcloud-db
                  - MYSQL_DATABASE=${MYSQL_DATABASE}
                  - MYSQL_USER=${MYSQL_USER}
                  - MYSQL_PASSWORD=${MYSQL_PASSWORD}
                  - OVERWRITEPROTOCOL=https
                  - OVERWRITEHOST=${INSTANCE_URL}
                  - PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT}
                  - TRUSTED_PROXIES=127.0.0.1
              volumes:
                  - ${VOLUME_PATH}/files:/var/www/html
              labels:
                  - "traefik.enable=true"
                  - "traefik.http.middlewares.nc-rep1.redirectregex.permanent=true"
                  - "traefik.http.middlewares.nc-rep1.redirectregex.regex=https://(.*)/.well-known/(?:card|cal)dav"
                  - "traefik.http.middlewares.nc-rep1.redirectregex.replacement=https://$${1}/remote.php/dav"
                  - "traefik.http.routers.nextcloud-secure.rule=Host(`${INSTANCE_URL}`)"
                  - "traefik.http.routers.nextcloud-secure.entrypoints=https"
                  - "traefik.http.routers.nextcloud-secure.middlewares=nc-rep1@docker,secHeaders@file"
                  - "traefik.http.routers.nextcloud-secure.tls=true"
                  - "traefik.http.routers.nextcloud-secure.tls.certresolver=tls"
                  - "traefik.http.services.nextcloud-secure.loadbalancer.server.port=80"
                  - "traefik.http.services.nextcloud-secure.loadbalancer.passHostHeader=true"
              networks:
                  - traefik
          nextcloud-cron:
              container_name: nextcloud-cron
              image: nextcloud
              restart: unless-stopped
              volumes:
                  - ${VOLUME_PATH}/files:/var/www/html
              entrypoint: /cron.sh
              networks:
                  - traefik
        networks:
          traefik:
            external: true
        

        my.cnf

        Configuración para reducir el consumo de memoria de la base de datos. Es opcional. Se debe ajustar a las necesidades de la instancia.

        # The MariaDB configuration file
        
        [client-server]
        socket = /run/mysqld/mysqld.sock
        
        !includedir /etc/mysql/mariadb.conf.d/
        !includedir /etc/mysql/conf.d/
        
        max_connections         = 10
        connect_timeout         = 5
        wait_timeout            = 600
        max_allowed_packet      = 16M
        thread_cache_size       = 4M
        sort_buffer_size        = 32K
        bulk_insert_buffer_size = 0
        tmp_table_size          = 1K
        max_heap_table_size     = 16K
        query_cache_limit       = 128K
        query_cache_size        = 512K
        innodb_buffer_pool_size = 10M
        innodb_log_buffer_size  = 512K
        

        Scripts utiles

        Colocar en la misma carpeta que el archivo compose.yaml y el archivo .env

        occ.sh

        #!/bin/bash
        #
        # Ejemplo de uso:
        # ./occ.sh app:update --all
        # 
        source .env
        sudo docker exec -ti --user $APP_CONTAINER_USER $APP_CONTAINER_NAME /var/www/html/occ $@

        fix-permission.sh

        #!/bin/bash
        source .env
        sudo docker exec -u root $APP_CONTAINER_NAME sh -c 'chmod 755 /var/www/html/config'
        sudo docker exec -u root $APP_CONTAINER_NAME sh -c 'chown -R www-data:www-data /var/www/html/config'
        sudo docker exec -u root $APP_CONTAINER_NAME sh -c 'ls -lsa /var/www/html'