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

  1. Preparar dominio/subdominio de la instancia a configurar
  2. Crear archivos de configuración
    1. Archivo de variables de entorno: .env
    Archivo para Docker Compose: compose.yaml Archivo de configuración personalizada de MariaDB/MySQL: my.cnf Archivo de configuración personalizada de PHP: php.ini Cambiar valores de acuerdo a las necesidades de la instancia Levantar contenedor (docker composer up)up) Visitar aplicación y comprobar que esté funcionando correctamente

    Configuración previa

    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
    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}
              - TRUSTED_PROXIES=127.0.0.1
          volumes:
              - ${VOLUME_PATH}/files:/var/www/html
              - ./nextcloud.ini:/usr/local/etc/php/conf.d/nextcloud.ini
          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.

    # MariaDB configuración personalizada 
    # para instancia pequeña, de uso personal 
    # y principalmente almacenamiento de archivos
    
    [mysqld]
    bulk_insert_buffer_size = 0
    connect_timeout         = 10
    innodb_buffer_pool_size = 75M
    innodb_log_buffer_size  = 1M
    max_allowed_packet      = 25M
    max_connections         = 100
    max_heap_table_size     = 16K
    query_cache_limit       = 128K
    query_cache_size        = 512K
    sort_buffer_size        = 10M
    thread_cache_size       = 4M
    tmp_table_size          = 1K
    wait_timeout            = 600

    nextcloud.ini

    Configuración para ampliar la capacidad de subida de archivos. Es opcional. Se debe ajustar a las necesidades de la instancia.

    memory_limit=1G
    upload_max_filesize=1G
    post_max_size=1G
    max_input_time=3600
    max_execution_time=3600

    Scripts útiles

    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'