├── .gitignore ├── README.md ├── RoboFile.php ├── base_files ├── default.services.yml.dist └── default.settings.php.dist ├── composer.json ├── properties.yml.dist ├── salt.txt └── web ├── autoload.php └── sites ├── default ├── default.services.yml └── default.settings.php ├── development.services.yml ├── example.settings.local.php └── example.sites.php /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore directories generated by Composer 2 | drush/contrib 3 | vendor 4 | web/core 5 | web/modules/contrib 6 | web/themes/contrib 7 | web/profiles/contrib 8 | bin 9 | composer.lock 10 | 11 | # Ignore Drupal's file directory 12 | web/composer.lock 13 | web/sites/*/files 14 | web/sites/*/services.yml 15 | web/sites/*/settings.php 16 | web/sites.php 17 | web/sites/sites.php 18 | config 19 | web/robots.txt 20 | web/index.php 21 | web/update.php 22 | web/web.config 23 | web/.csslintrc 24 | web/.editorconfig 25 | web/.eslintignore 26 | web/.eslintrc 27 | web/.gitattributes 28 | web/.htaccess 29 | 30 | # Ignore files generated by PhpStorm 31 | .idea 32 | .phpintel 33 | 34 | # Build 35 | properties.yml 36 | !web/autoload.php 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # drupal8 Base 2 | 3 | Drupal 8 Base is a fresh and clean repo to begin with a new installation of Drupal 8 but with the Configuration 4 | Management based on the File and not the Database storage. It provide also a Robofile to create a new 5 | Drupal 8 installation. 6 | 7 | Like the official composer-project command provide a starting point for your project but without some crucial files 8 | like `settings.php` and `services.php` that are under version control on official repository. 9 | 10 | After the `composer install` you will have all files updated at latest develop version of Drupal, a directory tree free 11 | from any repository (autoclean) and your next project ready to be installed. 12 | 13 | ## Requirements 14 | 1. mysql client (mysql CLI) 15 | 2. Composer - http://getcomposer.org 16 | 17 | ## Starting point (loc). 18 | 1. Just clone this repo and launch `composer install` 19 | 2. Copy the `properties.yml.dist` file to `properties.yml` and replace default values with your env values. 20 | 3. Launch the command `bin/robo build`. 21 | 4. Init a git repo, then commit and push the code. 22 | -------------------------------------------------------------------------------- /RoboFile.php: -------------------------------------------------------------------------------- 1 | projectProperties = $this->getProjectProperties(); 18 | } 19 | 20 | // Build. 21 | function build() { 22 | 23 | // Download Drupal. 24 | $this->_exec('bin/drupal site:new drupalcore ' . $this->projectProperties['properties']['drupal.version']); 25 | $this->taskRsync() 26 | ->fromPath('drupalcore/') 27 | ->toPath($this->projectProperties['properties']['root']) 28 | ->archive() 29 | ->verbose() 30 | ->compress() 31 | ->delete() 32 | ->progress() 33 | ->humanReadable() 34 | ->excludeVcs() 35 | ->exclude('autoload.php') 36 | ->exclude('composer.json') 37 | ->exclude('core') 38 | ->exclude('drush') 39 | ->exclude('example.gitignore') 40 | ->exclude('README.txt') 41 | ->exclude('LICENSE.txt') 42 | ->exclude('vendor') 43 | ->exclude('modules') 44 | ->exclude('themes') 45 | ->exclude('profiles') 46 | ->exclude('sites/default/files') 47 | ->run(); 48 | $this->_exec('rm -rf drupalcore'); 49 | 50 | // Config directory. 51 | $this->_exec('rm -r ' . $this->escapeArg( __DIR__ . '/config')); 52 | $this->_exec('mkdir ' . $this->escapeArg(__DIR__ . '/config')); 53 | $this->_exec('mkdir ' . $this->escapeArg(__DIR__ . '/config/active')); 54 | $this->_exec('mkdir ' . $this->escapeArg(__DIR__ . '/config/staging')); 55 | $this->_exec('mkdir ' . $this->escapeArg(__DIR__ . '/config/sync')); 56 | $this->_exec('mkdir -m 777 ' . $this->escapeArg(__DIR__ . '/web/sites/default/files')); 57 | 58 | // Config files. 59 | $this->_exec('chmod 755 ' . $this->escapeArg(__DIR__ . '/web/sites/default/')); 60 | $this->_exec('chmod 755 ' . $this->escapeArg(__DIR__ . '/web/sites/default/services.yml')); 61 | $this->_exec('chmod 755 ' . $this->escapeArg(__DIR__ . '/web/sites/default/settings.php')); 62 | $this->_exec('rm ' . $this->escapeArg(__DIR__ . '/web/sites/default/services.yml')); 63 | $this->_exec('rm ' . $this->escapeArg(__DIR__ . '/web/sites/default/settings.php')); 64 | 65 | // Append config settings to settings.php and services.yml to manage file configuration. 66 | $this->taskConcat([ 67 | __DIR__ . '/web/sites/default/default.services.yml', 68 | __DIR__ . '/base_files/default.services.yml.dist', 69 | ]) 70 | ->to(__DIR__ . '/web/sites/default/services.yml') 71 | ->run(); 72 | 73 | $this->taskConcat([ 74 | __DIR__ . '/web/sites/default/default.settings.php', 75 | __DIR__ . '/base_files/default.settings.php.dist', 76 | ]) 77 | ->to(__DIR__ . '/web/sites/default/settings.php') 78 | ->run(); 79 | 80 | $this->taskReplaceInFile(__DIR__ . '/web/sites/default/settings.php') 81 | ->from('%%SETTINGS_INSTALL_PROFILE%%') 82 | ->to($this->projectProperties['properties']['site.profile']) 83 | ->run(); 84 | 85 | // Drop db. 86 | $dropString = 'mysqldump -u ' . $this->projectProperties['properties']['db.user.name'] . ' -p' . $this->projectProperties['properties']['db.user.pass']; 87 | $dropString .= ' ' . $this->projectProperties['properties']['db.name'] . ' --no-data -h ' . $this->projectProperties['properties']['db.host']; 88 | $dropString .= ' -P ' . $this->projectProperties['properties']['db.port']; 89 | $dropString .=' | grep ^DROP | mysql -u '; 90 | $dropString .= $this->projectProperties['properties']['db.user.name'] . ' -p' . $this->projectProperties['properties']['db.user.pass']; 91 | $dropString .= ' -h ' . $this->projectProperties['properties']['db.host']; 92 | $dropString .= ' -P ' . $this->projectProperties['properties']['db.port']; 93 | $dropString .= ' --one-database ' . $this->projectProperties['properties']['db.name']; 94 | $this->_exec($dropString); 95 | 96 | // Install Drupal. 97 | $this->_exec('bin/drupal site:install ' . $this->projectProperties['params'] . ' ' . $this->projectProperties['properties']['site.profile']); 98 | 99 | // Update dependencies. 100 | $this->taskComposerUpdate()->run(); 101 | 102 | // Contrib modules. 103 | $this->installContribModules(); 104 | 105 | // Contrib themes. 106 | $this->installContribThemes(); 107 | 108 | // Languages. 109 | $this->enableLanguages(); 110 | 111 | // Custom modules. 112 | $this->installCustomModules(); 113 | 114 | // Custom themes. 115 | $this->installCustomThemes(); 116 | 117 | $this->say('Build complete'); 118 | } 119 | 120 | private function getProjectProperties() { 121 | // Parse the properties file. 122 | $properties_file = @file_get_contents(__DIR__ . '/properties.yml'); 123 | 124 | if ($properties_file === FALSE) { 125 | throw new \Robo\Exception\TaskException(__CLASS__, "Properties file does not exist"); 126 | } 127 | 128 | $properties = Yaml::parse($properties_file); 129 | $properties['root'] = __DIR__ . '/' . $properties['root']; 130 | $properties['escaped_root_path'] = $this->escapeArg($properties['root']); 131 | 132 | $arr_arguments = array( 133 | '--langcode=' => $properties['site.langcode'], 134 | '--db-type=' => $properties['db.type'], 135 | '--db-host=' => $properties['db.host'], 136 | '--db-name=' => $properties['db.name'], 137 | '--db-user=' => $properties['db.user.name'], 138 | '--db-pass=' => $properties['db.user.pass'], 139 | '--db-prefix=' => $properties['db.prefix'], 140 | '--db-port=' => $properties['db.port'], 141 | '--site-name=' => $properties['site.name'], 142 | '--site-mail=' => $properties['site.mail'], 143 | '--account-name=' => $properties['site.account.name'], 144 | '--account-mail=' => $properties['site.account.mail'], 145 | '--account-pass=' => $properties['site.account.pass'], 146 | '--env=' => $properties['env'], 147 | '--root=' => $properties['root'], 148 | ); 149 | 150 | $params_string = ''; 151 | foreach ($arr_arguments as $key => $value) { 152 | $params_string .= $key . '"' . $value . '" '; 153 | } 154 | 155 | return array( 156 | 'properties' => $properties, 157 | 'params' => $params_string, 158 | ); 159 | } 160 | 161 | // Enable languages. 162 | private function enableLanguages() { 163 | if (isset($this->projectProperties['properties']['languages']) && 164 | count($this->projectProperties['properties']['languages']) !== 0) { 165 | foreach ($this->projectProperties['properties']['languages'] as $language) { 166 | $this->_exec('bin/drupal locale:language:add --root=' . $this->projectProperties['properties']['escaped_root_path'] . ' -e=' . $this->projectProperties['properties']['env'] . ' ' . $language)->stopOnFail(); 167 | } 168 | } 169 | } 170 | 171 | // Install contrib modules. 172 | private function installContribModules() { 173 | if (isset($this->projectProperties['properties']['modules']['contrib']) && 174 | count($this->projectProperties['properties']['modules']['contrib']) !== 0) { 175 | foreach ($this->projectProperties['properties']['modules']['contrib'] as $module) { 176 | $this->_exec('bin/drupal module:install --root=' . $this->projectProperties['properties']['escaped_root_path'] . ' -e=' . $this->projectProperties['properties']['env'] . ' ' . $module)->stopOnFail(); 177 | } 178 | } 179 | } 180 | 181 | // Install custom modules. 182 | private function installCustomModules() { 183 | if (isset($this->projectProperties['properties']['modules']['custom']) && 184 | count($this->projectProperties['properties']['modules']['custom']) !== 0) { 185 | foreach ($this->projectProperties['properties']['modules']['custom'] as $module) { 186 | $this->_exec('bin/drupal module:install --root=' . $this->projectProperties['properties']['escaped_root_path'] . ' -e=' . $this->projectProperties['properties']['env'] . ' --overwrite-config ' . $module)->stopOnFail(); 187 | } 188 | } 189 | } 190 | 191 | // Install contrib themes. 192 | private function installContribThemes() { 193 | if (isset($this->projectProperties['properties']['themes']['contrib']) && 194 | count($this->projectProperties['properties']['themes']['contrib']) !== 0) { 195 | foreach ($this->projectProperties['properties']['themes']['contrib'] as $theme) { 196 | $this->_exec('bin/drupal theme:install --root=' . $this->projectProperties['properties']['escaped_root_path'] . ' -e=' . $this->projectProperties['properties']['env'] . ' ' . $theme)->stopOnFail(); 197 | } 198 | } 199 | } 200 | 201 | // Install custom themes. 202 | private function installCustomThemes() { 203 | if (isset($this->projectProperties['properties']['themes']['custom']) && 204 | count($this->projectProperties['properties']['themes']['custom']) !== 0) { 205 | foreach ($this->projectProperties['properties']['themes']['custom'] as $theme) { 206 | $this->_exec('bin/drupal theme:install --root=' . $this->projectProperties['properties']['escaped_root_path'] . ' -e=' . $this->projectProperties['properties']['env'] . ' ' . $theme)->stopOnFail(); 207 | } 208 | } 209 | } 210 | 211 | // See Symfony\Component\Console\Input. 212 | private function escapeArg($string) { 213 | return preg_match('{^[\w-]+$}', $string) ? $string : escapeshellarg($string); 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /base_files/default.services.yml.dist: -------------------------------------------------------------------------------- 1 | services: 2 | config.storage: 3 | class: Drupal\Core\Config\CachedStorage 4 | arguments: ['@config.storage.active', '@cache.config'] 5 | config.storage.active: 6 | class: Drupal\Core\Config\FileStorage 7 | factory: Drupal\Core\Config\FileStorageFactory::getActive -------------------------------------------------------------------------------- /base_files/default.settings.php.dist: -------------------------------------------------------------------------------- 1 | $settings['bootstrap_config_storage'] = array( 2 | 'Drupal\Core\Config\BootstrapConfigStorageFactory', 3 | 'getFileStorage' 4 | ); 5 | 6 | $config_directories = array( 7 | CONFIG_ACTIVE_DIRECTORY => './../config/active/', 8 | CONFIG_STAGING_DIRECTORY => './../config/staging/', 9 | CONFIG_SYNC_DIRECTORY => './../config/sync/', 10 | ); 11 | 12 | $settings['install_profile'] = '%%SETTINGS_INSTALL_PROFILE%%'; 13 | 14 | $settings['hash_salt'] = file_get_contents('./../salt.txt'); 15 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vincenzodibiaggio/drupal8_base", 3 | "description": "Base installation to new Drupal8 Project. Inspired to drupal-composer project but most clean and with file-based Configuration Management", 4 | "type": "project", 5 | "license": "GPL-2.0+", 6 | "authors": [ 7 | { 8 | "name": "Vincenzo Di Biaggio", 9 | "role": "Developer" 10 | } 11 | ], 12 | "repositories": [ 13 | { 14 | "type": "composer", 15 | "url": "https://packagist.drupal-composer.org" 16 | } 17 | ], 18 | "require": { 19 | "drupal/core": "8.0.5", 20 | "drush/drush": "^8.1.0", 21 | "alchemy/zippy": "0.3.5", 22 | "drupal/console": "~0.11", 23 | "drupal/config_update": "8.1.*@dev", 24 | "drupal/bootstrap": "8.3.0-beta3", 25 | "drupal/adminimal_theme": "8.1.1" 26 | }, 27 | "require-dev": { 28 | "behat/mink": "~1.6", 29 | "behat/mink-goutte-driver": "~1.2", 30 | "mikey179/vfsStream": "~1.2", 31 | "phpunit/phpunit": "~4.8", 32 | "symfony/css-selector": "2.7.*", 33 | "codegyre/robo": "*" 34 | }, 35 | "minimum-stability": "dev", 36 | "prefer-stable": true, 37 | "config": { 38 | "bin-dir": "bin/" 39 | }, 40 | "extra": { 41 | "installer-paths": { 42 | "web/core": ["type:drupal-core"], 43 | "web/modules/contrib/{$name}": ["type:drupal-module"], 44 | "web/profiles/contrib/{$name}": ["type:drupal-profile"], 45 | "web/themes/contrib/{$name}": ["type:drupal-theme"], 46 | "drush/contrib/{$name}": ["type:drupal-drush"] 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /properties.yml.dist: -------------------------------------------------------------------------------- 1 | drupal.version: 8.0.5 2 | env: loc 3 | root: web 4 | db.user.name: USER 5 | db.user.pass: PASS 6 | db.host: HOST 7 | db.port: PORT 8 | db.name: DB_NAME 9 | db.type: DB_TYPE 10 | db.prefix: DB_PREFIX 11 | site.name: SITE_NAME 12 | site.langcode: en 13 | site.profile: standard 14 | site.mail: SITE_MAIL 15 | site.account.name: USER 16 | site.account.pass: PASS 17 | site.account.mail: USER_MAIL 18 | 19 | languages: 20 | - additional_language ('it' for Italian) 21 | 22 | modules: 23 | contrib: 24 | - config_update 25 | - language 26 | - locale 27 | 28 | custom: 29 | - module_a 30 | 31 | themes: 32 | contrib: 33 | - adminimal_theme 34 | - bootstrap 35 | -------------------------------------------------------------------------------- /salt.txt: -------------------------------------------------------------------------------- 1 | dsadfas£$543SDFgfsd#@FDSAFads454235gfasdfgasdf$% -------------------------------------------------------------------------------- /web/autoload.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 | * To provide prefixes for specific tables, set 'prefix' as an array. 148 | * The array's keys are the table names and the values are the prefixes. 149 | * The 'default' element is mandatory and holds the prefix for any tables 150 | * not specified elsewhere in the array. Example: 151 | * @code 152 | * 'prefix' => array( 153 | * 'default' => 'main_', 154 | * 'users' => 'shared_', 155 | * 'sessions' => 'shared_', 156 | * 'role' => 'shared_', 157 | * 'authmap' => 'shared_', 158 | * ), 159 | * @endcode 160 | * You can also use a reference to a schema/database as a prefix. This may be 161 | * useful if your Drupal installation exists in a schema that is not the default 162 | * or you want to access several databases from the same code base at the same 163 | * time. 164 | * Example: 165 | * @code 166 | * 'prefix' => array( 167 | * 'default' => 'main.', 168 | * 'users' => 'shared.', 169 | * 'sessions' => 'shared.', 170 | * 'role' => 'shared.', 171 | * 'authmap' => 'shared.', 172 | * ); 173 | * @endcode 174 | * NOTE: MySQL and SQLite's definition of a schema is a database. 175 | * 176 | * Advanced users can add or override initial commands to execute when 177 | * connecting to the database server, as well as PDO connection settings. For 178 | * example, to enable MySQL SELECT queries to exceed the max_join_size system 179 | * variable, and to reduce the database connection timeout to 5 seconds: 180 | * @code 181 | * $databases['default']['default'] = array( 182 | * 'init_commands' => array( 183 | * 'big_selects' => 'SET SQL_BIG_SELECTS=1', 184 | * ), 185 | * 'pdo' => array( 186 | * PDO::ATTR_TIMEOUT => 5, 187 | * ), 188 | * ); 189 | * @endcode 190 | * 191 | * WARNING: The above defaults are designed for database portability. Changing 192 | * them may cause unexpected behavior, including potential data loss. See 193 | * https://www.drupal.org/developing/api/database/configuration for more 194 | * information on these defaults and the potential issues. 195 | * 196 | * More details can be found in the constructor methods for each driver: 197 | * - \Drupal\Core\Database\Driver\mysql\Connection::__construct() 198 | * - \Drupal\Core\Database\Driver\pgsql\Connection::__construct() 199 | * - \Drupal\Core\Database\Driver\sqlite\Connection::__construct() 200 | * 201 | * Sample Database configuration format for PostgreSQL (pgsql): 202 | * @code 203 | * $databases['default']['default'] = array( 204 | * 'driver' => 'pgsql', 205 | * 'database' => 'databasename', 206 | * 'username' => 'sqlusername', 207 | * 'password' => 'sqlpassword', 208 | * 'host' => 'localhost', 209 | * 'prefix' => '', 210 | * ); 211 | * @endcode 212 | * 213 | * Sample Database configuration format for SQLite (sqlite): 214 | * @code 215 | * $databases['default']['default'] = array( 216 | * 'driver' => 'sqlite', 217 | * 'database' => '/path/to/databasefilename', 218 | * ); 219 | * @endcode 220 | */ 221 | 222 | /** 223 | * Location of the site configuration files. 224 | * 225 | * The $config_directories array specifies the location of file system 226 | * directories used for configuration data. On install, the "sync" directory is 227 | * created. This is used for configuration imports. The "active" directory is 228 | * not created by default since the default storage for active configuration is 229 | * the database rather than the file system. (This can be changed. See "Active 230 | * configuration settings" below). 231 | * 232 | * The default location for the "sync" directory is inside a randomly-named 233 | * directory in the public files path. The setting below allows you to override 234 | * the "sync" location. 235 | * 236 | * If you use files for the "active" configuration, you can tell the 237 | * Configuration system where this directory is located by adding an entry with 238 | * array key CONFIG_ACTIVE_DIRECTORY. 239 | * 240 | * Example: 241 | * @code 242 | * $config_directories = array( 243 | * CONFIG_SYNC_DIRECTORY => '/directory/outside/webroot', 244 | * ); 245 | * @endcode 246 | */ 247 | $config_directories = array(); 248 | 249 | /** 250 | * Settings: 251 | * 252 | * $settings contains environment-specific configuration, such as the files 253 | * directory and reverse proxy address, and temporary configuration, such as 254 | * security overrides. 255 | * 256 | * @see \Drupal\Core\Site\Settings::get() 257 | */ 258 | 259 | /** 260 | * The active installation profile. 261 | * 262 | * Changing this after installation is not recommended as it changes which 263 | * directories are scanned during extension discovery. If this is set prior to 264 | * installation this value will be rewritten according to the profile selected 265 | * by the user. 266 | * 267 | * @see install_select_profile() 268 | */ 269 | # $settings['install_profile'] = ''; 270 | 271 | /** 272 | * Salt for one-time login links, cancel links, form tokens, etc. 273 | * 274 | * This variable will be set to a random value by the installer. All one-time 275 | * login links will be invalidated if the value is changed. Note that if your 276 | * site is deployed on a cluster of web servers, you must ensure that this 277 | * variable has the same value on each server. 278 | * 279 | * For enhanced security, you may set this variable to the contents of a file 280 | * outside your document root; you should also ensure that this file is not 281 | * stored with backups of your database. 282 | * 283 | * Example: 284 | * @code 285 | * $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); 286 | * @endcode 287 | */ 288 | $settings['hash_salt'] = ''; 289 | 290 | /** 291 | * Deployment identifier. 292 | * 293 | * Drupal's dependency injection container will be automatically invalidated and 294 | * rebuilt when the Drupal core version changes. When updating contributed or 295 | * custom code that changes the container, changing this identifier will also 296 | * allow the container to be invalidated as soon as code is deployed. 297 | */ 298 | # $settings['deployment_identifier'] = \Drupal::VERSION; 299 | 300 | /** 301 | * Access control for update.php script. 302 | * 303 | * If you are updating your Drupal installation using the update.php script but 304 | * are not logged in using either an account with the "Administer software 305 | * updates" permission or the site maintenance account (the account that was 306 | * created during installation), you will need to modify the access check 307 | * statement below. Change the FALSE to a TRUE to disable the access check. 308 | * After finishing the upgrade, be sure to open this file again and change the 309 | * TRUE back to a FALSE! 310 | */ 311 | $settings['update_free_access'] = FALSE; 312 | 313 | /** 314 | * External access proxy settings: 315 | * 316 | * If your site must access the Internet via a web proxy then you can enter the 317 | * proxy settings here. Set the full URL of the proxy, including the port, in 318 | * variables: 319 | * - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP 320 | * requests. 321 | * - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS 322 | * requests. 323 | * You can pass in the user name and password for basic authentication in the 324 | * URLs in these settings. 325 | * 326 | * You can also define an array of host names that can be accessed directly, 327 | * bypassing the proxy, in $settings['http_client_config']['proxy']['no']. 328 | * 329 | * If these settings are not configured, the system environment variables 330 | * HTTP_PROXY, HTTPS_PROXY, and NO_PROXY on the web server will be used instead. 331 | */ 332 | # $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; 333 | # $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; 334 | # $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; 335 | 336 | /** 337 | * Reverse Proxy Configuration: 338 | * 339 | * Reverse proxy servers are often used to enhance the performance 340 | * of heavily visited sites and may also provide other site caching, 341 | * security, or encryption benefits. In an environment where Drupal 342 | * is behind a reverse proxy, the real IP address of the client should 343 | * be determined such that the correct client IP address is available 344 | * to Drupal's logging, statistics, and access management systems. In 345 | * the most simple scenario, the proxy server will add an 346 | * X-Forwarded-For header to the request that contains the client IP 347 | * address. However, HTTP headers are vulnerable to spoofing, where a 348 | * malicious client could bypass restrictions by setting the 349 | * X-Forwarded-For header directly. Therefore, Drupal's proxy 350 | * configuration requires the IP addresses of all remote proxies to be 351 | * specified in $settings['reverse_proxy_addresses'] to work correctly. 352 | * 353 | * Enable this setting to get Drupal to determine the client IP from 354 | * the X-Forwarded-For header (or $settings['reverse_proxy_header'] if set). 355 | * If you are unsure about this setting, do not have a reverse proxy, 356 | * or Drupal operates in a shared hosting environment, this setting 357 | * should remain commented out. 358 | * 359 | * In order for this setting to be used you must specify every possible 360 | * reverse proxy IP address in $settings['reverse_proxy_addresses']. 361 | * If a complete list of reverse proxies is not available in your 362 | * environment (for example, if you use a CDN) you may set the 363 | * $_SERVER['REMOTE_ADDR'] variable directly in settings.php. 364 | * Be aware, however, that it is likely that this would allow IP 365 | * address spoofing unless more advanced precautions are taken. 366 | */ 367 | # $settings['reverse_proxy'] = TRUE; 368 | 369 | /** 370 | * Specify every reverse proxy IP address in your environment. 371 | * This setting is required if $settings['reverse_proxy'] is TRUE. 372 | */ 373 | # $settings['reverse_proxy_addresses'] = array('a.b.c.d', ...); 374 | 375 | /** 376 | * Set this value if your proxy server sends the client IP in a header 377 | * other than X-Forwarded-For. 378 | */ 379 | # $settings['reverse_proxy_header'] = 'X_CLUSTER_CLIENT_IP'; 380 | 381 | /** 382 | * Set this value if your proxy server sends the client protocol in a header 383 | * other than X-Forwarded-Proto. 384 | */ 385 | # $settings['reverse_proxy_proto_header'] = 'X_FORWARDED_PROTO'; 386 | 387 | /** 388 | * Set this value if your proxy server sends the client protocol in a header 389 | * other than X-Forwarded-Host. 390 | */ 391 | # $settings['reverse_proxy_host_header'] = 'X_FORWARDED_HOST'; 392 | 393 | /** 394 | * Set this value if your proxy server sends the client protocol in a header 395 | * other than X-Forwarded-Port. 396 | */ 397 | # $settings['reverse_proxy_port_header'] = 'X_FORWARDED_PORT'; 398 | 399 | /** 400 | * Set this value if your proxy server sends the client protocol in a header 401 | * other than Forwarded. 402 | */ 403 | # $settings['reverse_proxy_forwarded_header'] = 'FORWARDED'; 404 | 405 | /** 406 | * Page caching: 407 | * 408 | * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page 409 | * views. This tells a HTTP proxy that it may return a page from its local 410 | * cache without contacting the web server, if the user sends the same Cookie 411 | * header as the user who originally requested the cached page. Without "Vary: 412 | * Cookie", authenticated users would also be served the anonymous page from 413 | * the cache. If the site has mostly anonymous users except a few known 414 | * editors/administrators, the Vary header can be omitted. This allows for 415 | * better caching in HTTP proxies (including reverse proxies), i.e. even if 416 | * clients send different cookies, they still get content served from the cache. 417 | * However, authenticated users should access the site directly (i.e. not use an 418 | * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid 419 | * getting cached pages from the proxy. 420 | */ 421 | # $settings['omit_vary_cookie'] = TRUE; 422 | 423 | /** 424 | * Class Loader. 425 | * 426 | * If the APC extension is detected, the Symfony APC class loader is used for 427 | * performance reasons. Detection can be prevented by setting 428 | * class_loader_auto_detect to false, as in the example below. 429 | */ 430 | # $settings['class_loader_auto_detect'] = FALSE; 431 | 432 | /* 433 | * If the APC extension is not detected, either because APC is missing or 434 | * because auto-detection has been disabled, auto-loading falls back to 435 | * Composer's ClassLoader, which is good for development as it does not break 436 | * when code is moved in the file system. You can also decorate the base class 437 | * loader with another cached solution than the Symfony APC class loader, as 438 | * all production sites should have a cached class loader of some sort enabled. 439 | * 440 | * To do so, you may decorate and replace the local $class_loader variable. For 441 | * example, to use Symfony's APC class loader without automatic detection, 442 | * uncomment the code below. 443 | */ 444 | /* 445 | if ($settings['hash_salt']) { 446 | $prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']); 447 | $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader); 448 | unset($prefix); 449 | $class_loader->unregister(); 450 | $apc_loader->register(); 451 | $class_loader = $apc_loader; 452 | } 453 | */ 454 | 455 | /** 456 | * Authorized file system operations: 457 | * 458 | * The Update Manager module included with Drupal provides a mechanism for 459 | * site administrators to securely install missing updates for the site 460 | * directly through the web user interface. On securely-configured servers, 461 | * the Update manager will require the administrator to provide SSH or FTP 462 | * credentials before allowing the installation to proceed; this allows the 463 | * site to update the new files as the user who owns all the Drupal files, 464 | * instead of as the user the webserver is running as. On servers where the 465 | * webserver user is itself the owner of the Drupal files, the administrator 466 | * will not be prompted for SSH or FTP credentials (note that these server 467 | * setups are common on shared hosting, but are inherently insecure). 468 | * 469 | * Some sites might wish to disable the above functionality, and only update 470 | * the code directly via SSH or FTP themselves. This setting completely 471 | * disables all functionality related to these authorized file operations. 472 | * 473 | * @see https://www.drupal.org/node/244924 474 | * 475 | * Remove the leading hash signs to disable. 476 | */ 477 | # $settings['allow_authorize_operations'] = FALSE; 478 | 479 | /** 480 | * Default mode for directories and files written by Drupal. 481 | * 482 | * Value should be in PHP Octal Notation, with leading zero. 483 | */ 484 | # $settings['file_chmod_directory'] = 0775; 485 | # $settings['file_chmod_file'] = 0664; 486 | 487 | /** 488 | * Public file base URL: 489 | * 490 | * An alternative base URL to be used for serving public files. This must 491 | * include any leading directory path. 492 | * 493 | * A different value from the domain used by Drupal to be used for accessing 494 | * public files. This can be used for a simple CDN integration, or to improve 495 | * security by serving user-uploaded files from a different domain or subdomain 496 | * pointing to the same server. Do not include a trailing slash. 497 | */ 498 | # $settings['file_public_base_url'] = 'http://downloads.example.com/files'; 499 | 500 | /** 501 | * Public file path: 502 | * 503 | * A local file system path where public files will be stored. This directory 504 | * must exist and be writable by Drupal. This directory must be relative to 505 | * the Drupal installation directory and be accessible over the web. 506 | */ 507 | # $settings['file_public_path'] = 'sites/default/files'; 508 | 509 | /** 510 | * Private file path: 511 | * 512 | * A local file system path where private files will be stored. This directory 513 | * must be absolute, outside of the Drupal installation directory and not 514 | * accessible over the web. 515 | * 516 | * Note: Caches need to be cleared when this value is changed to make the 517 | * private:// stream wrapper available to the system. 518 | * 519 | * See https://www.drupal.org/documentation/modules/file for more information 520 | * about securing private files. 521 | */ 522 | # $settings['file_private_path'] = ''; 523 | 524 | /** 525 | * Session write interval: 526 | * 527 | * Set the minimum interval between each session write to database. 528 | * For performance reasons it defaults to 180. 529 | */ 530 | # $settings['session_write_interval'] = 180; 531 | 532 | /** 533 | * String overrides: 534 | * 535 | * To override specific strings on your site with or without enabling the Locale 536 | * module, add an entry to this list. This functionality allows you to change 537 | * a small number of your site's default English language interface strings. 538 | * 539 | * Remove the leading hash signs to enable. 540 | * 541 | * The "en" part of the variable name, is dynamic and can be any langcode of 542 | * any added language. (eg locale_custom_strings_de for german). 543 | */ 544 | # $settings['locale_custom_strings_en'][''] = array( 545 | # 'forum' => 'Discussion board', 546 | # '@count min' => '@count minutes', 547 | # ); 548 | 549 | /** 550 | * A custom theme for the offline page: 551 | * 552 | * This applies when the site is explicitly set to maintenance mode through the 553 | * administration page or when the database is inactive due to an error. 554 | * The template file should also be copied into the theme. It is located inside 555 | * 'core/modules/system/templates/maintenance-page.html.twig'. 556 | * 557 | * Note: This setting does not apply to installation and update pages. 558 | */ 559 | # $settings['maintenance_theme'] = 'bartik'; 560 | 561 | /** 562 | * PHP settings: 563 | * 564 | * To see what PHP settings are possible, including whether they can be set at 565 | * runtime (by using ini_set()), read the PHP documentation: 566 | * http://php.net/manual/ini.list.php 567 | * See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime 568 | * settings and the .htaccess file for non-runtime settings. 569 | * Settings defined there should not be duplicated here so as to avoid conflict 570 | * issues. 571 | */ 572 | 573 | /** 574 | * If you encounter a situation where users post a large amount of text, and 575 | * the result is stripped out upon viewing but can still be edited, Drupal's 576 | * output filter may not have sufficient memory to process it. If you 577 | * experience this issue, you may wish to uncomment the following two lines 578 | * and increase the limits of these variables. For more information, see 579 | * http://php.net/manual/pcre.configuration.php. 580 | */ 581 | # ini_set('pcre.backtrack_limit', 200000); 582 | # ini_set('pcre.recursion_limit', 200000); 583 | 584 | /** 585 | * Active configuration settings. 586 | * 587 | * By default, the active configuration is stored in the database in the 588 | * {config} table. To use a different storage mechanism for the active 589 | * configuration, do the following prior to installing: 590 | * - Create an "active" directory and declare its path in $config_directories 591 | * as explained under the 'Location of the site configuration files' section 592 | * above in this file. To enhance security, you can declare a path that is 593 | * outside your document root. 594 | * - Override the 'bootstrap_config_storage' setting here. It must be set to a 595 | * callable that returns an object that implements 596 | * \Drupal\Core\Config\StorageInterface. 597 | * - Override the service definition 'config.storage.active'. Put this 598 | * override in a services.yml file in the same directory as settings.php 599 | * (definitions in this file will override service definition defaults). 600 | */ 601 | # $settings['bootstrap_config_storage'] = array('Drupal\Core\Config\BootstrapConfigStorageFactory', 'getFileStorage'); 602 | 603 | /** 604 | * Configuration overrides. 605 | * 606 | * To globally override specific configuration values for this site, 607 | * set them here. You usually don't need to use this feature. This is 608 | * useful in a configuration file for a vhost or directory, rather than 609 | * the default settings.php. 610 | * 611 | * Note that any values you provide in these variable overrides will not be 612 | * viewable from the Drupal administration interface. The administration 613 | * interface displays the values stored in configuration so that you can stage 614 | * changes to other environments that don't have the overrides. 615 | * 616 | * There are particular configuration values that are risky to override. For 617 | * example, overriding the list of installed modules in 'core.extension' is not 618 | * supported as module install or uninstall has not occurred. Other examples 619 | * include field storage configuration, because it has effects on database 620 | * structure, and 'core.menu.static_menu_link_overrides' since this is cached in 621 | * a way that is not config override aware. Also, note that changing 622 | * configuration values in settings.php will not fire any of the configuration 623 | * change events. 624 | */ 625 | # $config['system.site']['name'] = 'My Drupal site'; 626 | # $config['system.theme']['default'] = 'stark'; 627 | # $config['user.settings']['anonymous'] = 'Visitor'; 628 | 629 | /** 630 | * Fast 404 pages: 631 | * 632 | * Drupal can generate fully themed 404 pages. However, some of these responses 633 | * are for images or other resource files that are not displayed to the user. 634 | * This can waste bandwidth, and also generate server load. 635 | * 636 | * The options below return a simple, fast 404 page for URLs matching a 637 | * specific pattern: 638 | * - $config['system.performance']['fast_404']['exclude_paths']: A regular 639 | * expression to match paths to exclude, such as images generated by image 640 | * styles, or dynamically-resized images. The default pattern provided below 641 | * also excludes the private file system. If you need to add more paths, you 642 | * can add '|path' to the expression. 643 | * - $config['system.performance']['fast_404']['paths']: A regular expression to 644 | * match paths that should return a simple 404 page, rather than the fully 645 | * themed 404 page. If you don't have any aliases ending in htm or html you 646 | * can add '|s?html?' to the expression. 647 | * - $config['system.performance']['fast_404']['html']: The html to return for 648 | * simple 404 pages. 649 | * 650 | * Remove the leading hash signs if you would like to alter this functionality. 651 | */ 652 | # $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//'; 653 | # $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; 654 | # $config['system.performance']['fast_404']['html'] = '404 Not Found

