# DOMAIN=example.com docker stack deploy -c nextcloud.yml nextcloud services: nginx: image: ethibox/nginx-proxy:latest environment: - NGINX_TEMPLATE=${NGINX_TEMPLATE:-/etc/nginx/nextcloud.template} - SERVER_NAME={{ index .Service.Labels "com.docker.stack.namespace" }}_app volumes: - ${VOLUME_PATH}nextcloud:/var/www/html deploy: resources: limits: memory: ${MEMORY_LIMIT:-2G} labels: - traefik.enable=true - traefik.http.routers.nextcloud-${NUMBER:-1}.rule=Host(`${DOMAIN:-nextcloud.localhost}`) - traefik.http.routers.nextcloud-${NUMBER:-1}.middlewares=nextcloud-${NUMBER:-1} - traefik.http.services.nextcloud-${NUMBER:-1}.loadbalancer.server.port=80 - traefik.http.middlewares.nextcloud-${NUMBER:-1}.headers.customRequestHeaders.X-Forwarded-Proto=https - traefik.http.middlewares.nextcloud-${NUMBER:-1}.headers.customResponseHeaders.Strict-Transport-Security=max-age=31536000 networks: - internal - traefik app: image: &nextcloud-image nextcloud:${VERSION:-34.0.3-fpm-alpine} entrypoint: /bin/sh command: - -c - | apk add --no-cache fcgi sed -i 's/pm = dynamic/pm = ondemand/g' /usr/local/etc/php-fpm.d/www.conf sed -i "s/pm.max_children = 5/pm.max_children = ${PHP_FPM_MAX_CHILDREN:-60}/g" /usr/local/etc/php-fpm.d/www.conf sed -i "s/;pm.process_idle_timeout = 10s/pm.process_idle_timeout = 10s/g" /usr/local/etc/php-fpm.d/www.conf sed -i 's/;pm.max_requests/pm.max_requests/g' /usr/local/etc/php-fpm.d/www.conf echo "php /var/www/html/occ app:disable app_api" > /docker-entrypoint-hooks.d/post-installation/setup.sh echo "php /var/www/html/occ db:add-missing-indices -n" >> /docker-entrypoint-hooks.d/post-installation/setup.sh echo "php /var/www/html/occ maintenance:repair --include-expensive -n" >> /docker-entrypoint-hooks.d/post-installation/setup.sh chmod +x /docker-entrypoint-hooks.d/post-installation/setup.sh exec /entrypoint.sh php-fpm environment: &nextcloud-environment - DOMAIN=${DOMAIN:-nextcloud.localhost} - MYSQL_HOST=mariadb - MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud} - MYSQL_USER=${MYSQL_USER:-nextcloud} - MYSQL_PASSWORD=${MYSQL_PASSWORD:-myp@ssw0rd} - NEXTCLOUD_UPDATE=${NEXTCLOUD_UPDATE:-1} - FORCE_LANGUAGE=${FORCE_LANGUAGE:-en} - OVERWRITEHOST=${DOMAIN:-nextcloud.localhost} - OVERWRITEPROTOCOL=${OVERWRITEPROTOCOL:-https} - TRUSTED_PROXIES=${TRUSTED_PROXIES:-10.0.0.0/8 172.16.0.0/12} - REDIS_HOST=redis - REDIS_HOST_PASSWORD=myp@ssw0rd - OBJECTSTORE_S3_HOST=${OBJECTSTORE_S3_HOST} - OBJECTSTORE_S3_BUCKET=${OBJECTSTORE_S3_BUCKET} - OBJECTSTORE_S3_KEY=${OBJECTSTORE_S3_KEY} - OBJECTSTORE_S3_SECRET=${OBJECTSTORE_S3_SECRET} - OBJECTSTORE_S3_PORT=${OBJECTSTORE_S3_PORT} - OBJECTSTORE_S3_SSL=${OBJECTSTORE_S3_SSL} - OBJECTSTORE_S3_REGION=${OBJECTSTORE_S3_REGION} - OBJECTSTORE_S3_USEPATH_STYLE=${OBJECTSTORE_S3_USEPATH_STYLE} - OBJECTSTORE_S3_OBJECT_PREFIX=${OBJECTSTORE_S3_OBJECT_PREFIX} - PHP_OPCACHE_MEMORY_CONSUMPTION=${PHP_OPCACHE_MEMORY_CONSUMPTION:-512} - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} - PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT:-512M} - NEXTCLOUD_ADMIN_USER=${ADMIN_USERNAME:-admin} - NEXTCLOUD_ADMIN_PASSWORD=${ADMIN_PASSWORD:-myp@ssw0rd} - NC_default_phone_region=${NC_default_phone_region:-FR} - NC_loglevel=${NC_loglevel:-2} - NC_maintenance_window_start=1 volumes: - ${VOLUME_PATH}nextcloud:/var/www/html healthcheck: test: - CMD-SHELL - REQUEST_METHOD="GET" SCRIPT_NAME="status.php" SCRIPT_FILENAME="status.php" cgi-fcgi -bind -connect "127.0.0.1:9000" | grep -q '"installed":true' interval: 30s timeout: 10s retries: 3 start_period: 10m deploy: resources: limits: cpus: ${CPU_LIMIT:-2.0} memory: ${MEMORY_LIMIT:-2G} networks: - internal cron: image: *nextcloud-image entrypoint: /cron.sh environment: *nextcloud-environment volumes: - ${VOLUME_PATH}nextcloud:/var/www/html deploy: resources: limits: cpus: ${CRON_CPU_LIMIT:-2.0} memory: ${MEMORY_LIMIT:-2G} networks: - internal mariadb: image: mariadb:${MARIADB_VERSION:-11.4} command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-myp@ssw0rd} - MYSQL_USER=${MYSQL_USER:-nextcloud} - MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud} - MYSQL_PASSWORD=${MYSQL_PASSWORD:-myp@ssw0rd} volumes: - ${VOLUME_PATH}mariadb:/var/lib/mysql healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] deploy: resources: limits: memory: ${MEMORY_LIMIT:-2G} networks: - internal redis: image: redis:7-alpine environment: - REDIS_HOST_PASSWORD=myp@ssw0rd command: /bin/sh -c 'redis-server --requirepass $$REDIS_HOST_PASSWORD' healthcheck: test: ["CMD", "redis-cli", "ping"] deploy: resources: limits: memory: ${MEMORY_LIMIT:-2G} networks: - internal volumes: nextcloud: mariadb: networks: internal: driver: overlay attachable: true traefik: external: true name: traefik-net