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
  3. Cambiar valores de acuerdo a las necesidades de la instancia
  4. Levantar contenedor (docker composer up)
  5. 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'