├── src ├── web │ ├── themes │ │ └── .gitkeep │ ├── modules │ │ └── .gitkeep │ ├── profiles │ │ └── .gitkeep │ ├── sites │ │ ├── default │ │ │ ├── services.yml │ │ │ ├── default.services.yml │ │ │ └── default.settings.php │ │ ├── development.services.yml │ │ ├── example.sites.php │ │ └── example.settings.local.php │ ├── .eslintrc.json │ ├── .eslintignore │ ├── .editorconfig │ ├── autoload.php │ ├── index.php │ ├── update.php │ ├── .csslintrc │ ├── robots.txt │ ├── .gitattributes │ ├── web.config │ └── .htaccess ├── drush │ ├── README.md │ └── policy.drush.inc ├── phpunit.xml.dist ├── composer.json ├── scripts │ └── composer │ │ └── ScriptHandler.php ├── README.md └── LICENSE ├── conf ├── dev.services.yml ├── certbot.nginx.vh.conf ├── dev.nginx.conf ├── dev.settings.php └── dev.nginx.vh.default.conf ├── .dockerignore ├── .gitignore ├── .travis.yml ├── Dockerfile ├── docker-compose.yml └── README.md /src/web/themes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/web/modules/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/web/profiles/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/web/sites/default/services.yml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/web/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./core/.eslintrc.json" 3 | } 4 | -------------------------------------------------------------------------------- /conf/dev.services.yml: -------------------------------------------------------------------------------- 1 | # Overwrites for web/sites/default/default.services.yml 2 | -------------------------------------------------------------------------------- /src/drush/README.md: -------------------------------------------------------------------------------- 1 | This directory contains commands, configuration and site aliases for Drush. See https://packagist.org/search/?type=drupal-drush for a directory of Drush commands installable via Composer. 2 | -------------------------------------------------------------------------------- /conf/certbot.nginx.vh.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | listen [::]:80 default_server; 4 | 5 | location ^~ /.well-known { 6 | allow all; 7 | root /data/letsencrypt/; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/web/.eslintignore: -------------------------------------------------------------------------------- 1 | core/assets/vendor/**/* 2 | core/modules/locale/tests/locale_test.js 3 | vendor/**/* 4 | sites/**/files/**/* 5 | libraries/**/* 6 | sites/**/libraries/**/* 7 | profiles/**/libraries/**/* 8 | **/js_test_files/**/* 9 | **/node_modules/**/* 10 | -------------------------------------------------------------------------------- /src/web/sites/development.services.yml: -------------------------------------------------------------------------------- 1 | # Local development services. 2 | # 3 | # To activate this feature, follow the instructions at the top of the 4 | # 'example.settings.local.php' file, which sits next to this file. 5 | parameters: 6 | http.response.debug_cacheability_headers: true 7 | services: 8 | cache.backend.null: 9 | class: Drupal\Core\Cache\NullBackendFactory 10 | -------------------------------------------------------------------------------- /src/web/.editorconfig: -------------------------------------------------------------------------------- 1 | # Drupal editor configuration normalization 2 | # @see http://editorconfig.org/ 3 | 4 | # This is the top-most .editorconfig file; do not search in parent directories. 5 | root = true 6 | 7 | # All files. 8 | [*] 9 | end_of_line = LF 10 | indent_style = space 11 | indent_size = 2 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [composer.json] 17 | indent_size = 4 18 | -------------------------------------------------------------------------------- /src/web/autoload.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | ./test/ 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | src/vendor/ 2 | src/web/sites/default/files/* 3 | src/web/sites/default/settings.php 4 | .DS_Store 5 | 6 | src/drush/contrib/ 7 | src/vendor/ 8 | src/web/core/ 9 | src/web/modules/contrib/ 10 | src/web/themes/contrib/ 11 | src/web/profiles/contrib/ 12 | src/web/libraries/ 13 | 14 | # Ignore sensitive information 15 | src/web/sites/*/settings.php 16 | src/web/sites/*/settings.local.php 17 | 18 | # Ignore Drupal's file directory 19 | src/web/sites/*/files/ 20 | 21 | # Ignore SimpleTest multi-site environment. 22 | src/web/sites/simpletest 23 | 24 | conf/prod.* 25 | conf/staging.* 26 | -------------------------------------------------------------------------------- /src/web/index.php: -------------------------------------------------------------------------------- 1 | handle($request); 20 | $response->send(); 21 | 22 | $kernel->terminate($request, $response); 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore directories generated by Composer 2 | src/drush/contrib/ 3 | src/vendor/ 4 | src/web/core/ 5 | src/web/modules/contrib/ 6 | src/web/themes/contrib/ 7 | src/web/profiles/contrib/ 8 | src/web/libraries/ 9 | 10 | # Ignore sensitive information 11 | src/web/sites/*/settings.php 12 | src/web/sites/*/settings.local.php 13 | 14 | # Ignore Drupal's file directory 15 | src/web/sites/*/files/ 16 | 17 | # Ignore SimpleTest multi-site environment. 18 | src/web/sites/simpletest 19 | 20 | # Ignore environment specific compose files. 21 | docker-compose.*.yml 22 | 23 | # Ignore environment specific conf files. 24 | conf/prod.* 25 | conf/staging.* 26 | 27 | .DS_Store 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | 3 | services: 4 | - docker 5 | 6 | script: 7 | - docker-compose run drupal /usr/local/bin/composer --working-dir="/var/www" install 8 | - docker-compose run drupal ../vendor/phpunit/phpunit/phpunit -c core --testsuite unit --exclude-group Composer,DependencyInjection,PageCache 9 | - docker-compose run drupal ../vendor/bin/drush 10 | 11 | after_success: 12 | # Supply the $STACKAHOY_TOKEN, $STACKAHOY_REPO_ID, and $STACKAHOY_BRANCH from 13 | # stackahoy.io. Stackahoy can take care of any other post-deployment commands 14 | # necessary or notifications. 15 | - if [[ $RELEASE = stable ]]; then docker run -it stackahoy/stackahoy-cli stackahoy deploy --token="$STACKAHOY_TOKEN" --repo="$STACKAHOY_REPO_ID" --branch="$STACKAHOY_BRANCH"; fi; 16 | -------------------------------------------------------------------------------- /conf/dev.nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 1; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | 8 | events { 9 | worker_connections 1024; 10 | } 11 | 12 | 13 | http { 14 | include /etc/nginx/mime.types; 15 | default_type application/octet-stream; 16 | 17 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 | '$status $body_bytes_sent "$http_referer" ' 19 | '"$http_user_agent" "$http_x_forwarded_for"'; 20 | 21 | access_log /var/log/nginx/access.log main; 22 | 23 | sendfile on; 24 | #tcp_nopush on; 25 | 26 | keepalive_timeout 65; 27 | 28 | #gzip on; 29 | 30 | include /etc/nginx/conf.d/*.conf; 31 | } 32 | -------------------------------------------------------------------------------- /src/web/update.php: -------------------------------------------------------------------------------- 1 | handle($request); 29 | $response->send(); 30 | 31 | $kernel->terminate($request, $response); 32 | -------------------------------------------------------------------------------- /conf/dev.settings.php: -------------------------------------------------------------------------------- 1 | 'drupal', 4 | 'username' => 'drupal', 5 | 'password' => 'drupal', 6 | 'host' => 'mariadb', 7 | 'port' => '3306', 8 | 'driver' => 'mysql', 9 | 'prefix' => '', 10 | 'collation' => 'utf8mb4_general_ci', 11 | ); 12 | 13 | $settings['hash_salt'] = 'CDSYjnp9WdGFPW-ls22I1tJVxr45tLR0SfHuAvRHH35eze_TEcHXLNK7RN9xxeu3n027aNnZ4g'; 14 | 15 | $settings['update_free_access'] = FALSE; 16 | $databases['default']['default'] = array ( 17 | 'database' => 'drupal', 18 | 'username' => 'drupal', 19 | 'password' => 'drupal', 20 | 'prefix' => '', 21 | 'host' => 'mariadb', 22 | 'port' => '3306', 23 | 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', 24 | 'driver' => 'mysql', 25 | ); 26 | 27 | $settings['install_profile'] = 'standard'; 28 | $config_directories['sync'] = 'sites/default/files/config_gHXbzhTN8JtAegamDWJ3U1wrbKN46SrNAJVvaZfBzKNTB9ELRDir2ee3gy8ga5A4_12FTyg3Iw/sync'; 29 | 30 | $config['system.performance']['css']['preprocess'] = FALSE; 31 | $config['system.performance']['js']['preprocess'] = FALSE; 32 | -------------------------------------------------------------------------------- /src/web/.csslintrc: -------------------------------------------------------------------------------- 1 | --errors=box-model, 2 | display-property-grouping, 3 | duplicate-background-images, 4 | duplicate-properties, 5 | empty-rules, 6 | ids, 7 | import, 8 | important, 9 | known-properties, 10 | outline-none, 11 | overqualified-elements, 12 | qualified-headings, 13 | shorthand, 14 | star-property-hack, 15 | text-indent, 16 | underscore-property-hack, 17 | unique-headings, 18 | unqualified-attributes, 19 | vendor-prefix, 20 | zero-units 21 | --ignore=adjoining-classes, 22 | box-sizing, 23 | bulletproof-font-face, 24 | compatible-vendor-prefixes, 25 | errors, 26 | fallback-colors, 27 | floats, 28 | font-faces, 29 | font-sizes, 30 | gradients, 31 | import-ie-limit, 32 | order-alphabetical, 33 | regex-selectors, 34 | rules-count, 35 | selector-max, 36 | selector-max-approaching, 37 | selector-newline, 38 | universal-selector 39 | --exclude-list=core/assets, 40 | vendor 41 | -------------------------------------------------------------------------------- /src/drush/policy.drush.inc: -------------------------------------------------------------------------------- 1 | /usr/local/etc/php/conf.d/opcache-recommended.ini 30 | 31 | # Install composer and drush. 32 | RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ 33 | echo 'export PATH=/var/www/vendor/bin:$PATH' >> $HOME/.bashrc && \ 34 | apt-get update && \ 35 | apt-get install -y mysql-client openssh-client rsync && \ 36 | rm -rf /var/lib/apt/lists/* 37 | 38 | # Move files into the container. 39 | COPY src/ /var/www/ 40 | 41 | WORKDIR /var/www 42 | 43 | RUN composer install && ln -s /var/www/vendor/bin/drush /usr/local/bin/drush 44 | 45 | WORKDIR /var/www/web 46 | -------------------------------------------------------------------------------- /src/web/robots.txt: -------------------------------------------------------------------------------- 1 | # 2 | # robots.txt 3 | # 4 | # This file is to prevent the crawling and indexing of certain parts 5 | # of your site by web crawlers and spiders run by sites like Yahoo! 6 | # and Google. By telling these "robots" where not to go on your site, 7 | # you save bandwidth and server resources. 8 | # 9 | # This file will be ignored unless it is at the root of your host: 10 | # Used: http://example.com/robots.txt 11 | # Ignored: http://example.com/site/robots.txt 12 | # 13 | # For more information about the robots.txt standard, see: 14 | # http://www.robotstxt.org/robotstxt.html 15 | 16 | User-agent: * 17 | # CSS, JS, Images 18 | Allow: /core/*.css$ 19 | Allow: /core/*.css? 20 | Allow: /core/*.js$ 21 | Allow: /core/*.js? 22 | Allow: /core/*.gif 23 | Allow: /core/*.jpg 24 | Allow: /core/*.jpeg 25 | Allow: /core/*.png 26 | Allow: /core/*.svg 27 | Allow: /profiles/*.css$ 28 | Allow: /profiles/*.css? 29 | Allow: /profiles/*.js$ 30 | Allow: /profiles/*.js? 31 | Allow: /profiles/*.gif 32 | Allow: /profiles/*.jpg 33 | Allow: /profiles/*.jpeg 34 | Allow: /profiles/*.png 35 | Allow: /profiles/*.svg 36 | # Directories 37 | Disallow: /core/ 38 | Disallow: /profiles/ 39 | # Files 40 | Disallow: /README.txt 41 | Disallow: /web.config 42 | # Paths (clean URLs) 43 | Disallow: /admin/ 44 | Disallow: /comment/reply/ 45 | Disallow: /filter/tips/ 46 | Disallow: /node/add/ 47 | Disallow: /search/ 48 | Disallow: /user/register/ 49 | Disallow: /user/password/ 50 | Disallow: /user/login/ 51 | Disallow: /user/logout/ 52 | # Paths (no clean URLs) 53 | Disallow: /index.php/admin/ 54 | Disallow: /index.php/comment/reply/ 55 | Disallow: /index.php/filter/tips/ 56 | Disallow: /index.php/node/add/ 57 | Disallow: /index.php/search/ 58 | Disallow: /index.php/user/password/ 59 | Disallow: /index.php/user/register/ 60 | Disallow: /index.php/user/login/ 61 | Disallow: /index.php/user/logout/ 62 | -------------------------------------------------------------------------------- /conf/dev.nginx.vh.default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; ## listen for ipv4; this line is default and implied 3 | listen [::]:80 default ipv6only=on; ## listen for ipv6 4 | 5 | root /var/www/web; ## <-- Your only path reference. 6 | 7 | location = /favicon.ico { 8 | log_not_found off; 9 | access_log off; 10 | } 11 | 12 | location = /robots.txt { 13 | allow all; 14 | log_not_found off; 15 | access_log off; 16 | } 17 | 18 | location ~* \.(txt|log)$ { 19 | allow 192.168.0.0/16; 20 | deny all; 21 | } 22 | 23 | location ~ \..*/.*\.php$ { 24 | return 403; 25 | } 26 | 27 | location ~ ^/sites/.*/private/ { 28 | return 403; 29 | } 30 | 31 | # Allow "Well-Known URIs" as per RFC 5785 32 | location ~* ^/.well-known/ { 33 | allow all; 34 | } 35 | 36 | # Block access to "hidden" files and directories whose names begin with a 37 | # period. This includes directories used by version control systems such 38 | # as Subversion or Git to store control files. 39 | location ~ (^|/)\. { 40 | return 403; 41 | } 42 | 43 | location / { 44 | # try_files $uri @rewrite; # For Drupal <= 6 45 | try_files $uri /index.php?$query_string; # For Drupal >= 7 46 | } 47 | 48 | location @rewrite { 49 | rewrite ^/(.*)$ /index.php?q=$1; 50 | } 51 | 52 | location ~ /vendor/.*\.php$ { 53 | deny all; 54 | return 404; 55 | } 56 | 57 | location ~ '\.php$|^/update.php' { 58 | fastcgi_split_path_info ^(.+?\.php)(|/.*)$; 59 | include fastcgi_params; 60 | fastcgi_param HTTP_PROXY ""; 61 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 62 | fastcgi_param PATH_INFO $fastcgi_path_info; 63 | fastcgi_param QUERY_STRING $query_string; 64 | fastcgi_intercept_errors on; 65 | fastcgi_pass backend; 66 | } 67 | 68 | # Fighting with Styles? This little gem is amazing. 69 | # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6 70 | location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7 71 | try_files $uri @rewrite; 72 | } 73 | 74 | # Handle private files through Drupal. Private file's path can come 75 | # with a language prefix. 76 | location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7 77 | try_files $uri /index.php?$query_string; 78 | } 79 | 80 | location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { 81 | expires max; 82 | log_not_found off; 83 | } 84 | } 85 | 86 | upstream backend { 87 | server drupal:9000; 88 | } 89 | -------------------------------------------------------------------------------- /src/web/sites/example.sites.php: -------------------------------------------------------------------------------- 1 | ..' => 'directory'. As an 24 | * example, to map https://www.drupal.org:8080/mysite/test to the configuration 25 | * directory sites/example.com, the array should be defined as: 26 | * @code 27 | * $sites = array( 28 | * '8080.www.drupal.org.mysite.test' => 'example.com', 29 | * ); 30 | * @endcode 31 | * The URL, https://www.drupal.org:8080/mysite/test/, could be a symbolic link 32 | * or an Apache Alias directive that points to the Drupal root containing 33 | * index.php. An alias could also be created for a subdomain. See the 34 | * @link https://www.drupal.org/documentation/install online Drupal installation guide @endlink 35 | * for more information on setting up domains, subdomains, and subdirectories. 36 | * 37 | * The following examples look for a site configuration in sites/example.com: 38 | * @code 39 | * URL: http://dev.drupal.org 40 | * $sites['dev.drupal.org'] = 'example.com'; 41 | * 42 | * URL: http://localhost/example 43 | * $sites['localhost.example'] = 'example.com'; 44 | * 45 | * URL: http://localhost:8080/example 46 | * $sites['8080.localhost.example'] = 'example.com'; 47 | * 48 | * URL: https://www.drupal.org:8080/mysite/test/ 49 | * $sites['8080.www.drupal.org.mysite.test'] = 'example.com'; 50 | * @endcode 51 | * 52 | * @see default.settings.php 53 | * @see \Drupal\Core\DrupalKernel::getSitePath() 54 | * @see https://www.drupal.org/documentation/install/multi-site 55 | */ 56 | -------------------------------------------------------------------------------- /src/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal-composer/drupal-project", 3 | "description": "Project template for Drupal 8 projects with composer", 4 | "type": "project", 5 | "license": "GPL-2.0+", 6 | "authors": [ 7 | { 8 | "name": "", 9 | "role": "" 10 | } 11 | ], 12 | "repositories": [ 13 | { 14 | "type": "composer", 15 | "url": "https://packages.drupal.org/8" 16 | } 17 | ], 18 | "require": { 19 | "composer/installers": "^1.2", 20 | "cweagans/composer-patches": "^1.6", 21 | "drupal-composer/drupal-scaffold": "^2.2", 22 | "drupal/console": "~1.0", 23 | "drupal/core": "~8.0", 24 | "drupal/devel": "~1.0", 25 | "drush/drush": "~8.0", 26 | "webflo/drupal-finder": "^0.3.0", 27 | "webmozart/path-util": "^2.3" 28 | }, 29 | "require-dev": { 30 | "behat/mink": "~1.7", 31 | "behat/mink-goutte-driver": "~1.2", 32 | "jcalderonzumba/gastonjs": "~1.0.2", 33 | "jcalderonzumba/mink-phantomjs-driver": "~0.3.1", 34 | "mikey179/vfsstream": "~1.2", 35 | "phpunit/phpunit": ">=4.8.28 <5", 36 | "symfony/css-selector": "~2.8" 37 | }, 38 | "conflict": { 39 | "drupal/drupal": "*" 40 | }, 41 | "minimum-stability": "dev", 42 | "prefer-stable": true, 43 | "config": { 44 | "sort-packages": true 45 | }, 46 | "autoload": { 47 | "classmap": [ 48 | "scripts/composer/ScriptHandler.php" 49 | ] 50 | }, 51 | "scripts": { 52 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold", 53 | "pre-install-cmd": [ 54 | "DrupalProject\\composer\\ScriptHandler::checkComposerVersion" 55 | ], 56 | "pre-update-cmd": [ 57 | "DrupalProject\\composer\\ScriptHandler::checkComposerVersion" 58 | ], 59 | "post-install-cmd": [ 60 | "DrupalProject\\composer\\ScriptHandler::createRequiredFiles" 61 | ], 62 | "post-update-cmd": [ 63 | "DrupalProject\\composer\\ScriptHandler::createRequiredFiles" 64 | ] 65 | }, 66 | "extra": { 67 | "installer-paths": { 68 | "web/core": ["type:drupal-core"], 69 | "web/libraries/{$name}": ["type:drupal-library"], 70 | "web/modules/contrib/{$name}": ["type:drupal-module"], 71 | "web/profiles/contrib/{$name}": ["type:drupal-profile"], 72 | "web/themes/contrib/{$name}": ["type:drupal-theme"], 73 | "drush/contrib/{$name}": ["type:drupal-drush"] 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 | # 3 | # This docker-compose is meant to be used in development. For other remote 4 | # envrionments, it should be copied to docker-compose.*.yml and populated with 5 | # more secure credentials. 6 | # 7 | # Example: docker-compose.production.yml 8 | # docker-compose -f docker-compose.production.yml [COMMANDS HERE] 9 | # 10 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 | version: '3.1' 12 | 13 | services: 14 | mariadb: 15 | image: mariadb:10.3 16 | restart: always 17 | environment: 18 | 19 | # Clearly, these credentials are not secure and you should change them for 20 | # the remote environment's docker-compose.*.yml. 21 | MYSQL_ROOT_PASSWORD: drupal 22 | MYSQL_DATABASE: drupal 23 | MYSQL_USER: drupal 24 | MYSQL_PASSWORD: drupal 25 | 26 | volumes: 27 | 28 | # Let the database persist. 29 | - dbstore:/var/lib/mysql 30 | 31 | drupal: 32 | build: . 33 | restart: always 34 | depends_on: 35 | - mariadb 36 | volumes: 37 | 38 | # Let uploads persist. 39 | - drupalfiles:/var/www/web/sites/default/files 40 | 41 | # These should be changed to either staging.* or prod.* on the remote 42 | # environment. 43 | - ./conf/dev.settings.php:/var/www/web/sites/default/settings.php 44 | - ./conf/dev.services.yml:/var/www/web/sites/default/services.yml 45 | 46 | # Development only! 47 | # 48 | # This allows you to make updates and see the changes right away. You will 49 | # want to comment these out for production/staging. 50 | - ./src/web/core:/var/www/web/core 51 | - ./src/web/modules:/var/www/web/modules 52 | - ./src/web/profiles:/var/www/web/profiles 53 | - ./src/web/themes:/var/www/web/themes 54 | - ./src/web/update.php:/var/www/web/update.php 55 | - ./src/scripts:/var/www/scripts 56 | - ./src/vendor:/var/www/vendor 57 | - ./src/composer.json:/var/www/composer.json 58 | - ./src/composer.lock:/var/www/composer.lock 59 | - ./src/phpunit.xml.dist:/var/phpunit.xml 60 | 61 | proxy: 62 | image: nginx:1.13-alpine 63 | restart: always 64 | depends_on: 65 | - drupal 66 | ports: 67 | - 3000:80 68 | 69 | # Uncomment this to expose port 443 (https). 70 | # - 443:443 71 | 72 | volumes: 73 | 74 | # Update to either staging.* or prod.* in remote environment. 75 | - ./conf/dev.nginx.conf:/etc/nginx/nginx.conf:ro 76 | - ./conf/dev.nginx.vh.default.conf:/etc/nginx/conf.d/default.conf:ro 77 | 78 | # Let nginx serve static files - it's good at that. 79 | - ./src/web:/var/www/web 80 | 81 | # Our drupal uploaded files and database should persist throughout time. 82 | # More information: https://docs.docker.com/compose/compose-file/#volume-configuration-reference 83 | volumes: 84 | dbstore: 85 | drupalfiles: 86 | 87 | # Only necessary if you're using https://certbot.eff.org/ certs. 88 | # certs: 89 | # external: true 90 | # certs-data: 91 | # external: true 92 | 93 | -------------------------------------------------------------------------------- /src/web/.gitattributes: -------------------------------------------------------------------------------- 1 | # Drupal git normalization 2 | # @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html 3 | # @see https://www.drupal.org/node/1542048 4 | 5 | # Normally these settings would be done with macro attributes for improved 6 | # readability and easier maintenance. However macros can only be defined at the 7 | # repository root directory. Drupal avoids making any assumptions about where it 8 | # is installed. 9 | 10 | # Define text file attributes. 11 | # - Treat them as text. 12 | # - Ensure no CRLF line-endings, neither on checkout nor on checkin. 13 | # - Detect whitespace errors. 14 | # - Exposed by default in `git diff --color` on the CLI. 15 | # - Validate with `git diff --check`. 16 | # - Deny applying with `git apply --whitespace=error-all`. 17 | # - Fix automatically with `git apply --whitespace=fix`. 18 | 19 | *.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 20 | *.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 21 | *.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 22 | *.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 23 | *.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html 24 | *.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 25 | *.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 26 | *.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 27 | *.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 28 | *.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 29 | *.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 30 | *.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 31 | *.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 32 | *.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 33 | *.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 34 | *.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 35 | *.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 36 | *.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 37 | *.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 38 | *.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 39 | *.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php 40 | *.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 41 | *.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 42 | *.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 43 | *.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 44 | 45 | # Define binary file attributes. 46 | # - Do not treat them as text. 47 | # - Include binary diff in patches instead of "binary files differ." 48 | *.gif -text diff 49 | *.gz -text diff 50 | *.ico -text diff 51 | *.jpeg -text diff 52 | *.jpg -text diff 53 | *.png -text diff 54 | *.phar -text diff 55 | *.exe -text diff 56 | *.svgz -text diff 57 | *.ttf -text diff 58 | -------------------------------------------------------------------------------- /src/scripts/composer/ScriptHandler.php: -------------------------------------------------------------------------------- 1 | locateRoot(getcwd()); 22 | $drupalRoot = $drupalFinder->getDrupalRoot(); 23 | 24 | $dirs = [ 25 | 'modules', 26 | 'profiles', 27 | 'themes', 28 | ]; 29 | 30 | // Required for unit testing 31 | foreach ($dirs as $dir) { 32 | if (!$fs->exists($drupalRoot . '/'. $dir)) { 33 | $fs->mkdir($drupalRoot . '/'. $dir); 34 | $fs->touch($drupalRoot . '/'. $dir . '/.gitkeep'); 35 | } 36 | } 37 | 38 | // Prepare the settings file for installation 39 | if (!$fs->exists($drupalRoot . '/sites/default/settings.php') and $fs->exists($drupalRoot . '/sites/default/default.settings.php')) { 40 | $fs->copy($drupalRoot . '/sites/default/default.settings.php', $drupalRoot . '/sites/default/settings.php'); 41 | require_once $drupalRoot . '/core/includes/bootstrap.inc'; 42 | require_once $drupalRoot . '/core/includes/install.inc'; 43 | $settings['config_directories'] = [ 44 | CONFIG_SYNC_DIRECTORY => (object) [ 45 | 'value' => Path::makeRelative($drupalFinder->getComposerRoot() . '/config/sync', $drupalRoot), 46 | 'required' => TRUE, 47 | ], 48 | ]; 49 | drupal_rewrite_settings($settings, $drupalRoot . '/sites/default/settings.php'); 50 | $fs->chmod($drupalRoot . '/sites/default/settings.php', 0666); 51 | $event->getIO()->write("Create a sites/default/settings.php file with chmod 0666"); 52 | } 53 | 54 | // Create the files directory with chmod 0777 55 | if (!$fs->exists($drupalRoot . '/sites/default/files')) { 56 | $oldmask = umask(0); 57 | $fs->mkdir($drupalRoot . '/sites/default/files', 0777); 58 | umask($oldmask); 59 | $event->getIO()->write("Create a sites/default/files directory with chmod 0777"); 60 | } 61 | } 62 | 63 | /** 64 | * Checks if the installed version of Composer is compatible. 65 | * 66 | * Composer 1.0.0 and higher consider a `composer install` without having a 67 | * lock file present as equal to `composer update`. We do not ship with a lock 68 | * file to avoid merge conflicts downstream, meaning that if a project is 69 | * installed with an older version of Composer the scaffolding of Drupal will 70 | * not be triggered. We check this here instead of in drupal-scaffold to be 71 | * able to give immediate feedback to the end user, rather than failing the 72 | * installation after going through the lengthy process of compiling and 73 | * downloading the Composer dependencies. 74 | * 75 | * @see https://github.com/composer/composer/pull/5035 76 | */ 77 | public static function checkComposerVersion(Event $event) { 78 | $composer = $event->getComposer(); 79 | $io = $event->getIO(); 80 | 81 | $version = $composer::VERSION; 82 | 83 | // The dev-channel of composer uses the git revision as version number, 84 | // try to the branch alias instead. 85 | if (preg_match('/^[0-9a-f]{40}$/i', $version)) { 86 | $version = $composer::BRANCH_ALIAS_VERSION; 87 | } 88 | 89 | // If Composer is installed through git we have no easy way to determine if 90 | // it is new enough, just display a warning. 91 | if ($version === '@package_version@' || $version === '@package_branch_alias_version@') { 92 | $io->writeError('You are running a development version of Composer. If you experience problems, please update Composer to the latest stable version.'); 93 | } 94 | elseif (Comparator::lessThan($version, '1.0.0')) { 95 | $io->writeError('Drupal-project requires Composer version 1.0.0 or higher. Please update your Composer before continuing.'); 96 | exit(1); 97 | } 98 | } 99 | 100 | } 101 | -------------------------------------------------------------------------------- /src/web/sites/example.settings.local.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 48 | 51 | 60 | 61 | 64 | 73 | 74 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | # Composer template for Drupal projects 2 | 3 | [![Build Status](https://travis-ci.org/drupal-composer/drupal-project.svg?branch=8.x)](https://travis-ci.org/drupal-composer/drupal-project) 4 | 5 | This project template should provide a kickstart for managing your site 6 | dependencies with [Composer](https://getcomposer.org/). 7 | 8 | If you want to know how to use it as replacement for 9 | [Drush Make](https://github.com/drush-ops/drush/blob/8.x/docs/make.md) visit 10 | the [Documentation on drupal.org](https://www.drupal.org/node/2471553). 11 | 12 | ## Usage 13 | 14 | First you need to [install composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx). 15 | 16 | > Note: The instructions below refer to the [global composer installation](https://getcomposer.org/doc/00-intro.md#globally). 17 | You might need to replace `composer` with `php composer.phar` (or similar) 18 | for your setup. 19 | 20 | After that you can create the project: 21 | 22 | ``` 23 | composer create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction 24 | ``` 25 | 26 | With `composer require ...` you can download new dependencies to your 27 | installation. 28 | 29 | ``` 30 | cd some-dir 31 | composer require drupal/devel:~1.0 32 | ``` 33 | 34 | The `composer create-project` command passes ownership of all files to the 35 | project that is created. You should create a new git repository, and commit 36 | all files not excluded by the .gitignore file. 37 | 38 | ## What does the template do? 39 | 40 | When installing the given `composer.json` some tasks are taken care of: 41 | 42 | * Drupal will be installed in the `web`-directory. 43 | * Autoloader is implemented to use the generated composer autoloader in `vendor/autoload.php`, 44 | instead of the one provided by Drupal (`web/vendor/autoload.php`). 45 | * Modules (packages of type `drupal-module`) will be placed in `web/modules/contrib/` 46 | * Theme (packages of type `drupal-theme`) will be placed in `web/themes/contrib/` 47 | * Profiles (packages of type `drupal-profile`) will be placed in `web/profiles/contrib/` 48 | * Creates default writable versions of `settings.php` and `services.yml`. 49 | * Creates `web/sites/default/files`-directory. 50 | * Latest version of drush is installed locally for use at `vendor/bin/drush`. 51 | * Latest version of DrupalConsole is installed locally for use at `vendor/bin/drupal`. 52 | 53 | ## Updating Drupal Core 54 | 55 | This project will attempt to keep all of your Drupal Core files up-to-date; the 56 | project [drupal-composer/drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold) 57 | is used to ensure that your scaffold files are updated every time drupal/core is 58 | updated. If you customize any of the "scaffolding" files (commonly .htaccess), 59 | you may need to merge conflicts if any of your modified files are updated in a 60 | new release of Drupal core. 61 | 62 | Follow the steps below to update your core files. 63 | 64 | 1. Run `composer update drupal/core --with-dependencies` to update Drupal Core and its dependencies. 65 | 1. Run `git diff` to determine if any of the scaffolding files have changed. 66 | Review the files for any changes and restore any customizations to 67 | `.htaccess` or `robots.txt`. 68 | 1. Commit everything all together in a single commit, so `web` will remain in 69 | sync with the `core` when checking out branches or running `git bisect`. 70 | 1. In the event that there are non-trivial conflicts in step 2, you may wish 71 | to perform these steps on a branch, and use `git merge` to combine the 72 | updated core files with your customized files. This facilitates the use 73 | of a [three-way merge tool such as kdiff3](http://www.gitshah.com/2010/12/how-to-setup-kdiff-as-diff-tool-for-git.html). This setup is not necessary if your changes are simple; 74 | keeping all of your modifications at the beginning or end of the file is a 75 | good strategy to keep merges easy. 76 | 77 | ## Generate composer.json from existing project 78 | 79 | With using [the "Composer Generate" drush extension](https://www.drupal.org/project/composer_generate) 80 | you can now generate a basic `composer.json` file from an existing project. Note 81 | that the generated `composer.json` might differ from this project's file. 82 | 83 | 84 | ## FAQ 85 | 86 | ### Should I commit the contrib modules I download? 87 | 88 | Composer recommends **no**. They provide [argumentation against but also 89 | workrounds if a project decides to do it anyway](https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md). 90 | 91 | ### Should I commit the scaffolding files? 92 | 93 | The [drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold) plugin can download the scaffold files (like 94 | index.php, update.php, …) to the web/ directory of your project. If you have not customized those files you could choose 95 | to not check them into your version control system (e.g. git). If that is the case for your project it might be 96 | convenient to automatically run the drupal-scaffold plugin after every install or update of your project. You can 97 | achieve that by registering `@drupal-scaffold` as post-install and post-update command in your composer.json: 98 | 99 | ```json 100 | "scripts": { 101 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold", 102 | "post-install-cmd": [ 103 | "@drupal-scaffold", 104 | "..." 105 | ], 106 | "post-update-cmd": [ 107 | "@drupal-scaffold", 108 | "..." 109 | ] 110 | }, 111 | ``` 112 | ### How can I apply patches to downloaded modules? 113 | 114 | If you need to apply patches (depending on the project being modified, a pull 115 | request is often a better solution), you can do so with the 116 | [composer-patches](https://github.com/cweagans/composer-patches) plugin. 117 | 118 | To add a patch to drupal module foobar insert the patches section in the extra 119 | section of composer.json: 120 | ```json 121 | "extra": { 122 | "patches": { 123 | "drupal/foobar": { 124 | "Patch description": "URL to patch" 125 | } 126 | } 127 | } 128 | ``` 129 | ### How do I switch from packagist.drupal-composer.org to packages.drupal.org? 130 | 131 | Follow the instructions in the [documentation on drupal.org](https://www.drupal.org/docs/develop/using-composer/using-packagesdrupalorg). 132 | -------------------------------------------------------------------------------- /src/web/sites/default/default.services.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | session.storage.options: 3 | # Default ini options for sessions. 4 | # 5 | # Some distributions of Linux (most notably Debian) ship their PHP 6 | # installations with garbage collection (gc) disabled. Since Drupal depends 7 | # on PHP's garbage collection for clearing sessions, ensure that garbage 8 | # collection occurs by using the most common settings. 9 | # @default 1 10 | gc_probability: 1 11 | # @default 100 12 | gc_divisor: 100 13 | # 14 | # Set session lifetime (in seconds), i.e. the time from the user's last 15 | # visit to the active session may be deleted by the session garbage 16 | # collector. When a session is deleted, authenticated users are logged out, 17 | # and the contents of the user's $_SESSION variable is discarded. 18 | # @default 200000 19 | gc_maxlifetime: 200000 20 | # 21 | # Set session cookie lifetime (in seconds), i.e. the time from the session 22 | # is created to the cookie expires, i.e. when the browser is expected to 23 | # discard the cookie. The value 0 means "until the browser is closed". 24 | # @default 2000000 25 | cookie_lifetime: 2000000 26 | # 27 | # Drupal automatically generates a unique session cookie name based on the 28 | # full domain name used to access the site. This mechanism is sufficient 29 | # for most use-cases, including multi-site deployments. However, if it is 30 | # desired that a session can be reused across different subdomains, the 31 | # cookie domain needs to be set to the shared base domain. Doing so assures 32 | # that users remain logged in as they cross between various subdomains. 33 | # To maximize compatibility and normalize the behavior across user agents, 34 | # the cookie domain should start with a dot. 35 | # 36 | # @default none 37 | # cookie_domain: '.example.com' 38 | # 39 | twig.config: 40 | # Twig debugging: 41 | # 42 | # When debugging is enabled: 43 | # - The markup of each Twig template is surrounded by HTML comments that 44 | # contain theming information, such as template file name suggestions. 45 | # - Note that this debugging markup will cause automated tests that directly 46 | # check rendered HTML to fail. When running automated tests, 'debug' 47 | # should be set to FALSE. 48 | # - The dump() function can be used in Twig templates to output information 49 | # about template variables. 50 | # - Twig templates are automatically recompiled whenever the source code 51 | # changes (see auto_reload below). 52 | # 53 | # For more information about debugging Twig templates, see 54 | # https://www.drupal.org/node/1906392. 55 | # 56 | # Not recommended in production environments 57 | # @default false 58 | debug: false 59 | # Twig auto-reload: 60 | # 61 | # Automatically recompile Twig templates whenever the source code changes. 62 | # If you don't provide a value for auto_reload, it will be determined 63 | # based on the value of debug. 64 | # 65 | # Not recommended in production environments 66 | # @default null 67 | auto_reload: null 68 | # Twig cache: 69 | # 70 | # By default, Twig templates will be compiled and stored in the filesystem 71 | # to increase performance. Disabling the Twig cache will recompile the 72 | # templates from source each time they are used. In most cases the 73 | # auto_reload setting above should be enabled rather than disabling the 74 | # Twig cache. 75 | # 76 | # Not recommended in production environments 77 | # @default true 78 | cache: true 79 | renderer.config: 80 | # Renderer required cache contexts: 81 | # 82 | # The Renderer will automatically associate these cache contexts with every 83 | # render array, hence varying every render array by these cache contexts. 84 | # 85 | # @default ['languages:language_interface', 'theme', 'user.permissions'] 86 | required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions'] 87 | # Renderer automatic placeholdering conditions: 88 | # 89 | # Drupal allows portions of the page to be automatically deferred when 90 | # rendering to improve cache performance. That is especially helpful for 91 | # cache contexts that vary widely, such as the active user. On some sites 92 | # those may be different, however, such as sites with only a handful of 93 | # users. If you know what the high-cardinality cache contexts are for your 94 | # site, specify those here. If you're not sure, the defaults are fairly safe 95 | # in general. 96 | # 97 | # For more information about rendering optimizations see 98 | # https://www.drupal.org/developing/api/8/render/arrays/cacheability#optimizing 99 | auto_placeholder_conditions: 100 | # Max-age at or below which caching is not considered worthwhile. 101 | # 102 | # Disable by setting to -1. 103 | # 104 | # @default 0 105 | max-age: 0 106 | # Cache contexts with a high cardinality. 107 | # 108 | # Disable by setting to []. 109 | # 110 | # @default ['session', 'user'] 111 | contexts: ['session', 'user'] 112 | # Tags with a high invalidation frequency. 113 | # 114 | # Disable by setting to []. 115 | # 116 | # @default [] 117 | tags: [] 118 | # Cacheability debugging: 119 | # 120 | # Responses with cacheability metadata (CacheableResponseInterface instances) 121 | # get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. 122 | # 123 | # For more information about debugging cacheable responses, see 124 | # https://www.drupal.org/developing/api/8/response/cacheable-response-interface 125 | # 126 | # Not recommended in production environments 127 | # @default false 128 | http.response.debug_cacheability_headers: false 129 | factory.keyvalue: 130 | {} 131 | # Default key/value storage service to use. 132 | # @default keyvalue.database 133 | # default: keyvalue.database 134 | # Collection-specific overrides. 135 | # state: keyvalue.database 136 | factory.keyvalue.expirable: 137 | {} 138 | # Default key/value expirable storage service to use. 139 | # @default keyvalue.database.expirable 140 | # default: keyvalue.database.expirable 141 | # Allowed protocols for URL generation. 142 | filter_protocols: 143 | - http 144 | - https 145 | - ftp 146 | - news 147 | - nntp 148 | - tel 149 | - telnet 150 | - mailto 151 | - irc 152 | - ssh 153 | - sftp 154 | - webcal 155 | - rtsp 156 | 157 | # Configure Cross-Site HTTP requests (CORS). 158 | # Read https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 159 | # for more information about the topic in general. 160 | # Note: By default the configuration is disabled. 161 | cors.config: 162 | enabled: false 163 | # Specify allowed headers, like 'x-allowed-header'. 164 | allowedHeaders: [] 165 | # Specify allowed request methods, specify ['*'] to allow all possible ones. 166 | allowedMethods: [] 167 | # Configure requests allowed from specific origins. 168 | allowedOrigins: ['*'] 169 | # Sets the Access-Control-Expose-Headers header. 170 | exposedHeaders: false 171 | # Sets the Access-Control-Max-Age header. 172 | maxAge: false 173 | # Sets the Access-Control-Allow-Credentials header. 174 | supportsCredentials: false 175 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dockerized Drupal 8 Starter 2 | 3 | [![Build Status](https://travis-ci.org/LevInteractive/dockerized-drupal-starter.svg?branch=master)](https://travis-ci.org/LevInteractive/dockerized-drupal-starter) 4 | 5 | The goals of this project are the following: 6 | 7 | * Strategies for continuous integration (CI). 8 | * Strategies for continuous deployments (CD). 9 | * Composer managed dependencies based on Drupal's [Composer template for Drupal projects](https://github.com/drupal-composer/drupal-project). The core should not be versioned (execept in composer.json). 10 | * Use Docker for both development and production environments ensuring developer's local 11 | machine matches the remote environment. 12 | * Provide a easy way to enable SSL/HTTPS using [Certbot](https://certbot.eff.org/). 13 | * No assumptions should be made about the theme or high-level application layer. **This project is not a theme.** 14 | 15 | ## Dependencies 16 | 17 | * [Docker](https://www.docker.com/) 18 | * [Docker Compose](https://docs.docker.com/compose/) _(Not required but recommended)_ 19 | * [Composer](https://getcomposer.org/) _(Development only)_ 20 | 21 | ## Table of Contents 22 | 23 | 1. [Development](#development) 24 | 2. [Environment Specific Configurations](#environment-specific-configurations) 25 | 3. [Continuous Integration & Deployment](#continuous-integration-and-deployment) 26 | 4. [Enabling SSL](#user-content-enabling-https-ssl) 27 | 28 | ## Development 29 | 30 | Clone or download a zip of this repository and `cd` into it. 31 | 32 | ```shell 33 | # Install deps. (will install on your actual machine because of volumes). 34 | docker-compose run --rm drupal composer --working-dir="/var/www" install 35 | 36 | # Run the dev environment. 37 | docker-compose up -d 38 | 39 | # Use drush. 40 | docker-compose run --rm drupal drush ... 41 | ``` 42 | 43 | See the development environment at: [http://[your-docker-ip]:3000](http://[your-docker-ip]:3000) 44 | 45 | #### Handy commands during development 46 | 47 | ```shell 48 | # Tail php logs. 49 | docker logs -f _drupal_1 50 | 51 | # (Re-)build the 52 | docker-compose build 53 | 54 | # View running containers. 55 | docker images 56 | 57 | # Destroy containers, but leave database and files volume. 58 | docker-compose down 59 | 60 | # Destroy the database and drupal file persistent volume. 61 | docker-compose down --volume 62 | 63 | # See all project volumes. 64 | docker volume ls 65 | ``` 66 | 67 | ## Environment Specific Configurations 68 | 69 | You'll notice by looking at the [docker-compose.yml](docker-compose.yml) 70 | file that what the environmental variables are set to are not very secure. When 71 | it comes time to stage the application you're going to want to do two things: 72 | 73 | 1. Upon file deployment, create production-ready [conf/](/conf/) files (nginx and settings). For example, 74 | `prod.nginx.vh.default.conf` which will point to your real world domain. 75 | 2. Upon file deployment, create a docker-compose.(prod|staging|anything).yml file (notice it's 76 | ignored in the [.gitignore](.gitignore) file) with updated volumes pointed to 77 | the conf files you created in step one (the drupal and nginx service). 78 | 79 | These files can be managed, stored, and deployed securely using [Stackahoy's](https://stackahoy.io/) 80 | static files feature. Aternatively, you create them on the fly with a 81 | post-receive shell script or just by SSH'ing on the server and creating them. 82 | 83 | ## Continuous Integration 84 | 85 | Ideally, the CI will accomplish the following: 86 | 87 | 1. Build the latest docker image and push it to a registery. There are a few 88 | different registries you can go with. Some popular options being: 89 | * [Docker Hub](https://hub.docker.com/) 90 | * [GitLab](https://about.gitlab.com/) 91 | * [Google Cloud](https://cloud.google.com/container-registry/) 92 | * [AWS](https://aws.amazon.com/ecr/) 93 | 2. Test the container/code with PHPUnit. 94 | 3. Deploy code to server based on the branch that was pushed to. [stackahoy.io](https://stackahoy.io) allows 95 | you to handle your deployment specific dependencies (servers, post deployment 96 | commands, ect) while using the command-line to trigger it. 97 | 98 | #### Testing 99 | 100 | Whether you're using GitLab, Travis, CicleCI, or another CI provider, you'll be 101 | able to simply run the following to test it thanks to docker: 102 | 103 | ```yaml 104 | scripts: 105 | - docker-compose run drupal /usr/local/bin/composer --working-dir="/var/www" install 106 | - docker-compose run drupal ../vendor/phpunit/phpunit/phpunit -c core --testsuite unit --exclude-group Composer,DependencyInjection,PageCache 107 | - docker-compose run drupal ../vendor/bin/drush 108 | ``` 109 | 110 | You won't have to rely on the CI provider to spin up a instance of php or mysql 111 | because Docker will handle that for you. Pretty easy, eh? 112 | 113 | #### Deployment 114 | 115 | See the [.travis.yml](.travis.yml) file. For deployment, simply configure the 116 | deployment procedure in [stackahoy.io](https://stackahoy.io) and populate the 117 | three environmental variables in the project settings within Travis. This works 118 | very similarly in most other CI providers. 119 | 120 | ```yaml 121 | after_success: 122 | # Supply the $STACKAHOY_TOKEN, $STACKAHOY_REPO_ID, and $STACKAHOY_BRANCH from 123 | # stackahoy.io. Stackahoy can take care of any other post-deployment commands 124 | # necessary or notifications. 125 | - if [[ $RELEASE = stable ]]; then docker run -it stackahoy/stackahoy-cli stackahoy deploy --token="$STACKAHOY_TOKEN" --repo="$STACKAHOY_REPO_ID" --branch="$STACKAHOY_BRANCH"; fi; 126 | ``` 127 | 128 | 129 | ## Enabling HTTPS (SSL) 130 | 131 | We highly recommend you use [Certbot](https://certbot.eff.org/) to create your 132 | SSL certificate. 133 | 134 | Before you run the `docker-compose up` command, you'll need to issue the 135 | certificate into a volume which will be used by nginx. 136 | 137 | _Make sure you change "YOUR_DOMAIN.com" to whatever your domain is._ 138 | 139 | ```bash 140 | # Create the volumes where certificates will persist. They need to persist 141 | # forever so we can kill the containers without worring about losing them. 142 | docker volume create --name certs 143 | docker volume create --name certs-data 144 | 145 | # Run a web server for authentication. 146 | docker run -d --rm \ 147 | -v certs:/etc/letsencrypt \ 148 | -v certs-data:/data/letsencrypt \ 149 | -v $(pwd)/conf/certbot.nginx.vh.conf:/etc/nginx/conf.d/default.conf \ 150 | --name ssl_nginx \ 151 | -p "80:80" \ 152 | nginx:1.13-alpine 153 | 154 | # Initialize the certificates from https://certbot.eff.org/ (EFF!). It's going 155 | to ask you to provide some information. 156 | docker run -it --rm \ 157 | -v certs:/etc/letsencrypt \ 158 | -v certs-data:/data/letsencrypt \ 159 | deliverous/certbot \ 160 | certonly --webroot --webroot-path=/data/letsencrypt -d YOUR_DOMAIN.com 161 | 162 | # Stop and remove the certbot nginx instance. 163 | docker stop ssl_nginx && docker rm ssl_nginx 164 | ``` 165 | 166 | This certificate will last for 90 days. You can create a cronjob which will 167 | renew it by calling the following script every 80 days or so. 168 | 169 | _Make sure you replace "YOUR_NAMESPACE" with whatever the prefix is for your 170 | containers._ 171 | 172 | ```bash 173 | # Renew tokens... when ssl expires. 174 | docker run -t --rm \ 175 | --volumes-from YOUR_NAMESPACE_proxy_1 \ 176 | deliverous/certbot \ 177 | renew \ 178 | --webroot --webroot-path=/data/letsencrypt 179 | ``` 180 | 181 | Now in order for it to work, you'll need to configure the prod.nginx.vh.conf 182 | file to use the certs and uncomment the 2 cert volumes in the docker-compose 183 | file. The nginx file will need: 184 | 185 | ```nginx 186 | ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN.com/fullchain.pem; 187 | ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN.com/privkey.pem; 188 | ssl_trusted_certificate /etc/letsencrypt/live/YOUR_DOMAIN.com/chain.pem; 189 | ``` 190 | -------------------------------------------------------------------------------- /src/web/.htaccess: -------------------------------------------------------------------------------- 1 | # 2 | # Apache/PHP/Drupal settings: 3 | # 4 | 5 | # Protect files and directories from prying eyes. 6 | 7 | 8 | Require all denied 9 | 10 | 11 | Order allow,deny 12 | 13 | 14 | 15 | # Don't show directory listings for URLs which map to a directory. 16 | Options -Indexes 17 | 18 | # Set the default handler. 19 | DirectoryIndex index.php index.html index.htm 20 | 21 | # Add correct encoding for SVGZ. 22 | AddType image/svg+xml svg svgz 23 | AddEncoding gzip svgz 24 | 25 | # Most of the following PHP settings cannot be changed at runtime. See 26 | # sites/default/default.settings.php and 27 | # Drupal\Core\DrupalKernel::bootEnvironment() for settings that can be 28 | # changed at runtime. 29 | 30 | # PHP 5, Apache 1 and 2. 31 | 32 | php_value assert.active 0 33 | php_flag session.auto_start off 34 | php_value mbstring.http_input pass 35 | php_value mbstring.http_output pass 36 | php_flag mbstring.encoding_translation off 37 | # PHP 5.6 has deprecated $HTTP_RAW_POST_DATA and produces warnings if this is 38 | # not set. 39 | php_value always_populate_raw_post_data -1 40 | 41 | 42 | # Requires mod_expires to be enabled. 43 | 44 | # Enable expirations. 45 | ExpiresActive On 46 | 47 | # Cache all files for 2 weeks after access (A). 48 | ExpiresDefault A1209600 49 | 50 | 51 | # Do not allow PHP scripts to be cached unless they explicitly send cache 52 | # headers themselves. Otherwise all scripts would have to overwrite the 53 | # headers set by mod_expires if they want another caching behavior. This may 54 | # fail if an error occurs early in the bootstrap process, and it may cause 55 | # problems if a non-Drupal PHP file is installed in a subdirectory. 56 | ExpiresActive Off 57 | 58 | 59 | 60 | # Set a fallback resource if mod_rewrite is not enabled. This allows Drupal to 61 | # work without clean URLs. This requires Apache version >= 2.2.16. If Drupal is 62 | # not accessed by the top level URL (i.e.: http://example.com/drupal/ instead of 63 | # http://example.com/), the path to index.php will need to be adjusted. 64 | 65 | FallbackResource /index.php 66 | 67 | 68 | # Various rewrite rules. 69 | 70 | RewriteEngine on 71 | 72 | # Set "protossl" to "s" if we were accessed via https://. This is used later 73 | # if you enable "www." stripping or enforcement, in order to ensure that 74 | # you don't bounce between http and https. 75 | RewriteRule ^ - [E=protossl] 76 | RewriteCond %{HTTPS} on 77 | RewriteRule ^ - [E=protossl:s] 78 | 79 | # Make sure Authorization HTTP header is available to PHP 80 | # even when running as CGI or FastCGI. 81 | RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 82 | 83 | # Block access to "hidden" directories whose names begin with a period. This 84 | # includes directories used by version control systems such as Subversion or 85 | # Git to store control files. Files whose names begin with a period, as well 86 | # as the control files used by CVS, are protected by the FilesMatch directive 87 | # above. 88 | # 89 | # NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is 90 | # not possible to block access to entire directories from .htaccess because 91 | # is not allowed here. 92 | # 93 | # If you do not have mod_rewrite installed, you should remove these 94 | # directories from your webroot or otherwise protect them from being 95 | # downloaded. 96 | RewriteRule "/\.|^\.(?!well-known/)" - [F] 97 | 98 | # If your site can be accessed both with and without the 'www.' prefix, you 99 | # can use one of the following settings to redirect users to your preferred 100 | # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option: 101 | # 102 | # To redirect all users to access the site WITH the 'www.' prefix, 103 | # (http://example.com/foo will be redirected to http://www.example.com/foo) 104 | # uncomment the following: 105 | # RewriteCond %{HTTP_HOST} . 106 | # RewriteCond %{HTTP_HOST} !^www\. [NC] 107 | # RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 108 | # 109 | # To redirect all users to access the site WITHOUT the 'www.' prefix, 110 | # (http://www.example.com/foo will be redirected to http://example.com/foo) 111 | # uncomment the following: 112 | # RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 113 | # RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] 114 | 115 | # Modify the RewriteBase if you are using Drupal in a subdirectory or in a 116 | # VirtualDocumentRoot and the rewrite rules are not working properly. 117 | # For example if your site is at http://example.com/drupal uncomment and 118 | # modify the following line: 119 | # RewriteBase /drupal 120 | # 121 | # If your site is running in a VirtualDocumentRoot at http://example.com/, 122 | # uncomment the following line: 123 | # RewriteBase / 124 | 125 | # Redirect common PHP files to their new locations. 126 | RewriteCond %{REQUEST_URI} ^(.*)?/(install.php) [OR] 127 | RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild.php) 128 | RewriteCond %{REQUEST_URI} !core 129 | RewriteRule ^ %1/core/%2 [L,QSA,R=301] 130 | 131 | # Rewrite install.php during installation to see if mod_rewrite is working 132 | RewriteRule ^core/install.php core/install.php?rewrite=ok [QSA,L] 133 | 134 | # Pass all requests not referring directly to files in the filesystem to 135 | # index.php. 136 | RewriteCond %{REQUEST_FILENAME} !-f 137 | RewriteCond %{REQUEST_FILENAME} !-d 138 | RewriteCond %{REQUEST_URI} !=/favicon.ico 139 | RewriteRule ^ index.php [L] 140 | 141 | # For security reasons, deny access to other PHP files on public sites. 142 | # Note: The following URI conditions are not anchored at the start (^), 143 | # because Drupal may be located in a subdirectory. To further improve 144 | # security, you can replace '!/' with '!^/'. 145 | # Allow access to PHP files in /core (like authorize.php or install.php): 146 | RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$ 147 | # Allow access to test-specific PHP files: 148 | RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?.php 149 | # Allow access to Statistics module's custom front controller. 150 | # Copy and adapt this rule to directly execute PHP files in contributed or 151 | # custom modules or to run another PHP application in the same directory. 152 | RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics.php$ 153 | # Deny access to any other PHP files that do not match the rules above. 154 | # Specifically, disallow autoload.php from being served directly. 155 | RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F] 156 | 157 | # Rules to correctly serve gzip compressed CSS and JS files. 158 | # Requires both mod_rewrite and mod_headers to be enabled. 159 | 160 | # Serve gzip compressed CSS files if they exist and the client accepts gzip. 161 | RewriteCond %{HTTP:Accept-encoding} gzip 162 | RewriteCond %{REQUEST_FILENAME}\.gz -s 163 | RewriteRule ^(.*)\.css $1\.css\.gz [QSA] 164 | 165 | # Serve gzip compressed JS files if they exist and the client accepts gzip. 166 | RewriteCond %{HTTP:Accept-encoding} gzip 167 | RewriteCond %{REQUEST_FILENAME}\.gz -s 168 | RewriteRule ^(.*)\.js $1\.js\.gz [QSA] 169 | 170 | # Serve correct content types, and prevent mod_deflate double gzip. 171 | RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] 172 | RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1] 173 | 174 | 175 | # Serve correct encoding type. 176 | Header set Content-Encoding gzip 177 | # Force proxies to cache gzipped & non-gzipped css/js files separately. 178 | Header append Vary Accept-Encoding 179 | 180 | 181 | 182 | 183 | # Various header fixes. 184 | 185 | # Disable content sniffing, since it's an attack vector. 186 | Header always set X-Content-Type-Options nosniff 187 | # Disable Proxy header, since it's an attack vector. 188 | RequestHeader unset Proxy 189 | 190 | -------------------------------------------------------------------------------- /src/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /src/web/sites/default/default.settings.php: -------------------------------------------------------------------------------- 1 | 'databasename', 79 | * 'username' => 'sqlusername', 80 | * 'password' => 'sqlpassword', 81 | * 'host' => 'localhost', 82 | * 'port' => '3306', 83 | * 'driver' => 'mysql', 84 | * 'prefix' => '', 85 | * 'collation' => 'utf8mb4_general_ci', 86 | * ); 87 | * @endcode 88 | */ 89 | $databases = array(); 90 | 91 | /** 92 | * Customizing database settings. 93 | * 94 | * Many of the values of the $databases array can be customized for your 95 | * particular database system. Refer to the sample in the section above as a 96 | * starting point. 97 | * 98 | * The "driver" property indicates what Drupal database driver the 99 | * connection should use. This is usually the same as the name of the 100 | * database type, such as mysql or sqlite, but not always. The other 101 | * properties will vary depending on the driver. For SQLite, you must 102 | * specify a database file name in a directory that is writable by the 103 | * webserver. For most other drivers, you must specify a 104 | * username, password, host, and database name. 105 | * 106 | * Transaction support is enabled by default for all drivers that support it, 107 | * including MySQL. To explicitly disable it, set the 'transactions' key to 108 | * FALSE. 109 | * Note that some configurations of MySQL, such as the MyISAM engine, don't 110 | * support it and will proceed silently even if enabled. If you experience 111 | * transaction related crashes with such configuration, set the 'transactions' 112 | * key to FALSE. 113 | * 114 | * For each database, you may optionally specify multiple "target" databases. 115 | * A target database allows Drupal to try to send certain queries to a 116 | * different database if it can but fall back to the default connection if not. 117 | * That is useful for primary/replica replication, as Drupal may try to connect 118 | * to a replica server when appropriate and if one is not available will simply 119 | * fall back to the single primary server (The terms primary/replica are 120 | * traditionally referred to as master/slave in database server documentation). 121 | * 122 | * The general format for the $databases array is as follows: 123 | * @code 124 | * $databases['default']['default'] = $info_array; 125 | * $databases['default']['replica'][] = $info_array; 126 | * $databases['default']['replica'][] = $info_array; 127 | * $databases['extra']['default'] = $info_array; 128 | * @endcode 129 | * 130 | * In the above example, $info_array is an array of settings described above. 131 | * The first line sets a "default" database that has one primary database 132 | * (the second level default). The second and third lines create an array 133 | * of potential replica databases. Drupal will select one at random for a given 134 | * request as needed. The fourth line creates a new database with a name of 135 | * "extra". 136 | * 137 | * You can optionally set prefixes for some or all database table names 138 | * by using the 'prefix' setting. If a prefix is specified, the table 139 | * name will be prepended with its value. Be sure to use valid database 140 | * characters only, usually alphanumeric and underscore. If no prefixes 141 | * are desired, leave it as an empty string ''. 142 | * 143 | * To have all database names prefixed, set 'prefix' as a string: 144 | * @code 145 | * 'prefix' => 'main_', 146 | * @endcode 147 | * 148 | * Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in 149 | * Drupal 9.0. After that, only a single prefix for all tables will be 150 | * supported. 151 | * 152 | * To provide prefixes for specific tables, set 'prefix' as an array. 153 | * The array's keys are the table names and the values are the prefixes. 154 | * The 'default' element is mandatory and holds the prefix for any tables 155 | * not specified elsewhere in the array. Example: 156 | * @code 157 | * 'prefix' => array( 158 | * 'default' => 'main_', 159 | * 'users' => 'shared_', 160 | * 'sessions' => 'shared_', 161 | * 'role' => 'shared_', 162 | * 'authmap' => 'shared_', 163 | * ), 164 | * @endcode 165 | * You can also use a reference to a schema/database as a prefix. This may be 166 | * useful if your Drupal installation exists in a schema that is not the default 167 | * or you want to access several databases from the same code base at the same 168 | * time. 169 | * Example: 170 | * @code 171 | * 'prefix' => array( 172 | * 'default' => 'main.', 173 | * 'users' => 'shared.', 174 | * 'sessions' => 'shared.', 175 | * 'role' => 'shared.', 176 | * 'authmap' => 'shared.', 177 | * ); 178 | * @endcode 179 | * NOTE: MySQL and SQLite's definition of a schema is a database. 180 | * 181 | * Advanced users can add or override initial commands to execute when 182 | * connecting to the database server, as well as PDO connection settings. For 183 | * example, to enable MySQL SELECT queries to exceed the max_join_size system 184 | * variable, and to reduce the database connection timeout to 5 seconds: 185 | * @code 186 | * $databases['default']['default'] = array( 187 | * 'init_commands' => array( 188 | * 'big_selects' => 'SET SQL_BIG_SELECTS=1', 189 | * ), 190 | * 'pdo' => array( 191 | * PDO::ATTR_TIMEOUT => 5, 192 | * ), 193 | * ); 194 | * @endcode 195 | * 196 | * WARNING: The above defaults are designed for database portability. Changing 197 | * them may cause unexpected behavior, including potential data loss. See 198 | * https://www.drupal.org/developing/api/database/configuration for more 199 | * information on these defaults and the potential issues. 200 | * 201 | * More details can be found in the constructor methods for each driver: 202 | * - \Drupal\Core\Database\Driver\mysql\Connection::__construct() 203 | * - \Drupal\Core\Database\Driver\pgsql\Connection::__construct() 204 | * - \Drupal\Core\Database\Driver\sqlite\Connection::__construct() 205 | * 206 | * Sample Database configuration format for PostgreSQL (pgsql): 207 | * @code 208 | * $databases['default']['default'] = array( 209 | * 'driver' => 'pgsql', 210 | * 'database' => 'databasename', 211 | * 'username' => 'sqlusername', 212 | * 'password' => 'sqlpassword', 213 | * 'host' => 'localhost', 214 | * 'prefix' => '', 215 | * ); 216 | * @endcode 217 | * 218 | * Sample Database configuration format for SQLite (sqlite): 219 | * @code 220 | * $databases['default']['default'] = array( 221 | * 'driver' => 'sqlite', 222 | * 'database' => '/path/to/databasefilename', 223 | * ); 224 | * @endcode 225 | */ 226 | 227 | /** 228 | * Location of the site configuration files. 229 | * 230 | * The $config_directories array specifies the location of file system 231 | * directories used for configuration data. On install, the "sync" directory is 232 | * created. This is used for configuration imports. The "active" directory is 233 | * not created by default since the default storage for active configuration is 234 | * the database rather than the file system. (This can be changed. See "Active 235 | * configuration settings" below). 236 | * 237 | * The default location for the "sync" directory is inside a randomly-named 238 | * directory in the public files path. The setting below allows you to override 239 | * the "sync" location. 240 | * 241 | * If you use files for the "active" configuration, you can tell the 242 | * Configuration system where this directory is located by adding an entry with 243 | * array key CONFIG_ACTIVE_DIRECTORY. 244 | * 245 | * Example: 246 | * @code 247 | * $config_directories = array( 248 | * CONFIG_SYNC_DIRECTORY => '/directory/outside/webroot', 249 | * ); 250 | * @endcode 251 | */ 252 | $config_directories = array(); 253 | 254 | /** 255 | * Settings: 256 | * 257 | * $settings contains environment-specific configuration, such as the files 258 | * directory and reverse proxy address, and temporary configuration, such as 259 | * security overrides. 260 | * 261 | * @see \Drupal\Core\Site\Settings::get() 262 | */ 263 | 264 | /** 265 | * The active installation profile. 266 | * 267 | * Changing this after installation is not recommended as it changes which 268 | * directories are scanned during extension discovery. If this is set prior to 269 | * installation this value will be rewritten according to the profile selected 270 | * by the user. 271 | * 272 | * @see install_select_profile() 273 | * 274 | * @deprecated in Drupal 8.3.0 and will be removed before Drupal 9.0.0. The 275 | * install profile is written to the core.extension configuration. If a 276 | * service requires the install profile use the 'install_profile' container 277 | * parameter. Functional code can use \Drupal::installProfile(). 278 | */ 279 | # $settings['install_profile'] = ''; 280 | 281 | /** 282 | * Salt for one-time login links, cancel links, form tokens, etc. 283 | * 284 | * This variable will be set to a random value by the installer. All one-time 285 | * login links will be invalidated if the value is changed. Note that if your 286 | * site is deployed on a cluster of web servers, you must ensure that this 287 | * variable has the same value on each server. 288 | * 289 | * For enhanced security, you may set this variable to the contents of a file 290 | * outside your document root; you should also ensure that this file is not 291 | * stored with backups of your database. 292 | * 293 | * Example: 294 | * @code 295 | * $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); 296 | * @endcode 297 | */ 298 | $settings['hash_salt'] = ''; 299 | 300 | /** 301 | * Deployment identifier. 302 | * 303 | * Drupal's dependency injection container will be automatically invalidated and 304 | * rebuilt when the Drupal core version changes. When updating contributed or 305 | * custom code that changes the container, changing this identifier will also 306 | * allow the container to be invalidated as soon as code is deployed. 307 | */ 308 | # $settings['deployment_identifier'] = \Drupal::VERSION; 309 | 310 | /** 311 | * Access control for update.php script. 312 | * 313 | * If you are updating your Drupal installation using the update.php script but 314 | * are not logged in using either an account with the "Administer software 315 | * updates" permission or the site maintenance account (the account that was 316 | * created during installation), you will need to modify the access check 317 | * statement below. Change the FALSE to a TRUE to disable the access check. 318 | * After finishing the upgrade, be sure to open this file again and change the 319 | * TRUE back to a FALSE! 320 | */ 321 | $settings['update_free_access'] = FALSE; 322 | 323 | /** 324 | * External access proxy settings: 325 | * 326 | * If your site must access the Internet via a web proxy then you can enter the 327 | * proxy settings here. Set the full URL of the proxy, including the port, in 328 | * variables: 329 | * - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP 330 | * requests. 331 | * - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS 332 | * requests. 333 | * You can pass in the user name and password for basic authentication in the 334 | * URLs in these settings. 335 | * 336 | * You can also define an array of host names that can be accessed directly, 337 | * bypassing the proxy, in $settings['http_client_config']['proxy']['no']. 338 | */ 339 | # $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; 340 | # $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; 341 | # $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; 342 | 343 | /** 344 | * Reverse Proxy Configuration: 345 | * 346 | * Reverse proxy servers are often used to enhance the performance 347 | * of heavily visited sites and may also provide other site caching, 348 | * security, or encryption benefits. In an environment where Drupal 349 | * is behind a reverse proxy, the real IP address of the client should 350 | * be determined such that the correct client IP address is available 351 | * to Drupal's logging, statistics, and access management systems. In 352 | * the most simple scenario, the proxy server will add an 353 | * X-Forwarded-For header to the request that contains the client IP 354 | * address. However, HTTP headers are vulnerable to spoofing, where a 355 | * malicious client could bypass restrictions by setting the 356 | * X-Forwarded-For header directly. Therefore, Drupal's proxy 357 | * configuration requires the IP addresses of all remote proxies to be 358 | * specified in $settings['reverse_proxy_addresses'] to work correctly. 359 | * 360 | * Enable this setting to get Drupal to determine the client IP from 361 | * the X-Forwarded-For header (or $settings['reverse_proxy_header'] if set). 362 | * If you are unsure about this setting, do not have a reverse proxy, 363 | * or Drupal operates in a shared hosting environment, this setting 364 | * should remain commented out. 365 | * 366 | * In order for this setting to be used you must specify every possible 367 | * reverse proxy IP address in $settings['reverse_proxy_addresses']. 368 | * If a complete list of reverse proxies is not available in your 369 | * environment (for example, if you use a CDN) you may set the 370 | * $_SERVER['REMOTE_ADDR'] variable directly in settings.php. 371 | * Be aware, however, that it is likely that this would allow IP 372 | * address spoofing unless more advanced precautions are taken. 373 | */ 374 | # $settings['reverse_proxy'] = TRUE; 375 | 376 | /** 377 | * Specify every reverse proxy IP address in your environment. 378 | * This setting is required if $settings['reverse_proxy'] is TRUE. 379 | */ 380 | # $settings['reverse_proxy_addresses'] = array('a.b.c.d', ...); 381 | 382 | /** 383 | * Set this value if your proxy server sends the client IP in a header 384 | * other than X-Forwarded-For. 385 | */ 386 | # $settings['reverse_proxy_header'] = 'X_CLUSTER_CLIENT_IP'; 387 | 388 | /** 389 | * Set this value if your proxy server sends the client protocol in a header 390 | * other than X-Forwarded-Proto. 391 | */ 392 | # $settings['reverse_proxy_proto_header'] = 'X_FORWARDED_PROTO'; 393 | 394 | /** 395 | * Set this value if your proxy server sends the client protocol in a header 396 | * other than X-Forwarded-Host. 397 | */ 398 | # $settings['reverse_proxy_host_header'] = 'X_FORWARDED_HOST'; 399 | 400 | /** 401 | * Set this value if your proxy server sends the client protocol in a header 402 | * other than X-Forwarded-Port. 403 | */ 404 | # $settings['reverse_proxy_port_header'] = 'X_FORWARDED_PORT'; 405 | 406 | /** 407 | * Set this value if your proxy server sends the client protocol in a header 408 | * other than Forwarded. 409 | */ 410 | # $settings['reverse_proxy_forwarded_header'] = 'FORWARDED'; 411 | 412 | /** 413 | * Page caching: 414 | * 415 | * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page 416 | * views. This tells a HTTP proxy that it may return a page from its local 417 | * cache without contacting the web server, if the user sends the same Cookie 418 | * header as the user who originally requested the cached page. Without "Vary: 419 | * Cookie", authenticated users would also be served the anonymous page from 420 | * the cache. If the site has mostly anonymous users except a few known 421 | * editors/administrators, the Vary header can be omitted. This allows for 422 | * better caching in HTTP proxies (including reverse proxies), i.e. even if 423 | * clients send different cookies, they still get content served from the cache. 424 | * However, authenticated users should access the site directly (i.e. not use an 425 | * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid 426 | * getting cached pages from the proxy. 427 | */ 428 | # $settings['omit_vary_cookie'] = TRUE; 429 | 430 | 431 | /** 432 | * Cache TTL for client error (4xx) responses. 433 | * 434 | * Items cached per-URL tend to result in a large number of cache items, and 435 | * this can be problematic on 404 pages which by their nature are unbounded. A 436 | * fixed TTL can be set for these items, defaulting to one hour, so that cache 437 | * backends which do not support LRU can purge older entries. To disable caching 438 | * of client error responses set the value to 0. Currently applies only to 439 | * page_cache module. 440 | */ 441 | # $settings['cache_ttl_4xx'] = 3600; 442 | 443 | 444 | /** 445 | * Class Loader. 446 | * 447 | * If the APC extension is detected, the Symfony APC class loader is used for 448 | * performance reasons. Detection can be prevented by setting 449 | * class_loader_auto_detect to false, as in the example below. 450 | */ 451 | # $settings['class_loader_auto_detect'] = FALSE; 452 | 453 | /* 454 | * If the APC extension is not detected, either because APC is missing or 455 | * because auto-detection has been disabled, auto-loading falls back to 456 | * Composer's ClassLoader, which is good for development as it does not break 457 | * when code is moved in the file system. You can also decorate the base class 458 | * loader with another cached solution than the Symfony APC class loader, as 459 | * all production sites should have a cached class loader of some sort enabled. 460 | * 461 | * To do so, you may decorate and replace the local $class_loader variable. For 462 | * example, to use Symfony's APC class loader without automatic detection, 463 | * uncomment the code below. 464 | */ 465 | /* 466 | if ($settings['hash_salt']) { 467 | $prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']); 468 | $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader); 469 | unset($prefix); 470 | $class_loader->unregister(); 471 | $apc_loader->register(); 472 | $class_loader = $apc_loader; 473 | } 474 | */ 475 | 476 | /** 477 | * Authorized file system operations: 478 | * 479 | * The Update Manager module included with Drupal provides a mechanism for 480 | * site administrators to securely install missing updates for the site 481 | * directly through the web user interface. On securely-configured servers, 482 | * the Update manager will require the administrator to provide SSH or FTP 483 | * credentials before allowing the installation to proceed; this allows the 484 | * site to update the new files as the user who owns all the Drupal files, 485 | * instead of as the user the webserver is running as. On servers where the 486 | * webserver user is itself the owner of the Drupal files, the administrator 487 | * will not be prompted for SSH or FTP credentials (note that these server 488 | * setups are common on shared hosting, but are inherently insecure). 489 | * 490 | * Some sites might wish to disable the above functionality, and only update 491 | * the code directly via SSH or FTP themselves. This setting completely 492 | * disables all functionality related to these authorized file operations. 493 | * 494 | * @see https://www.drupal.org/node/244924 495 | * 496 | * Remove the leading hash signs to disable. 497 | */ 498 | # $settings['allow_authorize_operations'] = FALSE; 499 | 500 | /** 501 | * Default mode for directories and files written by Drupal. 502 | * 503 | * Value should be in PHP Octal Notation, with leading zero. 504 | */ 505 | # $settings['file_chmod_directory'] = 0775; 506 | # $settings['file_chmod_file'] = 0664; 507 | 508 | /** 509 | * Public file base URL: 510 | * 511 | * An alternative base URL to be used for serving public files. This must 512 | * include any leading directory path. 513 | * 514 | * A different value from the domain used by Drupal to be used for accessing 515 | * public files. This can be used for a simple CDN integration, or to improve 516 | * security by serving user-uploaded files from a different domain or subdomain 517 | * pointing to the same server. Do not include a trailing slash. 518 | */ 519 | # $settings['file_public_base_url'] = 'http://downloads.example.com/files'; 520 | 521 | /** 522 | * Public file path: 523 | * 524 | * A local file system path where public files will be stored. This directory 525 | * must exist and be writable by Drupal. This directory must be relative to 526 | * the Drupal installation directory and be accessible over the web. 527 | */ 528 | # $settings['file_public_path'] = 'sites/default/files'; 529 | 530 | /** 531 | * Private file path: 532 | * 533 | * A local file system path where private files will be stored. This directory 534 | * must be absolute, outside of the Drupal installation directory and not 535 | * accessible over the web. 536 | * 537 | * Note: Caches need to be cleared when this value is changed to make the 538 | * private:// stream wrapper available to the system. 539 | * 540 | * See https://www.drupal.org/documentation/modules/file for more information 541 | * about securing private files. 542 | */ 543 | # $settings['file_private_path'] = ''; 544 | 545 | /** 546 | * Session write interval: 547 | * 548 | * Set the minimum interval between each session write to database. 549 | * For performance reasons it defaults to 180. 550 | */ 551 | # $settings['session_write_interval'] = 180; 552 | 553 | /** 554 | * String overrides: 555 | * 556 | * To override specific strings on your site with or without enabling the Locale 557 | * module, add an entry to this list. This functionality allows you to change 558 | * a small number of your site's default English language interface strings. 559 | * 560 | * Remove the leading hash signs to enable. 561 | * 562 | * The "en" part of the variable name, is dynamic and can be any langcode of 563 | * any added language. (eg locale_custom_strings_de for german). 564 | */ 565 | # $settings['locale_custom_strings_en'][''] = array( 566 | # 'forum' => 'Discussion board', 567 | # '@count min' => '@count minutes', 568 | # ); 569 | 570 | /** 571 | * A custom theme for the offline page: 572 | * 573 | * This applies when the site is explicitly set to maintenance mode through the 574 | * administration page or when the database is inactive due to an error. 575 | * The template file should also be copied into the theme. It is located inside 576 | * 'core/modules/system/templates/maintenance-page.html.twig'. 577 | * 578 | * Note: This setting does not apply to installation and update pages. 579 | */ 580 | # $settings['maintenance_theme'] = 'bartik'; 581 | 582 | /** 583 | * PHP settings: 584 | * 585 | * To see what PHP settings are possible, including whether they can be set at 586 | * runtime (by using ini_set()), read the PHP documentation: 587 | * http://php.net/manual/ini.list.php 588 | * See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime 589 | * settings and the .htaccess file for non-runtime settings. 590 | * Settings defined there should not be duplicated here so as to avoid conflict 591 | * issues. 592 | */ 593 | 594 | /** 595 | * If you encounter a situation where users post a large amount of text, and 596 | * the result is stripped out upon viewing but can still be edited, Drupal's 597 | * output filter may not have sufficient memory to process it. If you 598 | * experience this issue, you may wish to uncomment the following two lines 599 | * and increase the limits of these variables. For more information, see 600 | * http://php.net/manual/pcre.configuration.php. 601 | */ 602 | # ini_set('pcre.backtrack_limit', 200000); 603 | # ini_set('pcre.recursion_limit', 200000); 604 | 605 | /** 606 | * Active configuration settings. 607 | * 608 | * By default, the active configuration is stored in the database in the 609 | * {config} table. To use a different storage mechanism for the active 610 | * configuration, do the following prior to installing: 611 | * - Create an "active" directory and declare its path in $config_directories 612 | * as explained under the 'Location of the site configuration files' section 613 | * above in this file. To enhance security, you can declare a path that is 614 | * outside your document root. 615 | * - Override the 'bootstrap_config_storage' setting here. It must be set to a 616 | * callable that returns an object that implements 617 | * \Drupal\Core\Config\StorageInterface. 618 | * - Override the service definition 'config.storage.active'. Put this 619 | * override in a services.yml file in the same directory as settings.php 620 | * (definitions in this file will override service definition defaults). 621 | */ 622 | # $settings['bootstrap_config_storage'] = array('Drupal\Core\Config\BootstrapConfigStorageFactory', 'getFileStorage'); 623 | 624 | /** 625 | * Configuration overrides. 626 | * 627 | * To globally override specific configuration values for this site, 628 | * set them here. You usually don't need to use this feature. This is 629 | * useful in a configuration file for a vhost or directory, rather than 630 | * the default settings.php. 631 | * 632 | * Note that any values you provide in these variable overrides will not be 633 | * viewable from the Drupal administration interface. The administration 634 | * interface displays the values stored in configuration so that you can stage 635 | * changes to other environments that don't have the overrides. 636 | * 637 | * There are particular configuration values that are risky to override. For 638 | * example, overriding the list of installed modules in 'core.extension' is not 639 | * supported as module install or uninstall has not occurred. Other examples 640 | * include field storage configuration, because it has effects on database 641 | * structure, and 'core.menu.static_menu_link_overrides' since this is cached in 642 | * a way that is not config override aware. Also, note that changing 643 | * configuration values in settings.php will not fire any of the configuration 644 | * change events. 645 | */ 646 | # $config['system.site']['name'] = 'My Drupal site'; 647 | # $config['system.theme']['default'] = 'stark'; 648 | # $config['user.settings']['anonymous'] = 'Visitor'; 649 | 650 | /** 651 | * Fast 404 pages: 652 | * 653 | * Drupal can generate fully themed 404 pages. However, some of these responses 654 | * are for images or other resource files that are not displayed to the user. 655 | * This can waste bandwidth, and also generate server load. 656 | * 657 | * The options below return a simple, fast 404 page for URLs matching a 658 | * specific pattern: 659 | * - $config['system.performance']['fast_404']['exclude_paths']: A regular 660 | * expression to match paths to exclude, such as images generated by image 661 | * styles, or dynamically-resized images. The default pattern provided below 662 | * also excludes the private file system. If you need to add more paths, you 663 | * can add '|path' to the expression. 664 | * - $config['system.performance']['fast_404']['paths']: A regular expression to 665 | * match paths that should return a simple 404 page, rather than the fully 666 | * themed 404 page. If you don't have any aliases ending in htm or html you 667 | * can add '|s?html?' to the expression. 668 | * - $config['system.performance']['fast_404']['html']: The html to return for 669 | * simple 404 pages. 670 | * 671 | * Remove the leading hash signs if you would like to alter this functionality. 672 | */ 673 | # $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//'; 674 | # $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; 675 | # $config['system.performance']['fast_404']['html'] = '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'; 676 | 677 | /** 678 | * Load services definition file. 679 | */ 680 | $settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; 681 | 682 | /** 683 | * Override the default service container class. 684 | * 685 | * This is useful for example to trace the service container for performance 686 | * tracking purposes, for testing a service container with an error condition or 687 | * to test a service container that throws an exception. 688 | */ 689 | # $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; 690 | 691 | /** 692 | * Override the default yaml parser class. 693 | * 694 | * Provide a fully qualified class name here if you would like to provide an 695 | * alternate implementation YAML parser. The class must implement the 696 | * \Drupal\Component\Serialization\SerializationInterface interface. 697 | */ 698 | # $settings['yaml_parser_class'] = NULL; 699 | 700 | /** 701 | * Trusted host configuration. 702 | * 703 | * Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host 704 | * header spoofing. 705 | * 706 | * To enable the trusted host mechanism, you enable your allowable hosts 707 | * in $settings['trusted_host_patterns']. This should be an array of regular 708 | * expression patterns, without delimiters, representing the hosts you would 709 | * like to allow. 710 | * 711 | * For example: 712 | * @code 713 | * $settings['trusted_host_patterns'] = array( 714 | * '^www\.example\.com$', 715 | * ); 716 | * @endcode 717 | * will allow the site to only run from www.example.com. 718 | * 719 | * If you are running multisite, or if you are running your site from 720 | * different domain names (eg, you don't redirect http://www.example.com to 721 | * http://example.com), you should specify all of the host patterns that are 722 | * allowed by your site. 723 | * 724 | * For example: 725 | * @code 726 | * $settings['trusted_host_patterns'] = array( 727 | * '^example\.com$', 728 | * '^.+\.example\.com$', 729 | * '^example\.org$', 730 | * '^.+\.example\.org$', 731 | * ); 732 | * @endcode 733 | * will allow the site to run off of all variants of example.com and 734 | * example.org, with all subdomains included. 735 | */ 736 | 737 | /** 738 | * The default list of directories that will be ignored by Drupal's file API. 739 | * 740 | * By default ignore node_modules and bower_components folders to avoid issues 741 | * with common frontend tools and recursive scanning of directories looking for 742 | * extensions. 743 | * 744 | * @see file_scan_directory() 745 | * @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() 746 | */ 747 | $settings['file_scan_ignore_directories'] = [ 748 | 'node_modules', 749 | 'bower_components', 750 | ]; 751 | 752 | /** 753 | * Load local development override configuration, if available. 754 | * 755 | * Use settings.local.php to override variables on secondary (staging, 756 | * development, etc) installations of this site. Typically used to disable 757 | * caching, JavaScript/CSS compression, re-routing of outgoing emails, and 758 | * other things that should not happen on development and testing sites. 759 | * 760 | * Keep this code block at the end of this file to take full effect. 761 | */ 762 | # 763 | # if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) { 764 | # include $app_root . '/' . $site_path . '/settings.local.php'; 765 | # } 766 | --------------------------------------------------------------------------------