diff --git a/.docker/cli.dockerfile b/.docker/cli.dockerfile index 9620eb360..cfd19bdc0 100644 --- a/.docker/cli.dockerfile +++ b/.docker/cli.dockerfile @@ -21,6 +21,15 @@ ARG WEBROOT=web ARG GITHUB_TOKEN="" ENV GITHUB_TOKEN=${GITHUB_TOKEN} +ARG DRUPAL_PUBLIC_FILES="/app/${WEBROOT}/sites/default/files" +ENV DRUPAL_PUBLIC_FILES=${DRUPAL_PUBLIC_FILES} + +ARG DRUPAL_PRIVATE_FILES="/app/${WEBROOT}/sites/default/files/private" +ENV DRUPAL_PRIVATE_FILES=${DRUPAL_PRIVATE_FILES} + +ARG DRUPAL_TEMPORARY_FILES="${TMP:-/tmp}" +ENV DRUPAL_TEMPORARY_FILES=${DRUPAL_TEMPORARY_FILES} + # Set default values for environment variables. # These values will be overridden if set in docker-compose.yml or .env file # during build stage. @@ -85,8 +94,9 @@ RUN npm --prefix /app/${WEBROOT}/themes/custom/your_site_theme ci --no-audit --n # overridden. COPY . /app -# Create files directory and set correct permissions. -RUN mkdir -p /app/${WEBROOT}/sites/default/files && chmod 0770 /app/${WEBROOT}/sites/default/files +# Create files directories and set correct permissions. +RUN mkdir -p "${DRUPAL_PUBLIC_FILES}" "${DRUPAL_PRIVATE_FILES}" "${DRUPAL_TEMPORARY_FILES}" && \ + chmod 0770 "${DRUPAL_PUBLIC_FILES}" "${DRUPAL_PRIVATE_FILES}" "${DRUPAL_TEMPORARY_FILES}" # Compile front-end assets. Running this after copying all files as we need # sources to compile assets. diff --git a/.scaffold/docs/.utils/variables/extra/.env.variables.sh b/.scaffold/docs/.utils/variables/extra/.env.variables.sh index 8d646c27d..5090321cf 100755 --- a/.scaffold/docs/.utils/variables/extra/.env.variables.sh +++ b/.scaffold/docs/.utils/variables/extra/.env.variables.sh @@ -49,3 +49,12 @@ DREVOPS_COMPOSER_VERBOSE=1 # Print output from NPM install. DREVOPS_NPM_VERBOSE=0 + +# Path to public files. +DRUPAL_PUBLIC_FILES="${DRUPAL_PUBLIC_FILES:-./${DREVOPS_WEBROOT}/sites/default/files}" + +# Path to private files. +DRUPAL_PRIVATE_FILES="${DRUPAL_PRIVATE_FILES:-${DRUPAL_PUBLIC_FILES}/private}" + +# Path to temporary files. +DRUPAL_TEMPORARY_FILES="${DRUPAL_TEMPORARY_FILES:-${DRUPAL_PRIVATE_FILES}/tmp}" diff --git a/.scaffold/docs/content/workflows/variables.mdx b/.scaffold/docs/content/workflows/variables.mdx index d7e2f128e..492b8a096 100644 --- a/.scaffold/docs/content/workflows/variables.mdx +++ b/.scaffold/docs/content/workflows/variables.mdx @@ -769,14 +769,6 @@ Default value: `./config/default` Defined in: `scripts/drevops/provision.sh` -### `DREVOPS_DRUPAL_PRIVATE_FILES` - -Path to private files. - -Default value: `./${DREVOPS_WEBROOT}/sites/default/files/private` - -Defined in: `scripts/drevops/provision.sh` - ### `DREVOPS_EXPORT_CODE_DIR` Directory to store exported code. @@ -1636,6 +1628,14 @@ Default value: `UNDEFINED` Defined in: `ENVIRONMENT` +### `DRUPAL_PRIVATE_FILES` + +Path to private files. + +Default value: `${DRUPAL_PUBLIC_FILES}/private` + +Defined in: `.env` + ### `DRUPAL_PROFILE` Drupal profile name (used only when installing from profile). @@ -1644,6 +1644,14 @@ Default value: `standard` Defined in: `.env`, `scripts/drevops/provision.sh` +### `DRUPAL_PUBLIC_FILES` + +Path to public files. + +Default value: `./${DREVOPS_WEBROOT}/sites/default/files` + +Defined in: `.env` + ### `DRUPAL_REDIS_ENABLED` Enable Redis integration.
See settings.redis.php for details. @@ -1684,6 +1692,14 @@ Default value: `https://www.your-site-url.example/` Defined in: `.env` +### `DRUPAL_TEMPORARY_FILES` + +Path to temporary files. + +Default value: `${DRUPAL_PRIVATE_FILES}/tmp` + +Defined in: `.env` + ### `DRUPAL_THEME` Drupal theme name. diff --git a/.scaffold/tests/bats/fixtures/docker-compose.env.json b/.scaffold/tests/bats/fixtures/docker-compose.env.json index 39fa6bc97..44b66c3bc 100644 --- a/.scaffold/tests/bats/fixtures/docker-compose.env.json +++ b/.scaffold/tests/bats/fixtures/docker-compose.env.json @@ -24,9 +24,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -67,9 +70,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -112,9 +118,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -164,9 +173,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -197,6 +209,9 @@ "build": { "args": { "CLI_IMAGE": "star_wars", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", + "DRUPAL_TEMPORARY_FILES": "/tmp", "WEBROOT": "web" }, "context": "FIXTURE_CUR_DIR", @@ -213,9 +228,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -272,9 +290,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -341,9 +362,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", diff --git a/.scaffold/tests/bats/fixtures/docker-compose.env_local.json b/.scaffold/tests/bats/fixtures/docker-compose.env_local.json index 39fa6bc97..44b66c3bc 100644 --- a/.scaffold/tests/bats/fixtures/docker-compose.env_local.json +++ b/.scaffold/tests/bats/fixtures/docker-compose.env_local.json @@ -24,9 +24,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -67,9 +70,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -112,9 +118,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -164,9 +173,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -197,6 +209,9 @@ "build": { "args": { "CLI_IMAGE": "star_wars", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", + "DRUPAL_TEMPORARY_FILES": "/tmp", "WEBROOT": "web" }, "context": "FIXTURE_CUR_DIR", @@ -213,9 +228,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -272,9 +290,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -341,9 +362,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "0", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", diff --git a/.scaffold/tests/bats/fixtures/docker-compose.env_mod.json b/.scaffold/tests/bats/fixtures/docker-compose.env_mod.json index cb393ea30..f573e045c 100644 --- a/.scaffold/tests/bats/fixtures/docker-compose.env_mod.json +++ b/.scaffold/tests/bats/fixtures/docker-compose.env_mod.json @@ -24,9 +24,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -67,9 +70,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -112,9 +118,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -164,9 +173,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -197,6 +209,9 @@ "build": { "args": { "CLI_IMAGE": "the_matrix", + "DRUPAL_PRIVATE_FILES": "/app/docroot/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/docroot/sites/default/files", + "DRUPAL_TEMPORARY_FILES": "/tmp", "WEBROOT": "docroot" }, "context": "FIXTURE_CUR_DIR", @@ -213,9 +228,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -272,9 +290,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -341,9 +362,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "the_matrix.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "1", "DRUPAL_SHIELD_PASS": "passw", "DRUPAL_SHIELD_USER": "jane", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "development", "LAGOON_ROUTE": "the_matrix.docker.amazee.io", "MARIADB_DATABASE": "drupal", diff --git a/.scaffold/tests/bats/fixtures/docker-compose.noenv.json b/.scaffold/tests/bats/fixtures/docker-compose.noenv.json index e5b147db6..74016b8f5 100644 --- a/.scaffold/tests/bats/fixtures/docker-compose.noenv.json +++ b/.scaffold/tests/bats/fixtures/docker-compose.noenv.json @@ -24,9 +24,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -67,9 +70,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -112,9 +118,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -164,9 +173,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -197,6 +209,9 @@ "build": { "args": { "CLI_IMAGE": "star_wars", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", + "DRUPAL_TEMPORARY_FILES": "/tmp", "WEBROOT": "web" }, "context": "FIXTURE_CUR_DIR", @@ -213,9 +228,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -272,9 +290,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", @@ -341,9 +362,12 @@ "environment": { "CI": "true", "DREVOPS_LOCALDEV_URL": "star_wars.docker.amazee.io", + "DRUPAL_PRIVATE_FILES": "/app/web/sites/default/files/private", + "DRUPAL_PUBLIC_FILES": "/app/web/sites/default/files", "DRUPAL_REDIS_ENABLED": "", "DRUPAL_SHIELD_PASS": "", "DRUPAL_SHIELD_USER": "", + "DRUPAL_TEMPORARY_FILES": "/tmp", "LAGOON_ENVIRONMENT_TYPE": "local", "LAGOON_ROUTE": "star_wars.docker.amazee.io", "MARIADB_DATABASE": "drupal", diff --git a/.scaffold/tests/bats/provision.bats b/.scaffold/tests/bats/provision.bats index b24986fb5..3c9d3e50a 100644 --- a/.scaffold/tests/bats/provision.bats +++ b/.scaffold/tests/bats/provision.bats @@ -6,6 +6,10 @@ load _helper.bash +export DRUPAL_PUBLIC_FILES="./web/sites/default/files" +export DRUPAL_PRIVATE_FILES="./web/sites/default/files/private" +export DRUPAL_TEMPORARY_FILES="/tmp" + assert_provision_info() { local webroot="${8:-web}" @@ -16,7 +20,9 @@ assert_provision_info() { assert_output_contains "Started site provisioning." assert_output_contains "Webroot dir : ${webroot}" assert_output_contains "Profile : standard" + assert_output_contains "Public files directory : ./${webroot}/sites/default/files" assert_output_contains "Private files directory : ./${webroot}/sites/default/files/private" + assert_output_contains "Temporary files directory : /tmp" assert_output_contains "Config path : ./config/default" assert_output_contains "DB dump file path : ./.data/db.sql" @@ -52,10 +58,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # fail" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "Provisioning site from the database dump file." "Dump file path: ./.data/db.sql" @@ -176,10 +178,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # Successful" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "Provisioning site from the database dump file." "Dump file path: ./.data/db.sql" @@ -297,10 +295,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # Successful" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "Provisioning site from the database dump file." "Dump file path: ./.data/db.sql" @@ -426,10 +420,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # fail" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "Provisioning site from the database dump file." "Dump file path: ./.data/db.sql" @@ -555,10 +545,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # fail" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "- Provisioning site from the database dump file." "- Dump file path: ./.data/db.sql" @@ -682,10 +668,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # Successful" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "- Provisioning site from the database dump file." "- Dump file path: ./.data/db.sql" @@ -804,10 +786,6 @@ assert_provision_info() { "@drush -y status --field=drupal-version # mocked_core_version" "@drush -y status --fields=bootstrap # Successful" - # Private files directory. - "Creating private files directory." - "Created private files directory." - # Site provisioning information. "- Provisioning site from the database dump file." "- Dump file path: ./.data/db.sql" diff --git a/docker-compose.yml b/docker-compose.yml index f9b2966c3..f6e9ab825 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ x-volumes: &default-volumes volumes: # All application files mounted into container. - .:/app:${VOLUME_FLAGS:-delegated} ### Local overrides to mount host filesystem. Automatically removed in CI and PROD. - # Override mount for files to allow different type of syncing to optimise performance. + # Override mount for files to allow different type of syncing for optimised performance. - ./web/sites/default/files:/app/web/sites/default/files:${VOLUME_FLAGS:-delegated} ### Local overrides to mount host filesystem. Automatically removed in CI and PROD. # Use the same volumes in environments without host mounts support. ##- app:/app # Override for environment without host mounts. Automatically uncommented in CI. @@ -62,6 +62,10 @@ x-environment: &default-environment CI: ${CI:-} # Forward emails to Mailhog locally. SSMTP_MAILHUB: ${SSMTP_MAILHUB:-host.docker.internal:1025} + # Drupal file paths. + DRUPAL_PUBLIC_FILES: ${DRUPAL_PUBLIC_FILES:-/app/web/sites/default/files} + DRUPAL_PRIVATE_FILES: ${DRUPAL_PRIVATE_FILES:-/app/web/sites/default/files/private} + DRUPAL_TEMPORARY_FILES: ${DRUPAL_TEMPORARY_FILES:-/tmp} # Drupal Shield credentials. DRUPAL_SHIELD_USER: ${DRUPAL_SHIELD_USER:-} DRUPAL_SHIELD_PASS: ${DRUPAL_SHIELD_PASS:-} @@ -87,6 +91,7 @@ services: args: WEBROOT: "${DREVOPS_WEBROOT:-web}" GITHUB_TOKEN: "${GITHUB_TOKEN:-}" + image: &cli-image ${COMPOSE_PROJECT_NAME:-example_site} user: root <<: *default-volumes @@ -109,6 +114,9 @@ services: args: CLI_IMAGE: *cli-image WEBROOT: "${DREVOPS_WEBROOT:-web}" + DRUPAL_PUBLIC_FILES: ${DRUPAL_PUBLIC_FILES:-/app/${DREVOPS_WEBROOT:-web}/sites/default/files} + DRUPAL_PRIVATE_FILES: ${DRUPAL_PRIVATE_FILES:-/app/${DREVOPS_WEBROOT:-web}/sites/default/files/private} + DRUPAL_TEMPORARY_FILES: ${DRUPAL_TEMPORARY_FILES:-/tmp} <<: [*default-volumes, *default-user] environment: <<: *default-environment diff --git a/scripts/drevops/provision.sh b/scripts/drevops/provision.sh index 2d6094ad7..f5560e037 100755 --- a/scripts/drevops/provision.sh +++ b/scripts/drevops/provision.sh @@ -53,9 +53,6 @@ DRUPAL_PROFILE="${DRUPAL_PROFILE:-standard}" # Path to configuration directory. DREVOPS_DRUPAL_CONFIG_PATH="${DREVOPS_DRUPAL_CONFIG_PATH:-./config/default}" -# Path to private files. -DREVOPS_DRUPAL_PRIVATE_FILES="${DREVOPS_DRUPAL_PRIVATE_FILES:-./${DREVOPS_WEBROOT}/sites/default/files/private}" - # Directory with database dump file. DREVOPS_DB_DIR="${DREVOPS_DB_DIR:-./.data}" @@ -92,7 +89,9 @@ site_is_installed="$(drush status --fields=bootstrap | grep -q "Successful" && e echo note "Webroot dir : ${DREVOPS_WEBROOT}" note "Profile : ${DRUPAL_PROFILE}" -note "Private files directory : ${DREVOPS_DRUPAL_PRIVATE_FILES}" +note "Public files directory : ${DRUPAL_PUBLIC_FILES-}" +note "Private files directory : ${DRUPAL_PRIVATE_FILES-}" +note "Temporary files directory : ${DRUPAL_TEMPORARY_FILES-}" note "Config path : ${DREVOPS_DRUPAL_CONFIG_PATH}" note "DB dump file path : ${DREVOPS_DB_DIR}/${DREVOPS_DB_FILE} ($([ -f "${DREVOPS_DB_DIR}/${DREVOPS_DB_FILE}" ] && echo "present" || echo "absent"))" if [ -n "${DREVOPS_DB_IMAGE:-}" ]; then @@ -158,21 +157,6 @@ provision_from_profile() { pass "Installed a site from the profile." } -if [ -n "${DREVOPS_DRUPAL_PRIVATE_FILES}" ]; then - info "Creating private files directory." - if [ -d "${DREVOPS_DRUPAL_PRIVATE_FILES}" ]; then - pass "Private files directory already exists." - else - mkdir -p "${DREVOPS_DRUPAL_PRIVATE_FILES}" - if [ -d "${DREVOPS_DRUPAL_PRIVATE_FILES}" ]; then - pass "Created private files directory." - else - fail "Unable to create private files directory." - exit 1 - fi - fi -fi - # Provision site from DB dump or profile. # # The code block below has explicit if-else conditions and verbose output to diff --git a/tests/phpunit/Drupal/EnvironmentSettingsTest.php b/tests/phpunit/Drupal/EnvironmentSettingsTest.php index 33cdef063..fddf41dea 100644 --- a/tests/phpunit/Drupal/EnvironmentSettingsTest.php +++ b/tests/phpunit/Drupal/EnvironmentSettingsTest.php @@ -258,7 +258,7 @@ public function testEnvironmentGeneric(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_SUT; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -302,7 +302,7 @@ public function testEnvironmentLocal(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_LOCAL; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -346,7 +346,7 @@ public function testEnvironmentCi(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_CI; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -393,7 +393,7 @@ public function testEnvironmentAcquiaDynamic(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_DEV; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -434,7 +434,7 @@ public function testEnvironmentAcquiaDev(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_DEV; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -475,7 +475,7 @@ public function testEnvironmentAcquiaTest(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_TEST; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -514,7 +514,7 @@ public function testEnvironmentAcquiaProd(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_PROD; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -561,7 +561,7 @@ public function testEnvironmentLagoonDynamic(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_DEV; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -612,7 +612,7 @@ public function testEnvironmentLagoonDev(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_DEV; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -663,7 +663,7 @@ public function testEnvironmentLagoonTest(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_TEST; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', @@ -713,7 +713,7 @@ public function testEnvironmentLagoonProd(): void { $settings['container_yamls'][0] = $this->app_root . '/' . $this->site_path . '/services.yml'; $settings['entity_update_batch_size'] = 50; $settings['environment'] = static::ENVIRONMENT_PROD; - $settings['file_private_path'] = 'sites/default/files/private'; + $settings['file_private_path'] = static::PRIVATE_PATH_TESTING; $settings['file_scan_ignore_directories'] = [ 'node_modules', 'bower_components', diff --git a/tests/phpunit/Drupal/SettingsTestCase.php b/tests/phpunit/Drupal/SettingsTestCase.php index 6072aaf43..41b5ae065 100644 --- a/tests/phpunit/Drupal/SettingsTestCase.php +++ b/tests/phpunit/Drupal/SettingsTestCase.php @@ -54,6 +54,11 @@ abstract class SettingsTestCase extends TestCase { */ final const TMP_PATH_TESTING = '/tmp-test'; + /** + * Defines a constant for the private path used in testing. + */ + final const PRIVATE_PATH_TESTING = '/private-test'; + /** * Application root. * @@ -122,7 +127,8 @@ protected function setEnvVars(array $vars): void { $vars['LAGOON'] = FALSE; } - $vars['TMP'] = static::TMP_PATH_TESTING; + $vars['DRUPAL_TEMPORARY_FILES'] = static::TMP_PATH_TESTING; + $vars['DRUPAL_PRIVATE_FILES'] = static::PRIVATE_PATH_TESTING; // Filtered real vars without a value to unset them in the lines below. $vars_real = self::getRealEnvVarsFilteredNoValues([ diff --git a/web/sites/default/settings.php b/web/sites/default/settings.php index 548a46d0b..8cf777a48 100644 --- a/web/sites/default/settings.php +++ b/web/sites/default/settings.php @@ -60,13 +60,11 @@ // Location of the site configuration files. $settings['config_sync_directory'] = '../config/default'; -// Temporary directory. -if (getenv('TMP')) { - $settings['file_temp_path'] = getenv('TMP'); -} - // Private directory. -$settings['file_private_path'] = 'sites/default/files/private'; +$settings['file_private_path'] = getenv('DRUPAL_PRIVATE_FILES') ?: 'sites/default/files/private'; + +// Temporary directory. +$settings['file_temp_path'] = getenv('DRUPAL_TEMPORARY_FILES') ?: '/tmp'; // Base salt on the DB host name. $settings['hash_salt'] = hash('sha256', getenv('MARIADB_HOST') ?: 'localhost');