From be21f6f284438b9ff27ff9332b90f861d3a85a67 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:46:14 -0300 Subject: [PATCH 01/29] chore: execute services using profile Some services aren't mandatory and I moved to profiles Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 1e8503b..c491949 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,6 +85,8 @@ services: image: redis eurooffice: image: ghcr.io/euro-office/documentserver:latest + profiles: + - eurooffice restart: always volumes: - ./volumes/eurooffice:/home/eurooffice/.eurooffice @@ -102,6 +104,8 @@ services: playwright: image: mcr.microsoft.com/playwright:v1.59.1-noble container_name: nextcloud-playwright + profiles: + - playwright user: pwuser volumes: - ./volumes/nextcloud:/var/www/html @@ -120,6 +124,8 @@ services: - default signal-gateway: image: bbernhard/signal-cli-rest-api:latest + profiles: + - signal restart: unless-stopped ports: - 127.0.0.1:5001:8080 @@ -129,6 +135,8 @@ services: - LOG_LEVEL=info whatsapp.web: image: aldinokemal2104/go-whatsapp-web-multidevice + profiles: + - whatsapp restart: unless-stopped environment: - APP_PORT=3000 From c6d93b1c1c0493911020576cac4d078c6f89cad3 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:48:00 -0300 Subject: [PATCH 02/29] fix: remove container name With container name isn't possible to start multiple services Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index c491949..2a3bc17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -103,7 +103,6 @@ services: - host.docker.internal:host-gateway playwright: image: mcr.microsoft.com/playwright:v1.59.1-noble - container_name: nextcloud-playwright profiles: - playwright user: pwuser From cf504a16f2eef9acc0f251ed399ce86e911def47 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:50:04 -0300 Subject: [PATCH 03/29] chore: remove the uless-stopped to be possible don't start this service Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2a3bc17..a18a188 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,6 @@ services: pgsql: image: postgres:13-alpine - restart: unless-stopped volumes: - ./volumes/postgres/data:/var/lib/postgresql/data environment: @@ -20,7 +19,6 @@ services: - ./volumes/mysql/data:/var/lib/mysql ports: - 127.0.0.1:3306:3306 - restart: unless-stopped environment: - TZ=${TZ:-CET} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} From 1272a0b2dd8fda4290e4f53126eaed9c8f467c62 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:53:06 -0300 Subject: [PATCH 04/29] feat: use published hange to define host ports Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a18a188..d6ef7c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,8 +8,10 @@ services: - POSTGRES_USER=${POSTGRES_USER:-nextcloud} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} ports: - - 127.0.0.1:5432:5432 command: postgres -c log_statement=all + - target: 5432 + published: "5432-5451" + host_ip: 127.0.0.1 mysql: # Pin to 8.4: mysql:latest currently resolves to 9.x, and Nextcloud autoinstall # runs with the application user, which cannot read mysql.component there. @@ -18,7 +20,9 @@ services: - ./volumes/mysql/init:/docker-entrypoint-initdb.d - ./volumes/mysql/data:/var/lib/mysql ports: - - 127.0.0.1:3306:3306 + - target: 3306 + published: "3306-3325" + host_ip: 127.0.0.1 environment: - TZ=${TZ:-CET} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} @@ -73,12 +77,16 @@ services: - ./volumes/nginx/includes:/etc/nginx/conf.d/includes/ - ./volumes/nginx/certs:/certs ports: - - ${HTTP_PORT:-80}:80 - - 443:443 + - target: 80 + published: "${HTTP_PORT:-80-99}" + - target: 443 + published: "443-462" mailpit: image: axllent/mailpit ports: - - 127.0.0.1:${MAILHOG_PORT:-8025}:8025 + - target: 8025 + published: "${MAILHOG_PORT:-8025-8044}" + host_ip: 127.0.0.1 redis: image: redis eurooffice: @@ -91,7 +99,8 @@ services: - ./volumes/eurooffice/local.json:/etc/onlyoffice/documentserver/local.json - ./volumes/nextcloud/apps-extra/eurooffice-plugin:/var/www/onlyoffice/documentserver/sdkjs-plugins/libresign:ro ports: - - 8080:80 + - target: 80 + published: "8080-8099" environment: - EXAMPLE_ENABLED=true - JWT_SECRET=${JWT_SECRET:-my_jwt_secret} @@ -108,7 +117,9 @@ services: - ./volumes/nextcloud:/var/www/html working_dir: /var/www/html ports: - - 127.0.0.1:9323:9323 + - target: 9323 + published: "9323-9342" + host_ip: 127.0.0.1 environment: - PLAYWRIGHT_BASE_URL=${PLAYWRIGHT_BASE_URL:-https://nginx} - NODE_ENV=test @@ -125,7 +136,9 @@ services: - signal restart: unless-stopped ports: - - 127.0.0.1:5001:8080 + - target: 8080 + published: "5001-5020" + host_ip: 127.0.0.1 volumes: - ./volumes/signal:/home/.local/share/signal-cli environment: From 35fe09b5cc5d5f766b8b467352bc47136b378078 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:55:14 -0300 Subject: [PATCH 05/29] chore: use command to define the command to be executed when started Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d6ef7c7..2f0b5d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,10 +8,10 @@ services: - POSTGRES_USER=${POSTGRES_USER:-nextcloud} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} ports: - command: postgres -c log_statement=all - target: 5432 published: "5432-5451" host_ip: 127.0.0.1 + command: ["postgres", "-c", "log_statement=all"] mysql: # Pin to 8.4: mysql:latest currently resolves to 9.x, and Nextcloud autoinstall # runs with the application user, which cannot read mysql.component there. @@ -23,6 +23,7 @@ services: - target: 3306 published: "3306-3325" host_ip: 127.0.0.1 + command: ["mysqld"] environment: - TZ=${TZ:-CET} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} From bea94fa070f2ff377ae78ab7face442570a579c5 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:07:21 -0300 Subject: [PATCH 06/29] feat: use an entrypoint to choose the service that will shutdown Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 2f0b5d0..41f4249 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,10 +3,13 @@ services: image: postgres:13-alpine volumes: - ./volumes/postgres/data:/var/lib/postgresql/data + - ./.docker/entrypoints/database-provider.sh:/usr/local/bin/database-provider.sh:ro environment: + - DB_HOST=${DB_HOST:-mysql} - POSTGRES_DB=${POSTGRES_DB:-nextcloud} - POSTGRES_USER=${POSTGRES_USER:-nextcloud} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} + entrypoint: ["/bin/sh", "/usr/local/bin/database-provider.sh", "pgsql", "docker-entrypoint.sh"] ports: - target: 5432 published: "5432-5451" @@ -19,12 +22,15 @@ services: volumes: - ./volumes/mysql/init:/docker-entrypoint-initdb.d - ./volumes/mysql/data:/var/lib/mysql + - ./.docker/entrypoints/database-provider.sh:/usr/local/bin/database-provider.sh:ro ports: - target: 3306 published: "3306-3325" host_ip: 127.0.0.1 + entrypoint: ["/bin/sh", "/usr/local/bin/database-provider.sh", "mysql", "docker-entrypoint.sh"] command: ["mysqld"] environment: + - DB_HOST=${DB_HOST:-mysql} - TZ=${TZ:-CET} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} - MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud} From fcd99e11e93a2fb7665843845f381f31b9238122 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:11:14 -0300 Subject: [PATCH 07/29] feat: create the database provider script This script will choose who will shutdown Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/scripts/database-provider.sh | 24 ++++++++++++++++++++++++ docker-compose.yml | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .docker/scripts/database-provider.sh diff --git a/.docker/scripts/database-provider.sh b/.docker/scripts/database-provider.sh new file mode 100644 index 0000000..4dbbc7c --- /dev/null +++ b/.docker/scripts/database-provider.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -eu + +EXPECTED_HOST="$1" +shift + +CURRENT_HOST="${DB_HOST:-mysql}" + +if [ "$CURRENT_HOST" != "$EXPECTED_HOST" ]; then + case "$EXPECTED_HOST" in + mysql) DATABASE_NAME="MySQL" ;; + pgsql) DATABASE_NAME="PostgreSQL" ;; + esac + + echo + echo "$DATABASE_NAME disabled." + echo "Selected DB_HOST: $CURRENT_HOST." + echo "This is expected." + echo "Set DB_HOST=$EXPECTED_HOST to enable $DATABASE_NAME." + echo + exit 0 +fi + +exec "$@" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 41f4249..2616162 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: image: postgres:13-alpine volumes: - ./volumes/postgres/data:/var/lib/postgresql/data - - ./.docker/entrypoints/database-provider.sh:/usr/local/bin/database-provider.sh:ro + - ./.docker/scripts/database-provider.sh:/usr/local/bin/database-provider.sh:ro environment: - DB_HOST=${DB_HOST:-mysql} - POSTGRES_DB=${POSTGRES_DB:-nextcloud} @@ -22,7 +22,7 @@ services: volumes: - ./volumes/mysql/init:/docker-entrypoint-initdb.d - ./volumes/mysql/data:/var/lib/mysql - - ./.docker/entrypoints/database-provider.sh:/usr/local/bin/database-provider.sh:ro + - ./.docker/scripts/database-provider.sh:/usr/local/bin/database-provider.sh:ro ports: - target: 3306 published: "3306-3325" From cc2663251d119a4f990d76c661893f233320d329 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:16:30 -0300 Subject: [PATCH 08/29] chore: use master as default Nextcloud server version Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2616162..7357bac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -65,7 +65,7 @@ services: - MAIL_DOMAIN=${MAIL_DOMAIN:-nextcloud.test} - MAIL_SMTPPORT=${MAIL_SMTPPORT:-1025} - MAIL_SMTPHOST=${MAIL_SMTPHOST:-mailpit} - - VERSION_NEXTCLOUD=${VERSION_NEXTCLOUD:-stable33} + - VERSION_NEXTCLOUD=${VERSION_NEXTCLOUD:-master} - AUTOINSTALL=${AUTOINSTALL:-1} - XDEBUG_CONFIG - HTTP_PORT=${HTTP_PORT:-80} From 64474735f8367370d144cee322ab7147e63cbb49 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:17:39 -0300 Subject: [PATCH 09/29] chore: says that the .env is optional Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index f7262d4..0a38c45 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -4,9 +4,9 @@ You can customize the environment before first run changing some environments entries. -Create an `.env` file and add values on your needs. +An `.env` file is optional. You can also set values inline, for example `VERSION_NEXTCLOUD=stable33 docker compose up`. -`VERSION_NEXTCLOUD` For this environment, the recommended branch is `stable33`. If you need to work with another Nextcloud server version, use the matching branch from the [Nextcloud server repository](https://github.com/nextcloud/server). +`VERSION_NEXTCLOUD` For this environment, the recommended branch is `master`. If you need to work with another Nextcloud server version, use the matching branch from the [Nextcloud server repository](https://github.com/nextcloud/server). ## PHP custom settings From be246e9a61f5c45e62a9d4e0abf55d7195d3d1a4 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:18:21 -0300 Subject: [PATCH 10/29] chore: improve meaning Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index 0a38c45..33cb725 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -2,7 +2,7 @@ ## Environments -You can customize the environment before first run changing some environments entries. +You can customize the environment before first run by changing environment entries. An `.env` file is optional. You can also set values inline, for example `VERSION_NEXTCLOUD=stable33 docker compose up`. From e2ec0ab66c90f6f37b2e68b85b579683f562aeaa Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:22:40 -0300 Subject: [PATCH 11/29] chore: Remove from service the responsability to says the host port Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/scripts/entrypoint.sh | 6 +----- docker-compose.yml | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.docker/scripts/entrypoint.sh b/.docker/scripts/entrypoint.sh index b8732e1..e117b19 100644 --- a/.docker/scripts/entrypoint.sh +++ b/.docker/scripts/entrypoint.sh @@ -140,9 +140,5 @@ exec busybox crond -f -l 0 -L /dev/stdout > /dev/null 2>&1 & runuser -u www-data -- php -f /var/www/html/cron.php # Start PHP-FPM -if [[ "$HTTP_PORT" != 80 ]]; then - echo "💙 Nextclud is up! Access http://localhost:$HTTP_PORT" -else - echo "💙 Nextclud is up! Access http://localhost" -fi +echo "💙 Nextcloud is up!" exec "$@" diff --git a/docker-compose.yml b/docker-compose.yml index 7357bac..1e7d58b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,7 +68,6 @@ services: - VERSION_NEXTCLOUD=${VERSION_NEXTCLOUD:-master} - AUTOINSTALL=${AUTOINSTALL:-1} - XDEBUG_CONFIG - - HTTP_PORT=${HTTP_PORT:-80} extra_hosts: - host.docker.internal:host-gateway nginx: From b8385ca96c75ad91bf21c37f16e2fbbbca7a8405 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:27:06 -0300 Subject: [PATCH 12/29] chore: rename the Nextcloud entrypoint to prevent issues Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/Dockerfile.php81 | 2 +- .docker/Dockerfile.php82 | 2 +- .docker/Dockerfile.php83 | 2 +- .docker/scripts/{entrypoint.sh => nextcloud-entrypoint.sh} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename .docker/scripts/{entrypoint.sh => nextcloud-entrypoint.sh} (100%) diff --git a/.docker/Dockerfile.php81 b/.docker/Dockerfile.php81 index a6d72f8..486d711 100644 --- a/.docker/Dockerfile.php81 +++ b/.docker/Dockerfile.php81 @@ -77,5 +77,5 @@ VOLUME /var/www/html WORKDIR /var/www/html -ENTRYPOINT [ "bash", "/var/www/scripts/entrypoint.sh" ] +ENTRYPOINT [ "bash", "/var/www/scripts/nextcloud-entrypoint.sh" ] CMD ["php-fpm"] diff --git a/.docker/Dockerfile.php82 b/.docker/Dockerfile.php82 index caa064f..d375b01 100644 --- a/.docker/Dockerfile.php82 +++ b/.docker/Dockerfile.php82 @@ -77,5 +77,5 @@ VOLUME /var/www/html WORKDIR /var/www/html -ENTRYPOINT [ "bash", "/var/www/scripts/entrypoint.sh" ] +ENTRYPOINT [ "bash", "/var/www/scripts/nextcloud-entrypoint.sh" ] CMD ["php-fpm"] diff --git a/.docker/Dockerfile.php83 b/.docker/Dockerfile.php83 index c6aa670..bdb75c4 100644 --- a/.docker/Dockerfile.php83 +++ b/.docker/Dockerfile.php83 @@ -77,5 +77,5 @@ VOLUME /var/www/html WORKDIR /var/www/html -ENTRYPOINT [ "bash", "/var/www/scripts/entrypoint.sh" ] +ENTRYPOINT [ "bash", "/var/www/scripts/nextcloud-entrypoint.sh" ] CMD ["php-fpm"] diff --git a/.docker/scripts/entrypoint.sh b/.docker/scripts/nextcloud-entrypoint.sh similarity index 100% rename from .docker/scripts/entrypoint.sh rename to .docker/scripts/nextcloud-entrypoint.sh From 08456cabe11d9e0beb663fd51d681d78d31a4c74 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:28:10 -0300 Subject: [PATCH 13/29] chore: rename database entrypoint Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .../{database-provider.sh => database-entrypoint.sh} | 0 docker-compose.yml | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) rename .docker/scripts/{database-provider.sh => database-entrypoint.sh} (100%) diff --git a/.docker/scripts/database-provider.sh b/.docker/scripts/database-entrypoint.sh similarity index 100% rename from .docker/scripts/database-provider.sh rename to .docker/scripts/database-entrypoint.sh diff --git a/docker-compose.yml b/docker-compose.yml index 1e7d58b..ef4609e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,13 +3,13 @@ services: image: postgres:13-alpine volumes: - ./volumes/postgres/data:/var/lib/postgresql/data - - ./.docker/scripts/database-provider.sh:/usr/local/bin/database-provider.sh:ro + - ./.docker/scripts/database-entrypoint.sh:/usr/local/bin/database-entrypoint.sh:ro environment: - DB_HOST=${DB_HOST:-mysql} - POSTGRES_DB=${POSTGRES_DB:-nextcloud} - POSTGRES_USER=${POSTGRES_USER:-nextcloud} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} - entrypoint: ["/bin/sh", "/usr/local/bin/database-provider.sh", "pgsql", "docker-entrypoint.sh"] + entrypoint: ["/bin/sh", "/usr/local/bin/database-entrypoint.sh", "pgsql", "docker-entrypoint.sh"] ports: - target: 5432 published: "5432-5451" @@ -22,12 +22,12 @@ services: volumes: - ./volumes/mysql/init:/docker-entrypoint-initdb.d - ./volumes/mysql/data:/var/lib/mysql - - ./.docker/scripts/database-provider.sh:/usr/local/bin/database-provider.sh:ro + - ./.docker/scripts/database-entrypoint.sh:/usr/local/bin/database-entrypoint.sh:ro ports: - target: 3306 published: "3306-3325" host_ip: 127.0.0.1 - entrypoint: ["/bin/sh", "/usr/local/bin/database-provider.sh", "mysql", "docker-entrypoint.sh"] + entrypoint: ["/bin/sh", "/usr/local/bin/database-entrypoint.sh", "mysql", "docker-entrypoint.sh"] command: ["mysqld"] environment: - DB_HOST=${DB_HOST:-mysql} From 0b687ced3721d52ddc4026b4413e614759955474 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:40:51 -0300 Subject: [PATCH 14/29] chore: simplify README Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- README.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0a766c0..2ccea42 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,21 @@ # Nextcloud development environment -An development apps environment for Nextcloud. +A Docker Compose-based development environment for Nextcloud. -## Development environment +## Quick start -Run the command: +Start the basic environment with MySQL: ```bash -docker compose up nextcloud mysql nginx mailpit redis +docker compose up ``` -* [Advanced setup](docs/advanced-setup.md) - * [Environments](docs/advanced-setup.md#environments) - * [PHP custom settings](docs/advanced-setup.md#php-custom-settings) -* [App development](docs/apps-development.md) - * [Sample](docs/apps-development.md#samble) -* [FAQ](docs/faq.md) - * [Reset setup](docs/faq.md#reset-setup) - * [Upgrade to newest commits of server repository](docs/faq.md#upgrade-to-newest-commits-of-server-repository) - * [Using IDE](docs/faq.md#using-ide) - * [Fix permissions](docs/faq.md#fix-permissions) - * [Simplify commands with alias](docs/bash_aliases.md) \ No newline at end of file +For PostgreSQL, optional services, dynamic host ports, multiple environments, +and other advanced configuration, see the +[advanced setup guide](docs/advanced-setup.md). + +## More documentation + +- [Advanced setup](docs/advanced-setup.md) +- [App development](docs/apps-development.md) +- [FAQ](docs/faq.md) \ No newline at end of file From 79038b9d5babdfc6985625d8a660640b6a6d4e4d Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:54:56 -0300 Subject: [PATCH 15/29] feat: simplify to customize PHP ini files Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index ef4609e..7120138 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,7 @@ services: # dockerfile: Dockerfile.php${PHP_VERSION:-83} volumes: - ./.docker/scripts/wait-for-db.php:/var/www/scripts/wait-for-db.php + - ./volumes/php:/var/www/php-config - ~/.composer:/var/www/.composer/ - ~/.npm:/var/www/.npm/ - ./volumes/nextcloud:/var/www/html @@ -68,6 +69,7 @@ services: - VERSION_NEXTCLOUD=${VERSION_NEXTCLOUD:-master} - AUTOINSTALL=${AUTOINSTALL:-1} - XDEBUG_CONFIG + - PHP_INI_SCAN_DIR=/usr/local/etc/php/conf.d:/var/www/php-config extra_hosts: - host.docker.internal:host-gateway nginx: From f1e752f855376b735ba528b16ec6fc2f6dacc2f3 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:55:42 -0300 Subject: [PATCH 16/29] chore: update advanced setup with new instructions Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 115 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 5 deletions(-) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index 33cb725..aa98a4b 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -1,15 +1,120 @@ # Advanced setup -## Environments +## Environment variables -You can customize the environment before first run by changing environment entries. +The development environment can be customized through environment variables. -An `.env` file is optional. You can also set values inline, for example `VERSION_NEXTCLOUD=stable33 docker compose up`. +An `.env` file is optional. Variables can also be provided inline: -`VERSION_NEXTCLOUD` For this environment, the recommended branch is `master`. If you need to work with another Nextcloud server version, use the matching branch from the [Nextcloud server repository](https://github.com/nextcloud/server). +```bash +VERSION_NEXTCLOUD=stable33 docker compose up +```` + +By default, `VERSION_NEXTCLOUD` uses `master`. To use another Nextcloud version, set it to the corresponding branch from the [Nextcloud server repository](https://github.com/nextcloud/server). + +## Database + +MySQL is used by default: + +```bash +docker compose up +``` + +To use PostgreSQL: + +```bash +DB_HOST=pgsql docker compose up +``` + +## Optional services + +Optional services are enabled with Docker Compose profiles: + +```bash +docker compose --profile eurooffice up +docker compose --profile playwright up +docker compose --profile signal up +docker compose --profile whatsapp up +``` + +Multiple profiles can be enabled together: + +```bash +docker compose \ + --profile eurooffice \ + --profile playwright \ + up +``` + +## Multiple environments + +Multiple checkouts can run at the same time. + +Docker uses the standard host ports when they are available. If a port is already in use, another available port is selected automatically. + +Start each environment from its own directory: + +```bash +cd /path/to/first-checkout +docker compose up +``` + +```bash +cd /path/to/second-checkout +docker compose up +``` + +To see the ports assigned to an environment: + +```bash +docker compose ps +``` + +To check a specific port, use: + +```bash +docker compose port nginx 80 +``` + +For example, if it returns: + +```text +0.0.0.0:81 +``` + +access Nextcloud at: + +```text +http://localhost:81 +``` + +When port `80` is available, Nextcloud remains accessible normally at: + +```text +http://localhost +``` + +A specific host port can still be requested explicitly: + +```bash +HTTP_PORT=9000 docker compose up +``` ## PHP custom settings -Custom PHP settings have to be applied on [`.docker/app/config/php.ini`](/.docker/app/config/php.ini) file. +Custom PHP settings can be added as `.ini` files in `volumes/php/`. This directory is ignored by Git and is mounted into the PHP container without replacing the default configuration bundled in the image. + +For example, create `volumes/php/99-local.ini`: + +```ini +memory_limit=1024M +upload_max_filesize=512M +``` + +Restart the PHP service after changing these files: + +```bash +docker compose restart nextcloud +``` ⬅️ [Back to index](../README.md) From db0474c1b691f09af5b82eed8a82498439b4e174 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:21:22 -0300 Subject: [PATCH 17/29] chore: make possible to have only a database instance Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/database-services.yml | 32 ++++++++++++++++++ .docker/scripts/database-entrypoint.sh | 24 ------------- docker-compose.yml | 47 ++++++-------------------- 3 files changed, 42 insertions(+), 61 deletions(-) create mode 100644 .docker/database-services.yml delete mode 100644 .docker/scripts/database-entrypoint.sh diff --git a/.docker/database-services.yml b/.docker/database-services.yml new file mode 100644 index 0000000..eccc12c --- /dev/null +++ b/.docker/database-services.yml @@ -0,0 +1,32 @@ +services: + mysql: + # Pin to 8.4: mysql:latest currently resolves to 9.x, and Nextcloud autoinstall + # runs with the application user, which cannot read mysql.component there. + image: mysql:8.4 + volumes: + - ./volumes/mysql/init:/docker-entrypoint-initdb.d + - ./volumes/mysql/data:/var/lib/mysql + ports: + - target: 3306 + published: "3306-3325" + host_ip: 127.0.0.1 + command: ["mysqld"] + environment: + - TZ=${TZ:-CET} + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} + - MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud} + - MYSQL_USER=${MYSQL_USER:-nextcloud} + - MYSQL_PASSWORD=${MYSQL_PASSWORD:-nextcloud} + pgsql: + image: postgres:13-alpine + volumes: + - ./volumes/postgres/data:/var/lib/postgresql/data + ports: + - target: 5432 + published: "5432-5451" + host_ip: 127.0.0.1 + command: ["postgres", "-c", "log_statement=all"] + environment: + - POSTGRES_DB=${POSTGRES_DB:-nextcloud} + - POSTGRES_USER=${POSTGRES_USER:-nextcloud} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} \ No newline at end of file diff --git a/.docker/scripts/database-entrypoint.sh b/.docker/scripts/database-entrypoint.sh deleted file mode 100644 index 4dbbc7c..0000000 --- a/.docker/scripts/database-entrypoint.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -set -eu - -EXPECTED_HOST="$1" -shift - -CURRENT_HOST="${DB_HOST:-mysql}" - -if [ "$CURRENT_HOST" != "$EXPECTED_HOST" ]; then - case "$EXPECTED_HOST" in - mysql) DATABASE_NAME="MySQL" ;; - pgsql) DATABASE_NAME="PostgreSQL" ;; - esac - - echo - echo "$DATABASE_NAME disabled." - echo "Selected DB_HOST: $CURRENT_HOST." - echo "This is expected." - echo "Set DB_HOST=$EXPECTED_HOST to enable $DATABASE_NAME." - echo - exit 0 -fi - -exec "$@" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 7120138..02a36b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,41 +1,12 @@ services: - pgsql: - image: postgres:13-alpine - volumes: - - ./volumes/postgres/data:/var/lib/postgresql/data - - ./.docker/scripts/database-entrypoint.sh:/usr/local/bin/database-entrypoint.sh:ro - environment: - - DB_HOST=${DB_HOST:-mysql} - - POSTGRES_DB=${POSTGRES_DB:-nextcloud} - - POSTGRES_USER=${POSTGRES_USER:-nextcloud} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-nextcloud} - entrypoint: ["/bin/sh", "/usr/local/bin/database-entrypoint.sh", "pgsql", "docker-entrypoint.sh"] - ports: - - target: 5432 - published: "5432-5451" - host_ip: 127.0.0.1 - command: ["postgres", "-c", "log_statement=all"] - mysql: - # Pin to 8.4: mysql:latest currently resolves to 9.x, and Nextcloud autoinstall - # runs with the application user, which cannot read mysql.component there. - image: mysql:8.4 - volumes: - - ./volumes/mysql/init:/docker-entrypoint-initdb.d - - ./volumes/mysql/data:/var/lib/mysql - - ./.docker/scripts/database-entrypoint.sh:/usr/local/bin/database-entrypoint.sh:ro - ports: - - target: 3306 - published: "3306-3325" - host_ip: 127.0.0.1 - entrypoint: ["/bin/sh", "/usr/local/bin/database-entrypoint.sh", "mysql", "docker-entrypoint.sh"] - command: ["mysqld"] - environment: - - DB_HOST=${DB_HOST:-mysql} - - TZ=${TZ:-CET} - - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} - - MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud} - - MYSQL_USER=${MYSQL_USER:-nextcloud} - - MYSQL_PASSWORD=${MYSQL_PASSWORD:-nextcloud} + database: + extends: + file: .docker/database-services.yml + service: ${DB_HOST:-mysql} + networks: + default: + aliases: + - ${DB_HOST:-mysql} nextcloud: image: ghcr.io/librecodecoop/nextcloud-dev-php${PHP_VERSION:-83}:latest # build: @@ -48,6 +19,8 @@ services: - ~/.npm:/var/www/.npm/ - ./volumes/nextcloud:/var/www/html restart: unless-stopped + depends_on: + - database environment: - HOST_UID=${HOST_UID:-1000} - HOST_GID=${HOST_GID:-1000} From 0d356fb4acc9e2e266b759b0c3666bc2940441eb Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:29:52 -0300 Subject: [PATCH 18/29] fix: volume paths Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/database-services.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.docker/database-services.yml b/.docker/database-services.yml index eccc12c..ee9b213 100644 --- a/.docker/database-services.yml +++ b/.docker/database-services.yml @@ -4,8 +4,8 @@ services: # runs with the application user, which cannot read mysql.component there. image: mysql:8.4 volumes: - - ./volumes/mysql/init:/docker-entrypoint-initdb.d - - ./volumes/mysql/data:/var/lib/mysql + - ../volumes/mysql/init:/docker-entrypoint-initdb.d + - ../volumes/mysql/data:/var/lib/mysql ports: - target: 3306 published: "3306-3325" @@ -20,7 +20,7 @@ services: pgsql: image: postgres:13-alpine volumes: - - ./volumes/postgres/data:/var/lib/postgresql/data + - ../volumes/postgres/data:/var/lib/postgresql/data ports: - target: 5432 published: "5432-5451" From 79777026ac342bae702fa0fab823b9263e5bc312 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:33:26 -0300 Subject: [PATCH 19/29] feat: make the ip binding flexible Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/database-services.yml | 4 ++-- docker-compose.yml | 9 ++++++--- docs/advanced-setup.md | 10 +++++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.docker/database-services.yml b/.docker/database-services.yml index ee9b213..9170132 100644 --- a/.docker/database-services.yml +++ b/.docker/database-services.yml @@ -9,7 +9,7 @@ services: ports: - target: 3306 published: "3306-3325" - host_ip: 127.0.0.1 + host_ip: ${IP_BIND:-127.0.0.1} command: ["mysqld"] environment: - TZ=${TZ:-CET} @@ -24,7 +24,7 @@ services: ports: - target: 5432 published: "5432-5451" - host_ip: 127.0.0.1 + host_ip: ${IP_BIND:-127.0.0.1} command: ["postgres", "-c", "log_statement=all"] environment: - POSTGRES_DB=${POSTGRES_DB:-nextcloud} diff --git a/docker-compose.yml b/docker-compose.yml index 02a36b4..c83f560 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -60,14 +60,16 @@ services: ports: - target: 80 published: "${HTTP_PORT:-80-99}" + host_ip: ${IP_BIND:-127.0.0.1} - target: 443 published: "443-462" + host_ip: ${IP_BIND:-127.0.0.1} mailpit: image: axllent/mailpit ports: - target: 8025 published: "${MAILHOG_PORT:-8025-8044}" - host_ip: 127.0.0.1 + host_ip: ${IP_BIND:-127.0.0.1} redis: image: redis eurooffice: @@ -82,6 +84,7 @@ services: ports: - target: 80 published: "8080-8099" + host_ip: ${IP_BIND:-127.0.0.1} environment: - EXAMPLE_ENABLED=true - JWT_SECRET=${JWT_SECRET:-my_jwt_secret} @@ -100,7 +103,7 @@ services: ports: - target: 9323 published: "9323-9342" - host_ip: 127.0.0.1 + host_ip: ${IP_BIND:-127.0.0.1} environment: - PLAYWRIGHT_BASE_URL=${PLAYWRIGHT_BASE_URL:-https://nginx} - NODE_ENV=test @@ -119,7 +122,7 @@ services: ports: - target: 8080 published: "5001-5020" - host_ip: 127.0.0.1 + host_ip: ${IP_BIND:-127.0.0.1} volumes: - ./volumes/signal:/home/.local/share/signal-cli environment: diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index aa98a4b..f1b6a91 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -97,9 +97,17 @@ http://localhost A specific host port can still be requested explicitly: ```bash -HTTP_PORT=9000 docker compose up +HTTP_PORT=9000 HTTPS_PORT=9443 docker compose up ``` +By default, published services bind to `127.0.0.1`. To expose them on other host interfaces, set: + +```bash +IP_BIND=0.0.0.0 docker compose up +``` + +HTTP and HTTPS use automatic ranges beginning at ports `80` and `443` when no override is provided. The example above forces `host:9000 -> container:80` and `host:9443 -> container:443`. + ## PHP custom settings Custom PHP settings can be added as `.ini` files in `volumes/php/`. This directory is ignored by Git and is mounted into the PHP container without replacing the default configuration bundled in the image. From 26896f58af6e8277a8c3041de9ec4b544d3be057 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:33:58 -0300 Subject: [PATCH 20/29] feat: make https port configurable Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index c83f560..3e17bbc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -62,7 +62,7 @@ services: published: "${HTTP_PORT:-80-99}" host_ip: ${IP_BIND:-127.0.0.1} - target: 443 - published: "443-462" + published: "${HTTPS_PORT:-443-462}" host_ip: ${IP_BIND:-127.0.0.1} mailpit: image: axllent/mailpit From 8d8378ff6fb253c4ad0811b14c90f2b5a9b9ef52 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:34:36 -0300 Subject: [PATCH 21/29] fix: markdown code block Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index f1b6a91..1819e1b 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -8,7 +8,7 @@ An `.env` file is optional. Variables can also be provided inline: ```bash VERSION_NEXTCLOUD=stable33 docker compose up -```` +``` By default, `VERSION_NEXTCLOUD` uses `master`. To use another Nextcloud version, set it to the corresponding branch from the [Nextcloud server repository](https://github.com/nextcloud/server). From 39463cb5e14ed89d080731c6c0abfd1996f26648 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:34:47 -0300 Subject: [PATCH 22/29] chore: list available databases Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index 1819e1b..e06a998 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -20,6 +20,11 @@ MySQL is used by default: docker compose up ``` +The supported `DB_HOST` values are: + +- `mysql` +- `pgsql` + To use PostgreSQL: ```bash From 7800c7571b22d4323281fa0e5261e1dbbf8fd71b Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:38:45 -0300 Subject: [PATCH 23/29] fix: small changes Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index e06a998..ac5f4c8 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -84,7 +84,7 @@ docker compose port nginx 80 For example, if it returns: ```text -0.0.0.0:81 +127.0.0.1:81 ``` access Nextcloud at: @@ -105,12 +105,14 @@ A specific host port can still be requested explicitly: HTTP_PORT=9000 HTTPS_PORT=9443 docker compose up ``` -By default, published services bind to `127.0.0.1`. To expose them on other host interfaces, set: +By default, published services bind to `127.0.0.1` and are accessible only from the local host. To expose them on other network interfaces, set: ```bash IP_BIND=0.0.0.0 docker compose up ``` +This can make the development services accessible to other hosts on the network, subject to the host firewall and network configuration. + HTTP and HTTPS use automatic ranges beginning at ports `80` and `443` when no override is provided. The example above forces `host:9000 -> container:80` and `host:9443 -> container:443`. ## PHP custom settings From 9fb7de7cccfbb1d470daf9e95cb9b51e426cd125 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 18:39:08 -0300 Subject: [PATCH 24/29] feat: add WARNING to development environment Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2ccea42..7ff5290 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ A Docker Compose-based development environment for Nextcloud. +> [!WARNING] +> This environment is intended for development only. It uses default credentials and insecure development settings and must not be used in production. + ## Quick start Start the basic environment with MySQL: From 603277a0f748c1ee56882130ae5bd9c2add99173 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:02:55 -0300 Subject: [PATCH 25/29] feat(php): allow native Xdebug mode selection Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .docker/config/php/xdebug.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/.docker/config/php/xdebug.ini b/.docker/config/php/xdebug.ini index 3a6d1d3..5e31f73 100644 --- a/.docker/config/php/xdebug.ini +++ b/.docker/config/php/xdebug.ini @@ -1,5 +1,4 @@ xdebug.client_host=host.docker.internal xdebug.discover_client_host=true xdebug.log_level=0 -xdebug.mode=debug xdebug.start_with_request=yes From 3b4d81e261e416935bfd2c6d9e10be750ddfb207 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:02:55 -0300 Subject: [PATCH 26/29] feat(compose): expose native XDEBUG_MODE Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 3e17bbc..e6af1f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,6 +42,7 @@ services: - VERSION_NEXTCLOUD=${VERSION_NEXTCLOUD:-master} - AUTOINSTALL=${AUTOINSTALL:-1} - XDEBUG_CONFIG + - XDEBUG_MODE - PHP_INI_SCAN_DIR=/usr/local/etc/php/conf.d:/var/www/php-config extra_hosts: - host.docker.internal:host-gateway From b24eaec527c960a9e646bd5b3034f0280ad0b08a Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:02:55 -0300 Subject: [PATCH 27/29] docs(advanced): document XDEBUG_MODE Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- docs/advanced-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index ac5f4c8..797e690 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -12,6 +12,14 @@ VERSION_NEXTCLOUD=stable33 docker compose up By default, `VERSION_NEXTCLOUD` uses `master`. To use another Nextcloud version, set it to the corresponding branch from the [Nextcloud server repository](https://github.com/nextcloud/server). +Xdebug can be configured with its native `XDEBUG_MODE` variable: + +```bash +XDEBUG_MODE=debug docker compose up +XDEBUG_MODE=develop,debug docker compose up +XDEBUG_MODE=coverage docker compose up +``` + ## Database MySQL is used by default: From 98645ce2cf7c6022233ec0233eceaf56962fa713 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:02:55 -0300 Subject: [PATCH 28/29] ci(compose): validate Compose configurations Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .github/workflows/docker-compose-config.yml | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/workflows/docker-compose-config.yml diff --git a/.github/workflows/docker-compose-config.yml b/.github/workflows/docker-compose-config.yml new file mode 100644 index 0000000..f2f74c4 --- /dev/null +++ b/.github/workflows/docker-compose-config.yml @@ -0,0 +1,71 @@ +name: Docker Compose config + +on: + pull_request: + paths: + - docker-compose.yml + - .docker/database-services.yml + - docs/advanced-setup.md + - .github/workflows/docker-compose-config.yml + push: + branches: + - main + paths: + - docker-compose.yml + - .docker/database-services.yml + - docs/advanced-setup.md + - .github/workflows/docker-compose-config.yml + +jobs: + validate: + name: Validate Docker Compose config + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Validate default Compose configuration + run: | + set -eu + docker compose config --format json > /tmp/compose-default.json + jq -e ' + .services.database.image == "mysql:8.4" and + .services.nextcloud.environment.DB_HOST == "mysql" and + (.services.nextcloud.depends_on | has("database")) and + (.services.database.ports | all(.host_ip == "127.0.0.1")) and + (.services.nginx.ports | all(.host_ip == "127.0.0.1")) and + (.services.mailpit.ports | all(.host_ip == "127.0.0.1")) and + (.services.nginx.ports | any(.target == 80 and .published == "80-99")) and + (.services.nginx.ports | any(.target == 443 and .published == "443-462")) + ' /tmp/compose-default.json + + - name: Validate PostgreSQL configuration + run: | + set -eu + DB_HOST=pgsql docker compose config --format json > /tmp/compose-pgsql.json + jq -e ' + .services.database.image == "postgres:13-alpine" and + .services.nextcloud.environment.DB_HOST == "pgsql" and + (.services.nextcloud.depends_on | has("database")) and + (.services | has("mysql") | not) and + (.services | has("pgsql") | not) + ' /tmp/compose-pgsql.json + + - name: Validate port overrides + run: | + set -eu + HTTP_PORT=9000 HTTPS_PORT=9443 docker compose config --format json > /tmp/compose-overrides.json + jq -e ' + (.services.nginx.ports | any(.target == 80 and .published == "9000" and .host_ip == "127.0.0.1")) and + (.services.nginx.ports | any(.target == 443 and .published == "9443" and .host_ip == "127.0.0.1")) + ' /tmp/compose-overrides.json + + - name: Validate profiles and network binding override + run: | + set -eu + IP_BIND=0.0.0.0 docker compose --profile playwright --profile eurooffice config --format json > /tmp/compose-profiles.json + jq -e ' + (.services | has("playwright")) and + (.services | has("eurooffice")) and + (.services.database.ports | all(.host_ip == "0.0.0.0")) and + (.services.nginx.ports | all(.host_ip == "0.0.0.0")) + ' /tmp/compose-profiles.json From 90411893c312a67cade2bfd40910679a1f8321ce Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:04:34 -0300 Subject: [PATCH 29/29] ci: remove redundant Compose validation workflow Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .github/workflows/docker-compose-config.yml | 71 --------------------- 1 file changed, 71 deletions(-) delete mode 100644 .github/workflows/docker-compose-config.yml diff --git a/.github/workflows/docker-compose-config.yml b/.github/workflows/docker-compose-config.yml deleted file mode 100644 index f2f74c4..0000000 --- a/.github/workflows/docker-compose-config.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Docker Compose config - -on: - pull_request: - paths: - - docker-compose.yml - - .docker/database-services.yml - - docs/advanced-setup.md - - .github/workflows/docker-compose-config.yml - push: - branches: - - main - paths: - - docker-compose.yml - - .docker/database-services.yml - - docs/advanced-setup.md - - .github/workflows/docker-compose-config.yml - -jobs: - validate: - name: Validate Docker Compose config - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - - name: Validate default Compose configuration - run: | - set -eu - docker compose config --format json > /tmp/compose-default.json - jq -e ' - .services.database.image == "mysql:8.4" and - .services.nextcloud.environment.DB_HOST == "mysql" and - (.services.nextcloud.depends_on | has("database")) and - (.services.database.ports | all(.host_ip == "127.0.0.1")) and - (.services.nginx.ports | all(.host_ip == "127.0.0.1")) and - (.services.mailpit.ports | all(.host_ip == "127.0.0.1")) and - (.services.nginx.ports | any(.target == 80 and .published == "80-99")) and - (.services.nginx.ports | any(.target == 443 and .published == "443-462")) - ' /tmp/compose-default.json - - - name: Validate PostgreSQL configuration - run: | - set -eu - DB_HOST=pgsql docker compose config --format json > /tmp/compose-pgsql.json - jq -e ' - .services.database.image == "postgres:13-alpine" and - .services.nextcloud.environment.DB_HOST == "pgsql" and - (.services.nextcloud.depends_on | has("database")) and - (.services | has("mysql") | not) and - (.services | has("pgsql") | not) - ' /tmp/compose-pgsql.json - - - name: Validate port overrides - run: | - set -eu - HTTP_PORT=9000 HTTPS_PORT=9443 docker compose config --format json > /tmp/compose-overrides.json - jq -e ' - (.services.nginx.ports | any(.target == 80 and .published == "9000" and .host_ip == "127.0.0.1")) and - (.services.nginx.ports | any(.target == 443 and .published == "9443" and .host_ip == "127.0.0.1")) - ' /tmp/compose-overrides.json - - - name: Validate profiles and network binding override - run: | - set -eu - IP_BIND=0.0.0.0 docker compose --profile playwright --profile eurooffice config --format json > /tmp/compose-profiles.json - jq -e ' - (.services | has("playwright")) and - (.services | has("eurooffice")) and - (.services.database.ports | all(.host_ip == "0.0.0.0")) and - (.services.nginx.ports | all(.host_ip == "0.0.0.0")) - ' /tmp/compose-profiles.json