Not Found

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

'; 655 | 656 | /** 657 | * Load services definition file. 658 | */ 659 | $settings['container_yamls'][] = __DIR__ . '/services.yml'; 660 | 661 | /** 662 | * Override the default service container class. 663 | * 664 | * This is useful for example to trace the service container for performance 665 | * tracking purposes, for testing a service container with an error condition or 666 | * to test a service container that throws an exception. 667 | */ 668 | # $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; 669 | 670 | /** 671 | * Trusted host configuration. 672 | * 673 | * Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host 674 | * header spoofing. 675 | * 676 | * To enable the trusted host mechanism, you enable your allowable hosts 677 | * in $settings['trusted_host_patterns']. This should be an array of regular 678 | * expression patterns, without delimiters, representing the hosts you would 679 | * like to allow. 680 | * 681 | * For example: 682 | * @code 683 | * $settings['trusted_host_patterns'] = array( 684 | * '^www\.example\.com$', 685 | * ); 686 | * @endcode 687 | * will allow the site to only run from www.example.com. 688 | * 689 | * If you are running multisite, or if you are running your site from 690 | * different domain names (eg, you don't redirect http://www.example.com to 691 | * http://example.com), you should specify all of the host patterns that are 692 | * allowed by your site. 693 | * 694 | * For example: 695 | * @code 696 | * $settings['trusted_host_patterns'] = array( 697 | * '^example\.com$', 698 | * '^.+\.example\.com$', 699 | * '^example\.org$', 700 | * '^.+\.example\.org$', 701 | * ); 702 | * @endcode 703 | * will allow the site to run off of all variants of example.com and 704 | * example.org, with all subdomains included. 705 | */ 706 | 707 | /** 708 | * Load local development override configuration, if available. 709 | * 710 | * Use settings.local.php to override variables on secondary (staging, 711 | * development, etc) installations of this site. Typically used to disable 712 | * caching, JavaScript/CSS compression, re-routing of outgoing emails, and 713 | * other things that should not happen on development and testing sites. 714 | * 715 | * Keep this code block at the end of this file to take full effect. 716 | */ 717 | # if (file_exists(__DIR__ . '/settings.local.php')) { 718 | # include __DIR__ . '/settings.local.php'; 719 | # } 720 | -------------------------------------------------------------------------------- /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 | services: 6 | cache.backend.null: 7 | class: Drupal\Core\Cache\NullBackendFactory 8 | -------------------------------------------------------------------------------- /web/sites/example.settings.local.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 | --------------------------------------------------------------------------------