├── .ddev ├── commands │ └── web │ │ └── install-nodehive-ce └── config.yaml ├── .github ├── config │ └── settings.php └── workflows │ └── install.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── features.png ├── scripts └── install │ └── install.sh └── web ├── .gitignore ├── modules ├── .gitignore └── custom │ └── nodehive_ce │ ├── config │ ├── beekeeper │ │ └── nodehive-ce │ │ │ └── default │ │ │ ├── content_calendar.content_type_config.article.yml │ │ │ ├── content_calendar.content_type_config.page.yml │ │ │ ├── jsonapi_include.settings.yml │ │ │ ├── jwt.config.yml │ │ │ ├── key.key.jwt_rsa_key.yml │ │ │ ├── language.negotiation.yml │ │ │ ├── rest.resource.entity.user.yml │ │ │ └── workflows.workflow.editorial.yml │ └── install │ │ ├── content_planner.dashboard_tabs_settings.yml │ │ └── content_planner.dashboards.master.yml │ └── nodehive_ce.info.yml ├── profiles └── .gitignore ├── sites ├── .gitignore └── default │ ├── default.services.yml │ ├── default.settings.php │ └── settings.nodehive.php └── themes └── .gitignore /.ddev/commands/web/install-nodehive-ce: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## Description: Install Nodehive CE 4 | ## Usage: install-nodehive-ce 5 | ## Example: "ddev install-nodehive-ce" 6 | 7 | # Use the normal installer script 8 | composer install-nodehive-ce 9 | -------------------------------------------------------------------------------- /.ddev/config.yaml: -------------------------------------------------------------------------------- 1 | name: nodehive-ce 2 | type: drupal10 3 | docroot: web 4 | php_version: "8.3" 5 | webserver_type: nginx-fpm 6 | xdebug_enabled: false 7 | additional_hostnames: [] 8 | additional_fqdns: [] 9 | database: 10 | type: mariadb 11 | version: "10.6" 12 | use_dns_when_possible: true 13 | composer_version: "2" 14 | web_environment: [] 15 | nodejs_version: "18" 16 | -------------------------------------------------------------------------------- /.github/config/settings.php: -------------------------------------------------------------------------------- 1 | 'databasename', 81 | * 'username' => 'sqlusername', 82 | * 'password' => 'sqlpassword', 83 | * 'host' => 'localhost', 84 | * 'port' => '3306', 85 | * 'driver' => 'mysql', 86 | * 'prefix' => '', 87 | * 'collation' => 'utf8mb4_general_ci', 88 | * ]; 89 | * @endcode 90 | */ 91 | $databases = []; 92 | 93 | /** 94 | * Customizing database settings. 95 | * 96 | * Many of the values of the $databases array can be customized for your 97 | * particular database system. Refer to the sample in the section above as a 98 | * starting point. 99 | * 100 | * The "driver" property indicates what Drupal database driver the 101 | * connection should use. This is usually the same as the name of the 102 | * database type, such as mysql or sqlite, but not always. The other 103 | * properties will vary depending on the driver. For SQLite, you must 104 | * specify a database file name in a directory that is writable by the 105 | * webserver. For most other drivers, you must specify a 106 | * username, password, host, and database name. 107 | * 108 | * Drupal core implements drivers for mysql, pgsql, and sqlite. Other drivers 109 | * can be provided by contributed or custom modules. To use a contributed or 110 | * custom driver, the "namespace" property must be set to the namespace of the 111 | * driver. The code in this namespace must be autoloadable prior to connecting 112 | * to the database, and therefore, prior to when module root namespaces are 113 | * added to the autoloader. To add the driver's namespace to the autoloader, 114 | * set the "autoload" property to the PSR-4 base directory of the driver's 115 | * namespace. This is optional for projects managed with Composer if the 116 | * driver's namespace is in Composer's autoloader. 117 | * 118 | * Transaction support is enabled by default for all drivers that support it, 119 | * including MySQL. To explicitly disable it, set the 'transactions' key to 120 | * FALSE. 121 | * Note that some configurations of MySQL, such as the MyISAM engine, don't 122 | * support it and will proceed silently even if enabled. If you experience 123 | * transaction related crashes with such configuration, set the 'transactions' 124 | * key to FALSE. 125 | * 126 | * For each database, you may optionally specify multiple "target" databases. 127 | * A target database allows Drupal to try to send certain queries to a 128 | * different database if it can but fall back to the default connection if not. 129 | * That is useful for primary/replica replication, as Drupal may try to connect 130 | * to a replica server when appropriate and if one is not available will simply 131 | * fall back to the single primary server (The terms primary/replica are 132 | * traditionally referred to as master/slave in database server documentation). 133 | * 134 | * The general format for the $databases array is as follows: 135 | * @code 136 | * $databases['default']['default'] = $info_array; 137 | * $databases['default']['replica'][] = $info_array; 138 | * $databases['default']['replica'][] = $info_array; 139 | * $databases['extra']['default'] = $info_array; 140 | * @endcode 141 | * 142 | * In the above example, $info_array is an array of settings described above. 143 | * The first line sets a "default" database that has one primary database 144 | * (the second level default). The second and third lines create an array 145 | * of potential replica databases. Drupal will select one at random for a given 146 | * request as needed. The fourth line creates a new database with a name of 147 | * "extra". 148 | * 149 | * You can optionally set prefixes for some or all database table names 150 | * by using the 'prefix' setting. If a prefix is specified, the table 151 | * name will be prepended with its value. Be sure to use valid database 152 | * characters only, usually alphanumeric and underscore. If no prefixes 153 | * are desired, leave it as an empty string ''. 154 | * 155 | * To have all database names prefixed, set 'prefix' as a string: 156 | * @code 157 | * 'prefix' => 'main_', 158 | * @endcode 159 | * 160 | * Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in 161 | * Drupal 9.0. After that, only a single prefix for all tables will be 162 | * supported. 163 | * 164 | * To provide prefixes for specific tables, set 'prefix' as an array. 165 | * The array's keys are the table names and the values are the prefixes. 166 | * The 'default' element is mandatory and holds the prefix for any tables 167 | * not specified elsewhere in the array. Example: 168 | * @code 169 | * 'prefix' => [ 170 | * 'default' => 'main_', 171 | * 'users' => 'shared_', 172 | * 'sessions' => 'shared_', 173 | * 'role' => 'shared_', 174 | * 'authmap' => 'shared_', 175 | * ], 176 | * @endcode 177 | * You can also use a reference to a schema/database as a prefix. This may be 178 | * useful if your Drupal installation exists in a schema that is not the default 179 | * or you want to access several databases from the same code base at the same 180 | * time. 181 | * Example: 182 | * @code 183 | * 'prefix' => [ 184 | * 'default' => 'main.', 185 | * 'users' => 'shared.', 186 | * 'sessions' => 'shared.', 187 | * 'role' => 'shared.', 188 | * 'authmap' => 'shared.', 189 | * ]; 190 | * @endcode 191 | * NOTE: MySQL and SQLite's definition of a schema is a database. 192 | * 193 | * Advanced users can add or override initial commands to execute when 194 | * connecting to the database server, as well as PDO connection settings. For 195 | * example, to enable MySQL SELECT queries to exceed the max_join_size system 196 | * variable, and to reduce the database connection timeout to 5 seconds: 197 | * @code 198 | * $databases['default']['default'] = [ 199 | * 'init_commands' => [ 200 | * 'big_selects' => 'SET SQL_BIG_SELECTS=1', 201 | * ], 202 | * 'pdo' => [ 203 | * PDO::ATTR_TIMEOUT => 5, 204 | * ], 205 | * ]; 206 | * @endcode 207 | * 208 | * WARNING: The above defaults are designed for database portability. Changing 209 | * them may cause unexpected behavior, including potential data loss. See 210 | * https://www.drupal.org/developing/api/database/configuration for more 211 | * information on these defaults and the potential issues. 212 | * 213 | * More details can be found in the constructor methods for each driver: 214 | * - \Drupal\Core\Database\Driver\mysql\Connection::__construct() 215 | * - \Drupal\Core\Database\Driver\pgsql\Connection::__construct() 216 | * - \Drupal\Core\Database\Driver\sqlite\Connection::__construct() 217 | * 218 | * Sample Database configuration format for PostgreSQL (pgsql): 219 | * @code 220 | * $databases['default']['default'] = [ 221 | * 'driver' => 'pgsql', 222 | * 'database' => 'databasename', 223 | * 'username' => 'sqlusername', 224 | * 'password' => 'sqlpassword', 225 | * 'host' => 'localhost', 226 | * 'prefix' => '', 227 | * ]; 228 | * @endcode 229 | * 230 | * Sample Database configuration format for SQLite (sqlite): 231 | * @code 232 | * $databases['default']['default'] = [ 233 | * 'driver' => 'sqlite', 234 | * 'database' => '/path/to/databasefilename', 235 | * ]; 236 | * @endcode 237 | * 238 | * Sample Database configuration format for a driver in a contributed module: 239 | * @code 240 | * $databases['default']['default'] = [ 241 | * 'driver' => 'mydriver', 242 | * 'namespace' => 'Drupal\mymodule\Driver\Database\mydriver', 243 | * 'autoload' => 'modules/mymodule/src/Driver/Database/mydriver/', 244 | * 'database' => 'databasename', 245 | * 'username' => 'sqlusername', 246 | * 'password' => 'sqlpassword', 247 | * 'host' => 'localhost', 248 | * 'prefix' => '', 249 | * ]; 250 | * @endcode 251 | */ 252 | 253 | /** 254 | * Location of the site configuration files. 255 | * 256 | * The $settings['config_sync_directory'] specifies the location of file system 257 | * directory used for syncing configuration data. On install, the directory is 258 | * created. This is used for configuration imports. 259 | * 260 | * The default location for this directory is inside a randomly-named 261 | * directory in the public files path. The setting below allows you to set 262 | * its location. 263 | */ 264 | # $settings['config_sync_directory'] = '/directory/outside/webroot'; 265 | 266 | /** 267 | * Settings: 268 | * 269 | * $settings contains environment-specific configuration, such as the files 270 | * directory and reverse proxy address, and temporary configuration, such as 271 | * security overrides. 272 | * 273 | * @see \Drupal\Core\Site\Settings::get() 274 | */ 275 | 276 | /** 277 | * Salt for one-time login links, cancel links, form tokens, etc. 278 | * 279 | * This variable will be set to a random value by the installer. All one-time 280 | * login links will be invalidated if the value is changed. Note that if your 281 | * site is deployed on a cluster of web servers, you must ensure that this 282 | * variable has the same value on each server. 283 | * 284 | * For enhanced security, you may set this variable to the contents of a file 285 | * outside your document root; you should also ensure that this file is not 286 | * stored with backups of your database. 287 | * 288 | * Example: 289 | * @code 290 | * $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); 291 | * @endcode 292 | */ 293 | $settings['hash_salt'] = ''; 294 | 295 | /** 296 | * Deployment identifier. 297 | * 298 | * Drupal's dependency injection container will be automatically invalidated and 299 | * rebuilt when the Drupal core version changes. When updating contributed or 300 | * custom code that changes the container, changing this identifier will also 301 | * allow the container to be invalidated as soon as code is deployed. 302 | */ 303 | # $settings['deployment_identifier'] = \Drupal::VERSION; 304 | 305 | /** 306 | * Access control for update.php script. 307 | * 308 | * If you are updating your Drupal installation using the update.php script but 309 | * are not logged in using either an account with the "Administer software 310 | * updates" permission or the site maintenance account (the account that was 311 | * created during installation), you will need to modify the access check 312 | * statement below. Change the FALSE to a TRUE to disable the access check. 313 | * After finishing the upgrade, be sure to open this file again and change the 314 | * TRUE back to a FALSE! 315 | */ 316 | $settings['update_free_access'] = FALSE; 317 | 318 | /** 319 | * External access proxy settings: 320 | * 321 | * If your site must access the Internet via a web proxy then you can enter the 322 | * proxy settings here. Set the full URL of the proxy, including the port, in 323 | * variables: 324 | * - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP 325 | * requests. 326 | * - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS 327 | * requests. 328 | * You can pass in the user name and password for basic authentication in the 329 | * URLs in these settings. 330 | * 331 | * You can also define an array of host names that can be accessed directly, 332 | * bypassing the proxy, in $settings['http_client_config']['proxy']['no']. 333 | */ 334 | # $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; 335 | # $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; 336 | # $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; 337 | 338 | /** 339 | * Reverse Proxy Configuration: 340 | * 341 | * Reverse proxy servers are often used to enhance the performance 342 | * of heavily visited sites and may also provide other site caching, 343 | * security, or encryption benefits. In an environment where Drupal 344 | * is behind a reverse proxy, the real IP address of the client should 345 | * be determined such that the correct client IP address is available 346 | * to Drupal's logging, statistics, and access management systems. In 347 | * the most simple scenario, the proxy server will add an 348 | * X-Forwarded-For header to the request that contains the client IP 349 | * address. However, HTTP headers are vulnerable to spoofing, where a 350 | * malicious client could bypass restrictions by setting the 351 | * X-Forwarded-For header directly. Therefore, Drupal's proxy 352 | * configuration requires the IP addresses of all remote proxies to be 353 | * specified in $settings['reverse_proxy_addresses'] to work correctly. 354 | * 355 | * Enable this setting to get Drupal to determine the client IP from the 356 | * X-Forwarded-For header. If you are unsure about this setting, do not have a 357 | * reverse proxy, or Drupal operates in a shared hosting environment, this 358 | * setting should remain commented out. 359 | * 360 | * In order for this setting to be used you must specify every possible 361 | * reverse proxy IP address in $settings['reverse_proxy_addresses']. 362 | * If a complete list of reverse proxies is not available in your 363 | * environment (for example, if you use a CDN) you may set the 364 | * $_SERVER['REMOTE_ADDR'] variable directly in settings.php. 365 | * Be aware, however, that it is likely that this would allow IP 366 | * address spoofing unless more advanced precautions are taken. 367 | */ 368 | # $settings['reverse_proxy'] = TRUE; 369 | 370 | /** 371 | * Specify every reverse proxy IP address in your environment. 372 | * This setting is required if $settings['reverse_proxy'] is TRUE. 373 | */ 374 | # $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...]; 375 | 376 | /** 377 | * Reverse proxy trusted headers. 378 | * 379 | * Sets which headers to trust from your reverse proxy. 380 | * 381 | * Common values are: 382 | * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL 383 | * - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 384 | * 385 | * Note the default value of 386 | * @code 387 | * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 388 | * @endcode 389 | * is not secure by default. The value should be set to only the specific 390 | * headers the reverse proxy uses. For example: 391 | * @code 392 | * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL 393 | * @endcode 394 | * This would trust the following headers: 395 | * - X_FORWARDED_FOR 396 | * - X_FORWARDED_HOST 397 | * - X_FORWARDED_PROTO 398 | * - X_FORWARDED_PORT 399 | * 400 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL 401 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 402 | * @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies 403 | */ 404 | # $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED; 405 | 406 | 407 | /** 408 | * Page caching: 409 | * 410 | * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page 411 | * views. This tells a HTTP proxy that it may return a page from its local 412 | * cache without contacting the web server, if the user sends the same Cookie 413 | * header as the user who originally requested the cached page. Without "Vary: 414 | * Cookie", authenticated users would also be served the anonymous page from 415 | * the cache. If the site has mostly anonymous users except a few known 416 | * editors/administrators, the Vary header can be omitted. This allows for 417 | * better caching in HTTP proxies (including reverse proxies), i.e. even if 418 | * clients send different cookies, they still get content served from the cache. 419 | * However, authenticated users should access the site directly (i.e. not use an 420 | * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid 421 | * getting cached pages from the proxy. 422 | */ 423 | # $settings['omit_vary_cookie'] = TRUE; 424 | 425 | 426 | /** 427 | * Cache TTL for client error (4xx) responses. 428 | * 429 | * Items cached per-URL tend to result in a large number of cache items, and 430 | * this can be problematic on 404 pages which by their nature are unbounded. A 431 | * fixed TTL can be set for these items, defaulting to one hour, so that cache 432 | * backends which do not support LRU can purge older entries. To disable caching 433 | * of client error responses set the value to 0. Currently applies only to 434 | * page_cache module. 435 | */ 436 | # $settings['cache_ttl_4xx'] = 3600; 437 | 438 | /** 439 | * Expiration of cached forms. 440 | * 441 | * Drupal's Form API stores details of forms in a cache and these entries are 442 | * kept for at least 6 hours by default. Expired entries are cleared by cron. 443 | * 444 | * @see \Drupal\Core\Form\FormCache::setCache() 445 | */ 446 | # $settings['form_cache_expiration'] = 21600; 447 | 448 | /** 449 | * Class Loader. 450 | * 451 | * If the APCu extension is detected, the classloader will be optimized to use 452 | * it. Set to FALSE to disable this. 453 | * 454 | * @see https://getcomposer.org/doc/articles/autoloader-optimization.md 455 | */ 456 | # $settings['class_loader_auto_detect'] = FALSE; 457 | 458 | /** 459 | * Authorized file system operations: 460 | * 461 | * The Update Manager module included with Drupal provides a mechanism for 462 | * site administrators to securely install missing updates for the site 463 | * directly through the web user interface. On securely-configured servers, 464 | * the Update manager will require the administrator to provide SSH or FTP 465 | * credentials before allowing the installation to proceed; this allows the 466 | * site to update the new files as the user who owns all the Drupal files, 467 | * instead of as the user the webserver is running as. On servers where the 468 | * webserver user is itself the owner of the Drupal files, the administrator 469 | * will not be prompted for SSH or FTP credentials (note that these server 470 | * setups are common on shared hosting, but are inherently insecure). 471 | * 472 | * Some sites might wish to disable the above functionality, and only update 473 | * the code directly via SSH or FTP themselves. This setting completely 474 | * disables all functionality related to these authorized file operations. 475 | * 476 | * @see https://www.drupal.org/node/244924 477 | * 478 | * Remove the leading hash signs to disable. 479 | */ 480 | # $settings['allow_authorize_operations'] = FALSE; 481 | 482 | /** 483 | * Default mode for directories and files written by Drupal. 484 | * 485 | * Value should be in PHP Octal Notation, with leading zero. 486 | */ 487 | # $settings['file_chmod_directory'] = 0775; 488 | # $settings['file_chmod_file'] = 0664; 489 | 490 | /** 491 | * Public file base URL: 492 | * 493 | * An alternative base URL to be used for serving public files. This must 494 | * include any leading directory path. 495 | * 496 | * A different value from the domain used by Drupal to be used for accessing 497 | * public files. This can be used for a simple CDN integration, or to improve 498 | * security by serving user-uploaded files from a different domain or subdomain 499 | * pointing to the same server. Do not include a trailing slash. 500 | */ 501 | # $settings['file_public_base_url'] = 'http://downloads.example.com/files'; 502 | 503 | /** 504 | * Public file path: 505 | * 506 | * A local file system path where public files will be stored. This directory 507 | * must exist and be writable by Drupal. This directory must be relative to 508 | * the Drupal installation directory and be accessible over the web. 509 | */ 510 | # $settings['file_public_path'] = 'sites/default/files'; 511 | 512 | /** 513 | * Private file path: 514 | * 515 | * A local file system path where private files will be stored. This directory 516 | * must be absolute, outside of the Drupal installation directory and not 517 | * accessible over the web. 518 | * 519 | * Note: Caches need to be cleared when this value is changed to make the 520 | * private:// stream wrapper available to the system. 521 | * 522 | * See https://www.drupal.org/documentation/modules/file for more information 523 | * about securing private files. 524 | */ 525 | # $settings['file_private_path'] = ''; 526 | 527 | /** 528 | * Temporary file path: 529 | * 530 | * A local file system path where temporary files will be stored. This directory 531 | * must be absolute, outside of the Drupal installation directory and not 532 | * accessible over the web. 533 | * 534 | * If this is not set, the default for the operating system will be used. 535 | * 536 | * @see \Drupal\Component\FileSystem\FileSystem::getOsTemporaryDirectory() 537 | */ 538 | # $settings['file_temp_path'] = '/tmp'; 539 | 540 | /** 541 | * Session write interval: 542 | * 543 | * Set the minimum interval between each session write to database. 544 | * For performance reasons it defaults to 180. 545 | */ 546 | # $settings['session_write_interval'] = 180; 547 | 548 | /** 549 | * String overrides: 550 | * 551 | * To override specific strings on your site with or without enabling the Locale 552 | * module, add an entry to this list. This functionality allows you to change 553 | * a small number of your site's default English language interface strings. 554 | * 555 | * Remove the leading hash signs to enable. 556 | * 557 | * The "en" part of the variable name, is dynamic and can be any langcode of 558 | * any added language. (eg locale_custom_strings_de for german). 559 | */ 560 | # $settings['locale_custom_strings_en'][''] = [ 561 | # 'forum' => 'Discussion board', 562 | # '@count min' => '@count minutes', 563 | # ]; 564 | 565 | /** 566 | * A custom theme for the offline page: 567 | * 568 | * This applies when the site is explicitly set to maintenance mode through the 569 | * administration page or when the database is inactive due to an error. 570 | * The template file should also be copied into the theme. It is located inside 571 | * 'core/modules/system/templates/maintenance-page.html.twig'. 572 | * 573 | * Note: This setting does not apply to installation and update pages. 574 | */ 575 | # $settings['maintenance_theme'] = 'bartik'; 576 | 577 | /** 578 | * PHP settings: 579 | * 580 | * To see what PHP settings are possible, including whether they can be set at 581 | * runtime (by using ini_set()), read the PHP documentation: 582 | * http://php.net/manual/ini.list.php 583 | * See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime 584 | * settings and the .htaccess file for non-runtime settings. 585 | * Settings defined there should not be duplicated here so as to avoid conflict 586 | * issues. 587 | */ 588 | 589 | /** 590 | * If you encounter a situation where users post a large amount of text, and 591 | * the result is stripped out upon viewing but can still be edited, Drupal's 592 | * output filter may not have sufficient memory to process it. If you 593 | * experience this issue, you may wish to uncomment the following two lines 594 | * and increase the limits of these variables. For more information, see 595 | * http://php.net/manual/pcre.configuration.php. 596 | */ 597 | # ini_set('pcre.backtrack_limit', 200000); 598 | # ini_set('pcre.recursion_limit', 200000); 599 | 600 | /** 601 | * Configuration overrides. 602 | * 603 | * To globally override specific configuration values for this site, 604 | * set them here. You usually don't need to use this feature. This is 605 | * useful in a configuration file for a vhost or directory, rather than 606 | * the default settings.php. 607 | * 608 | * Note that any values you provide in these variable overrides will not be 609 | * viewable from the Drupal administration interface. The administration 610 | * interface displays the values stored in configuration so that you can stage 611 | * changes to other environments that don't have the overrides. 612 | * 613 | * There are particular configuration values that are risky to override. For 614 | * example, overriding the list of installed modules in 'core.extension' is not 615 | * supported as module install or uninstall has not occurred. Other examples 616 | * include field storage configuration, because it has effects on database 617 | * structure, and 'core.menu.static_menu_link_overrides' since this is cached in 618 | * a way that is not config override aware. Also, note that changing 619 | * configuration values in settings.php will not fire any of the configuration 620 | * change events. 621 | */ 622 | # $config['system.site']['name'] = 'My Drupal site'; 623 | # $config['user.settings']['anonymous'] = 'Visitor'; 624 | 625 | /** 626 | * Fast 404 pages: 627 | * 628 | * Drupal can generate fully themed 404 pages. However, some of these responses 629 | * are for images or other resource files that are not displayed to the user. 630 | * This can waste bandwidth, and also generate server load. 631 | * 632 | * The options below return a simple, fast 404 page for URLs matching a 633 | * specific pattern: 634 | * - $config['system.performance']['fast_404']['exclude_paths']: A regular 635 | * expression to match paths to exclude, such as images generated by image 636 | * styles, or dynamically-resized images. The default pattern provided below 637 | * also excludes the private file system. If you need to add more paths, you 638 | * can add '|path' to the expression. 639 | * - $config['system.performance']['fast_404']['paths']: A regular expression to 640 | * match paths that should return a simple 404 page, rather than the fully 641 | * themed 404 page. If you don't have any aliases ending in htm or html you 642 | * can add '|s?html?' to the expression. 643 | * - $config['system.performance']['fast_404']['html']: The html to return for 644 | * simple 404 pages. 645 | * 646 | * Remove the leading hash signs if you would like to alter this functionality. 647 | */ 648 | # $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//'; 649 | # $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; 650 | # $config['system.performance']['fast_404']['html'] = '404 Not Found

Not Found

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

'; 651 | 652 | /** 653 | * Load services definition file. 654 | */ 655 | $settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; 656 | 657 | /** 658 | * Override the default service container class. 659 | * 660 | * This is useful for example to trace the service container for performance 661 | * tracking purposes, for testing a service container with an error condition or 662 | * to test a service container that throws an exception. 663 | */ 664 | # $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; 665 | 666 | /** 667 | * Override the default yaml parser class. 668 | * 669 | * Provide a fully qualified class name here if you would like to provide an 670 | * alternate implementation YAML parser. The class must implement the 671 | * \Drupal\Component\Serialization\SerializationInterface interface. 672 | */ 673 | # $settings['yaml_parser_class'] = NULL; 674 | 675 | /** 676 | * Trusted host configuration. 677 | * 678 | * Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host 679 | * header spoofing. 680 | * 681 | * To enable the trusted host mechanism, you enable your allowable hosts 682 | * in $settings['trusted_host_patterns']. This should be an array of regular 683 | * expression patterns, without delimiters, representing the hosts you would 684 | * like to allow. 685 | * 686 | * For example: 687 | * @code 688 | * $settings['trusted_host_patterns'] = [ 689 | * '^www\.example\.com$', 690 | * ]; 691 | * @endcode 692 | * will allow the site to only run from www.example.com. 693 | * 694 | * If you are running multisite, or if you are running your site from 695 | * different domain names (eg, you don't redirect http://www.example.com to 696 | * http://example.com), you should specify all of the host patterns that are 697 | * allowed by your site. 698 | * 699 | * For example: 700 | * @code 701 | * $settings['trusted_host_patterns'] = [ 702 | * '^example\.com$', 703 | * '^.+\.example\.com$', 704 | * '^example\.org$', 705 | * '^.+\.example\.org$', 706 | * ]; 707 | * @endcode 708 | * will allow the site to run off of all variants of example.com and 709 | * example.org, with all subdomains included. 710 | */ 711 | 712 | /** 713 | * The default list of directories that will be ignored by Drupal's file API. 714 | * 715 | * By default ignore node_modules and bower_components folders to avoid issues 716 | * with common frontend tools and recursive scanning of directories looking for 717 | * extensions. 718 | * 719 | * @see \Drupal\Core\File\FileSystemInterface::scanDirectory() 720 | * @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() 721 | */ 722 | $settings['file_scan_ignore_directories'] = [ 723 | 'node_modules', 724 | 'bower_components', 725 | ]; 726 | 727 | /** 728 | * The default number of entities to update in a batch process. 729 | * 730 | * This is used by update and post-update functions that need to go through and 731 | * change all the entities on a site, so it is useful to increase this number 732 | * if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a 733 | * larger number of entities to be processed in a single batch run. 734 | */ 735 | $settings['entity_update_batch_size'] = 50; 736 | 737 | /** 738 | * Entity update backup. 739 | * 740 | * This is used to inform the entity storage handler that the backup tables as 741 | * well as the original entity type and field storage definitions should be 742 | * retained after a successful entity update process. 743 | */ 744 | $settings['entity_update_backup'] = TRUE; 745 | 746 | /** 747 | * Node migration type. 748 | * 749 | * This is used to force the migration system to use the classic node migrations 750 | * instead of the default complete node migrations. The migration system will 751 | * use the classic node migration only if there are existing migrate_map tables 752 | * for the classic node migrations and they contain data. These tables may not 753 | * exist if you are developing custom migrations and do not want to use the 754 | * complete node migrations. Set this to TRUE to force the use of the classic 755 | * node migrations. 756 | */ 757 | $settings['migrate_node_migrate_type_classic'] = FALSE; 758 | 759 | $databases['default']['default'] = [ 760 | 'database' => 'db', 761 | 'username' => 'db', 762 | 'password' => 'db', 763 | 'prefix' => '', 764 | 'host' => '127.0.0.1', 765 | 'port' => '3306', 766 | 'driver' => 'mysql', 767 | ]; 768 | 769 | -------------------------------------------------------------------------------- /.github/workflows/install.yml: -------------------------------------------------------------------------------- 1 | name: Install Nodehive CE Edition 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | defaults: 10 | run: 11 | shell: bash 12 | 13 | jobs: 14 | nodehive-ce-install: 15 | name: Nodehive CE Install 16 | runs-on: ubuntu-latest 17 | strategy: 18 | fail-fast: false 19 | matrix: 20 | php-versions: ['8.2'] 21 | 22 | services: 23 | mysql: 24 | image: mysql:5.7 25 | env: 26 | MYSQL_ROOT_PASSWORD: db 27 | MYSQL_DATABASE: db 28 | MYSQL_USER: db 29 | MYSQL_PASSWORD: db 30 | ports: 31 | - 3306:3306 32 | options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 33 | 34 | steps: 35 | - name: Checkout Nodehive CE 36 | uses: actions/checkout@v2 37 | with: 38 | repository: NETNODEAG/nodehive-headless-cms-ce 39 | 40 | - name: Setup PHP, with composer and extensions 41 | uses: shivammathur/setup-php@v2 42 | with: 43 | php-version: ${{ matrix.php-versions }} 44 | coverage: none 45 | 46 | - name: Get composer cache directory 47 | id: composercache 48 | run: echo "::set-output name=dir::$(composer config cache-files-dir)" 49 | 50 | - name: Cache composer dependencies 51 | uses: actions/cache@v2 52 | with: 53 | path: ${{ steps.composercache.outputs.dir }} 54 | key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} 55 | restore-keys: ${{ runner.os }}-composer- 56 | 57 | - name: Install dependencies 58 | run: | 59 | composer install 60 | 61 | - name: Configure Drupal settings. 62 | run: | 63 | cp ${GITHUB_WORKSPACE}/.github/config/settings.php ${GITHUB_WORKSPACE}/web/sites/default/settings.php 64 | 65 | - name: Run install script 66 | run: | 67 | ${GITHUB_WORKSPACE}/scripts/install/install.sh --skip-composer 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /vendor 4 | .env 5 | .env.backup 6 | .env.production 7 | .phpunit.result.cache 8 | npm-debug.log 9 | yarn-error.log 10 | /.fleet 11 | /.idea 12 | /.vscode 13 | /.editorconfig 14 | /.gitattributes 15 | 16 | /drush/contrib/ 17 | /vendor/ 18 | /web/core/ 19 | /web/modules/contrib/ 20 | /web/themes/contrib/ 21 | /web/profiles/contrib/ 22 | /web/libraries/ 23 | 24 | # Ignore configuration files that may contain sensitive information. 25 | /web/sites/*/settings.local.php 26 | /web/sites/*/settings.nodehive.php 27 | /web/sites/*/settings.local.*.php 28 | /web/sites/*/settings.php 29 | /nn/lando/settings.local.php 30 | 31 | # Ignore paths that contain user-generated content. 32 | /web/sites/*/files 33 | /web/sites/*/private 34 | /private 35 | /jwt 36 | 37 | # Ignore SimpleTest multi-site environment. 38 | /web/sites/simpletest 39 | 40 | # Ignore files generated by IDEs. 41 | /.idea 42 | /.vscode 43 | 44 | # Ignore any node_modules directory. 45 | node_modules 46 | 47 | # Ignore .env files as they are personal. 48 | /.env 49 | 50 | # Ignore .htaccess within document root. 51 | /web/.htaccess 52 | 53 | # Ignore files generated by Operating Systems. 54 | .DS_Store 55 | 56 | # Ignore project configuration overwrite file. 57 | project_overwrite.conf 58 | 59 | # Ignore console folder. 60 | /console 61 | 62 | # Ignore local Lando files. 63 | .lando.local.yml 64 | 65 | # Ignore any pipeline base. 66 | /scripts/deployment/base 67 | 68 | # Ignore *.sql folders/files. 69 | /db-dumps 70 | /*.sql 71 | 72 | # Ignore .user.ini. 73 | /web/.user.ini 74 | 75 | # Ignore oauth keys. 76 | /oauth/* 77 | 78 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NETNODEAG/nodehive-headless-cms-ce/7b362fa436fe51d917faced6ecaeef2d76c3e063/CHANGELOG.md -------------------------------------------------------------------------------- /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 | 294 | Copyright (C) 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 | , 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NodeHive Headless CMS CE 2 | 3 | ## What is NodeHive Headless CMS? 4 | 5 | NodeHive Headless CMS is a headless composable platform that serves as your central commerce, marketing, communication and customer engagement hub. NodeHive is built on top of the wide spread [Drupal CMS](https://www.drupal.org) and extends Drupal with advanced headless features. 6 | 7 | [](https://www.nodehive.com) 8 | 9 | This repository is the offical NodeHive Headless CMS Community Edition. The makers of NodeHive also offer [a paid SaaS version of NodeHive Headless CMS](https://www.nodehive.com/saas-pricing) as well as enterprise support. 10 | 11 | ## Benefits 12 | - Easily manage all your websites from one place 13 | - Editing content is simple and fast 14 | - Customize your structured content just the way you want it 15 | - Plan out your content ahead of time 16 | - Make sure your content goes live at the right time 17 | - ... and much more 18 | 19 | ## Features 20 | - One backend, multiple websites 21 | - Visual Editor 22 | - Advanced Content Modelling 23 | - Paul AI 24 | - Dashboards 25 | - Content Calendar 26 | - RAG / AI Chat (SaaS and enterprise only) 27 | - Content Projects (SaaS and enterprise only) 28 | - ... and much more 29 | 30 | ## Important links: 31 | - www.nodehive.com - product website 32 | - [docs.nodehive.com](https://docs.nodehive.com) - developer docs 33 | - [YouTube playlist](https://www.youtube.com/playlist?list=PLx8ET0RIaWG2NcK6TiM7fC3TOOkejYNzF) - updates and tutorials about NodeHive Headless CMS 34 | - [nodehive.com/newsletter](https://www.nodehive.com/newsletter) - Sign the Newsletter to stay updated 35 | 36 | ## Installation 37 | 38 | ### Install with DDEV 39 | 40 | Prerequisite: DDEV installed (https://ddev.readthedocs.io/en/stable/) 41 | 42 | ``` 43 | git clone https://github.com/NETNODEAG/nodehive-headless-cms-ce 44 | cd nodehive-headless-cms-ce 45 | ddev start 46 | ddev install-nodehive-ce 47 | ``` 48 | Your site is now available at https://nodehive-ce.ddev.site 49 | 50 | ### Install with composer directly 51 | 52 | Prerequisite: A working LAMP stack 53 | 54 | ``` 55 | composer create-project netnodeag/nodehive-headless-cms-ce nodehive-ce 56 | cd nodehive-ce 57 | composer install 58 | ``` 59 | Adjust the `settings.php` so that Drupal can be installed [Drupal Docs](https://www.drupal.org/docs/user_guide/en/install-requirements.html) 60 | ``` 61 | composer install-nodehive-ce 62 | ``` 63 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "netnodeag/nodehive-headless-cms-ce", 3 | "description": "The skeleton project of community edition of Nodehive", 4 | "type": "project", 5 | "license": "GPL-2.0-or-later", 6 | "homepage": "https://www.nodehive.com", 7 | "minimum-stability": "dev", 8 | "prefer-stable": true, 9 | "support": { 10 | "docs": "https://docs.nodehive.com" 11 | }, 12 | "repositories": [ 13 | { 14 | "type": "composer", 15 | "url": "https://packages.drupal.org/8" 16 | }, 17 | { 18 | "type": "composer", 19 | "url": "https://asset-packagist.org" 20 | } 21 | ], 22 | "require": { 23 | "php": "^8.3", 24 | "ext-curl": "*", 25 | "ext-gd": "*", 26 | "ext-json": "*", 27 | "ext-openssl": "*", 28 | "ext-pdo": "*", 29 | "ext-xml": "*", 30 | "composer/installers": "^2.0", 31 | "cweagans/composer-patches": "^1.7", 32 | "drupal/admin_toolbar": "^3.4", 33 | "drupal/admin_toolbar_entity_version": "1.0.x-dev@dev", 34 | "drupal/amswap": "^3.2", 35 | "drupal/automatic_updates": "^3.0@alpha", 36 | "drupal/backup_migrate": "^5.0", 37 | "drupal/charts": "^5.0", 38 | "drupal/ckeditor5_paste_filter": "^1.0", 39 | "drupal/coffee": "^1.3", 40 | "drupal/config_ignore": "^3.2", 41 | "drupal/content_planner": "2.0.x-dev@dev", 42 | "drupal/core-composer-scaffold": "^10", 43 | "drupal/core-project-message": "^10", 44 | "drupal/core-recommended": "^10", 45 | "drupal/decoupled_router": "^2.0", 46 | "drupal/devel": "^5.1", 47 | "drupal/diff": "^1.1", 48 | "drupal/dotenv": "^1.0", 49 | "drupal/editor_advanced_link": "^2.2", 50 | "drupal/entity_update": "^3.0", 51 | "drupal/entity_usage": "^2.0@beta", 52 | "drupal/erd": "^2.0@alpha", 53 | "drupal/exif_orientation": "^1.4", 54 | "drupal/field_formatter_class": "^1.6", 55 | "drupal/field_group": "^3.4", 56 | "drupal/focal_point": "^2.0", 57 | "drupal/gin": "3.x-dev@dev", 58 | "drupal/gin_login": "^2.0", 59 | "drupal/gin_toolbar": "^1.0@RC", 60 | "drupal/group": "^3.1", 61 | "drupal/image_effects": "^3.4", 62 | "drupal/inline_entity_form": "^2.0@RC", 63 | "drupal/jsonapi_extras": "^3.24", 64 | "drupal/jsonapi_hypermedia": "^1.9", 65 | "drupal/jsonapi_image_styles": "^3.0", 66 | "drupal/jsonapi_include": "^1.6", 67 | "drupal/jsonapi_menu_items": "^1.2", 68 | "drupal/jwt": "^2.0", 69 | "drupal/login_destination": "^2.0@beta", 70 | "drupal/media_library_edit": "^3.0", 71 | "drupal/menu_block": "^1.10", 72 | "drupal/menu_link_attributes": "^1.3", 73 | "drupal/metatag": "^2.0", 74 | "drupal/mix": "^1.6", 75 | "drupal/next": "^1.6", 76 | "drupal/nocurrent_pass": "^1.2", 77 | "drupal/node_singles": "^3.3", 78 | "drupal/nodehive_core": "^1.0@dev", 79 | "drupal/paragraphs_admin": "^1.4", 80 | "drupal/paragraphs_edit": "^3.0", 81 | "drupal/paragraphs_ee": "10.0.x-dev@dev", 82 | "drupal/pathauto": "^1.11", 83 | "drupal/permissions_filter": "^1.3", 84 | "drupal/project_browser": "^1.0@beta", 85 | "drupal/quick_node_clone": "^1.16", 86 | "drupal/r4032login": "^2.2", 87 | "drupal/redirect": "^1.9", 88 | "drupal/reroute_email": "^2.2", 89 | "drupal/restui": "^1.21", 90 | "drupal/search_api": "^1.29", 91 | "drupal/shield": "^1.7", 92 | "drupal/simplify": "^2.0", 93 | "drupal/single_content_sync": "^1.4", 94 | "drupal/site_settings": "^1.20", 95 | "drupal/svg_image": "^3.0", 96 | "drupal/symfony_mailer": "^1.2", 97 | "drupal/views_bulk_operations": "^4.2", 98 | "drupal/webform": "^6.2@beta", 99 | "drupal/webform_rest": "^4.0", 100 | "drupal/yaml_content": "^1.0@alpha", 101 | "drush/drush": "^13" 102 | }, 103 | "require-dev": { 104 | "brainmaestro/composer-git-hooks": "^3.0@alpha", 105 | "drupal/coder": "^8.3", 106 | "drupal/core-dev": "^10", 107 | "mglaman/phpstan-drupal": "^1.1", 108 | "phpstan/extension-installer": "^1.2", 109 | "phpstan/phpstan": "^1.10", 110 | "phpstan/phpstan-deprecation-rules": "^1.1", 111 | "squizlabs/php_codesniffer": "^3.7" 112 | }, 113 | "conflict": { 114 | "drupal/drupal": "*" 115 | }, 116 | "minimum-stability": "dev", 117 | "prefer-stable": true, 118 | "config": { 119 | "sort-packages": true, 120 | "allow-plugins": { 121 | "drupal/*": true, 122 | "netnodeag/*": true, 123 | "cweagans/composer-patches": true, 124 | "composer/installers": true, 125 | "oomphinc/composer-installers-extender": true, 126 | "wikimedia/composer-merge-plugin": true, 127 | "dealerdirect/phpcodesniffer-composer-installer": true, 128 | "phpstan/extension-installer": true, 129 | "php-http/discovery": true 130 | } 131 | }, 132 | "scripts": { 133 | "post-install-cmd": [ 134 | "[ $COMPOSER_DEV_MODE -eq 0 ] || cghooks add --ignore-lock" 135 | ], 136 | "post-update-cmd": "[ $COMPOSER_DEV_MODE -eq 0 ] || cghooks update", 137 | "install-nodehive-ce": "./scripts/install/install.sh" 138 | }, 139 | "extra": { 140 | "patchLevel": { 141 | "drupal/core": "-p2" 142 | }, 143 | "enable-patching": true, 144 | "composer-exit-on-patch-failure": false, 145 | "drupal-scaffold": { 146 | "locations": { 147 | "web-root": "web/" 148 | } 149 | }, 150 | "merge-plugin": { 151 | "include": [ 152 | "web/modules/contrib/dropzonejs/composer.libraries.json", 153 | "web/modules/contrib/webform/composer.libraries.json" 154 | ] 155 | }, 156 | "installer-paths": { 157 | "web/core": ["type:drupal-core"], 158 | "web/libraries/{$name}": ["type:drupal-library"], 159 | "web/modules/contrib/{$name}": ["type:drupal-module"], 160 | "web/profiles/contrib/{$name}": ["type:drupal-profile"], 161 | "web/themes/contrib/{$name}": ["type:drupal-theme"], 162 | "drush/Commands/contrib/{$name}": ["type:drupal-drush"], 163 | "web/modules/custom/{$name}": ["type:drupal-custom-module"], 164 | "web/profiles/custom/{$name}": ["type:drupal-custom-profile"], 165 | "web/themes/custom/{$name}": ["type:drupal-custom-theme"] 166 | }, 167 | "drupal-core-project-message": { 168 | "include-keys": ["homepage", "support"], 169 | "post-create-project-cmd-message": [ 170 | " ", 171 | " Congratulations, you’ve installed the Nodehive codebase ", 172 | " from the netnodeag/nodehive-headless-cms-ce template! ", 173 | " ", 174 | "", 175 | "Next steps:", 176 | 177 | " * Install the site by running: composer install-nodehive-ce", 178 | " * Read the documentation: https://docs.nodehive.com/" 179 | ] 180 | } 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /features.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NETNODEAG/nodehive-headless-cms-ce/7b362fa436fe51d917faced6ecaeef2d76c3e063/features.png -------------------------------------------------------------------------------- /scripts/install/install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | # Color codes 6 | RED="\e[31m" 7 | GREEN="\033[0;32m" 8 | BOLDGREEN="\e[1;${GREEN}m" 9 | YELLOW="\033[1;33m" 10 | CYAN="\033[0;36m" 11 | NC="\033[0m" # No Color 12 | 13 | # Variables 14 | DRUPAL_SETTINGS_NODEHIVE_FILE="./web/sites/default/settings.nodehive.php" 15 | DRUPAL_SETTINGS_FILE="./web/sites/default/settings.php" 16 | 17 | # Flag variables 18 | SKIP_COMPOSER=false 19 | 20 | cat << EOF 21 | 22 | ############################################################# 23 | 24 | ┏┓╻┏━┓╺┳┓┏━╸╻ ╻╻╻ ╻┏━╸ ╻ ╻┏━╸┏━┓╺┳┓╻ ┏━╸┏━┓┏━┓ ┏━╸┏┳┓┏━┓ 25 | ┃┗┫┃ ┃ ┃┃┣╸ ┣━┫┃┃┏┛┣╸ ┣━┫┣╸ ┣━┫ ┃┃┃ ┣╸ ┗━┓┗━┓ ┃ ┃┃┃┗━┓ 26 | ╹ ╹┗━┛╺┻┛┗━╸╹ ╹╹┗┛ ┗━╸ ╹ ╹┗━╸╹ ╹╺┻┛┗━╸┗━╸┗━┛┗━┛ ┗━╸╹ ╹┗━┛ 27 | Scale your digital platform. 28 | 29 | ############################################################# 30 | 31 | EOF 32 | 33 | 34 | # Parse command line options 35 | while [[ "$#" -gt 0 ]]; do 36 | case $1 in 37 | -s|--skip-composer) SKIP_COMPOSER=true ;; 38 | *) echo "Unknown parameter passed: $1"; exit 1 ;; 39 | esac 40 | shift 41 | done 42 | 43 | echo -e "\r\n" 44 | if [ "$SKIP_COMPOSER" = false ]; then 45 | echo -e "${RED}### RUN: composer install ###${NC}" 46 | composer install --no-dev --no-interaction 47 | echo -e "${CYAN}### composer install -> DONE ###${NC}\n" 48 | fi 49 | 50 | echo -e "\r\n" 51 | echo -e "${RED}### RUN: Drupal install ###${NC}" 52 | ./vendor/bin/drush site:install --account-name=admin --account-pass=admin -y 53 | echo -e "${CYAN}### Drupal install -> DONE ###${NC}\n" 54 | 55 | echo -e "\r\n" 56 | echo -e "${RED}### RUN: Enable Beekeeper module ###${NC}" 57 | ./vendor/bin/drush pm:enable nodehive_core_beekeeper -y 58 | echo -e "${CYAN}### Enable Beekeeper -> DONE ###${NC}\n" 59 | 60 | echo -e "\r\n" 61 | echo -e "${RED}### RUN: Install NodeHive CE module ###${NC}" 62 | ./vendor/bin/drush pm-enable nodehive_ce -y 63 | echo -e "${CYAN}### Install NodeHive CE module -> DONE ###${NC}" 64 | 65 | echo -e "\r\n" 66 | echo -e "${RED}### RUN: NodeHive install ###${NC}" 67 | ./vendor/bin/drush beekeeper:install 68 | ./vendor/bin/drush beekeeper:install --preset=nodehive-ce 69 | echo -e "${CYAN}### NodeHive install -> DONE ###${NC}" 70 | 71 | echo -e "\r\n" 72 | echo -e "${RED}### RUN: Set up JWT key ###${NC}" 73 | mkdir -p private 74 | openssl genrsa 2048 > ./private/jwt.key 75 | echo -e "${CYAN}### Set up JWT key -> DONE ###${NC}" 76 | 77 | echo -e "\r\n" 78 | echo -e "${RED}### RUN: Set up roles ###${NC}" 79 | ./vendor/bin/drush user:role:add 'nodehive_content_admin' admin 80 | echo -e "${CYAN}### Set up roles -> DONE ###${NC}" 81 | 82 | echo -e "\r\n" 83 | echo -e "\r\n" 84 | cat << EOF 85 | 86 | ############################################################# 87 | 88 | ┏┓╻┏━┓╺┳┓┏━╸╻ ╻╻╻ ╻┏━╸ ╻ ╻┏━╸┏━┓╺┳┓╻ ┏━╸┏━┓┏━┓ ┏━╸┏┳┓┏━┓ 89 | ┃┗┫┃ ┃ ┃┃┣╸ ┣━┫┃┃┏┛┣╸ ┣━┫┣╸ ┣━┫ ┃┃┃ ┣╸ ┗━┓┗━┓ ┃ ┃┃┃┗━┓ 90 | ╹ ╹┗━┛╺┻┛┗━╸╹ ╹╹┗┛ ┗━╸ ╹ ╹┗━╸╹ ╹╺┻┛┗━╸┗━╸┗━┛┗━┛ ┗━╸╹ ╹┗━┛ 91 | Scale your digital platform. 92 | 93 | ############################################################# 94 | 95 | EOF 96 | 97 | echo -e "${RED}- www.nodehive.com ${NC}" 98 | echo -e "${RED}- www.nodehive.com/newsletter – Feature Updates${NC}" 99 | echo -e "${RED}- docs.nodehive.com – Developer documentation${NC}" 100 | echo -e "${RED}- www.netnode.ch – Makers of NodeHive Headless CMS ${NC}" 101 | echo -e "\r\n" 102 | 103 | echo -e "And now have fun and run 'ddev launch' to open the site in your browser." 104 | echo -e "${GREEN}Username: ${YELLOW}admin ${NC}" 105 | echo -e "${GREEN}Password:${NC} ${YELLOW}admin ${NC}" 106 | echo -e "\r\n" 107 | echo -e "\r\n" 108 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | /.csslintrc 2 | /.eslintignore 3 | /.eslintrc.json 4 | /.ht.router.php 5 | /.htaccess 6 | /INSTALL.txt 7 | /README.md 8 | /autoload.php 9 | /example.gitignore 10 | /index.php 11 | /robots.txt 12 | /update.php 13 | /web.config -------------------------------------------------------------------------------- /web/modules/.gitignore: -------------------------------------------------------------------------------- 1 | /README.txt -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/content_calendar.content_type_config.article.yml: -------------------------------------------------------------------------------- 1 | status: true 2 | dependencies: { } 3 | id: article 4 | label: Article 5 | color: '#0074bd' 6 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/content_calendar.content_type_config.page.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: page 5 | label: 'Basic page' 6 | color: '#0074bd' 7 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/jsonapi_include.settings.yml: -------------------------------------------------------------------------------- 1 | use_include_query: 1 2 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/jwt.config.yml: -------------------------------------------------------------------------------- 1 | key_id: jwt_rsa_key 2 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/key.key.jwt_rsa_key.yml: -------------------------------------------------------------------------------- 1 | status: true 2 | dependencies: 3 | module: 4 | - jwt 5 | id: jwt_rsa_key 6 | label: 'JWT Rsa Key' 7 | description: 'JWT rsa key' 8 | key_type: jwt_rs 9 | key_type_settings: 10 | algorithm: RS256 11 | key_provider: file 12 | key_provider_settings: 13 | file_location: ../private/jwt.key 14 | strip_line_breaks: false 15 | key_input: none 16 | key_input_settings: { } 17 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/language.negotiation.yml: -------------------------------------------------------------------------------- 1 | session: 2 | parameter: language 3 | url: 4 | source: path_prefix 5 | prefixes: 6 | en: en 7 | domains: 8 | en: '' 9 | selected_langcode: site_default 10 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/rest.resource.entity.user.yml: -------------------------------------------------------------------------------- 1 | status: true 2 | dependencies: 3 | module: 4 | - jwt 5 | - serialization 6 | - user 7 | id: entity.user 8 | plugin_id: 'entity:user' 9 | granularity: resource 10 | configuration: 11 | methods: 12 | - GET 13 | - POST 14 | - DELETE 15 | - PATCH 16 | formats: 17 | - json 18 | authentication: 19 | - jwt_auth 20 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/beekeeper/nodehive-ce/default/workflows.workflow.editorial.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - node.type.article 6 | - node.type.page 7 | module: 8 | - content_moderation 9 | id: editorial 10 | label: Editorial 11 | type: content_moderation 12 | type_settings: 13 | states: 14 | archived: 15 | label: Archived 16 | weight: 5 17 | published: false 18 | default_revision: true 19 | draft: 20 | label: Draft 21 | weight: -5 22 | published: false 23 | default_revision: false 24 | published: 25 | label: Published 26 | weight: 0 27 | published: true 28 | default_revision: true 29 | transitions: 30 | archive: 31 | label: Archive 32 | from: 33 | - published 34 | to: archived 35 | weight: 2 36 | archived_draft: 37 | label: 'Restore to Draft' 38 | from: 39 | - archived 40 | to: draft 41 | weight: 3 42 | archived_published: 43 | label: Restore 44 | from: 45 | - archived 46 | to: published 47 | weight: 4 48 | create_new_draft: 49 | label: 'Create New Draft' 50 | from: 51 | - draft 52 | - published 53 | to: draft 54 | weight: 0 55 | publish: 56 | label: Publish 57 | from: 58 | - draft 59 | - published 60 | to: published 61 | weight: 1 62 | entity_types: 63 | node: 64 | - article 65 | - page 66 | default_moderation_state: draft 67 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/install/content_planner.dashboard_tabs_settings.yml: -------------------------------------------------------------------------------- 1 | dashboards: 2 | - 3 | dashboard_id: master 4 | enabled: true 5 | weight: -10 6 | - 7 | dashboard_id: master 8 | enabled: true 9 | weight: -10 10 | - 11 | dashboard_id: master 12 | enabled: true 13 | weight: -10 14 | - 15 | dashboard_id: master 16 | enabled: true 17 | weight: -10 18 | - 19 | dashboard_id: master 20 | enabled: true 21 | weight: -10 22 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/config/install/content_planner.dashboards.master.yml: -------------------------------------------------------------------------------- 1 | configuration: 2 | name: 'Master Dashboard' 3 | width: 0 4 | roles: 5 | - authenticated 6 | widgets: 7 | 2810f748-3376-4062-9cd2-49bfdb8601d5: 8 | plugin_id: node_hive_quick_links_block 9 | title: 'NodeHive Quick Links' 10 | uuid: 2810f748-3376-4062-9cd2-49bfdb8601d5 11 | widget_name: 'NodeHive Quick Links' 12 | weight: '2' 13 | configured: false 14 | plugin_specific_config: null 15 | colspan: colspan-6 16 | dashboard_id: master 17 | f001325d-8387-4749-b377-ab4a003eb9e6: 18 | plugin_id: node_hive_quick_links_content_model_block 19 | title: 'NodeHive Content Model' 20 | uuid: f001325d-8387-4749-b377-ab4a003eb9e6 21 | widget_name: 'NodeHive Content Model' 22 | weight: '2' 23 | configured: false 24 | plugin_specific_config: null 25 | colspan: colspan-6 26 | dashboard_id: master 27 | -------------------------------------------------------------------------------- /web/modules/custom/nodehive_ce/nodehive_ce.info.yml: -------------------------------------------------------------------------------- 1 | name: Nodehive CE 2 | description: A base module for Nodehive CE. 3 | package: NodeHive 4 | type: module 5 | core_version_requirement: ^9.2 || ^10 6 | dependencies: 7 | - drupal:nodehive_core 8 | - drupal:nodehive_core_beekeeper 9 | -------------------------------------------------------------------------------- /web/profiles/.gitignore: -------------------------------------------------------------------------------- 1 | /README.txt -------------------------------------------------------------------------------- /web/sites/.gitignore: -------------------------------------------------------------------------------- 1 | /README.txt 2 | /development.services.yml 3 | /example.settings.local.php 4 | /example.sites.php -------------------------------------------------------------------------------- /web/sites/default/default.services.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | # Toggles the super user access policy. If your website has at least one user 3 | # with the Administrator role, it is advised to set this to false. This allows 4 | # you to make user 1 a regular user, strengthening the security of your site. 5 | security.enable_super_user: true 6 | session.storage.options: 7 | # Default ini options for sessions. 8 | # 9 | # Some distributions of Linux (most notably Debian) ship their PHP 10 | # installations with garbage collection (gc) disabled. Since Drupal depends 11 | # on PHP's garbage collection for clearing sessions, ensure that garbage 12 | # collection occurs by using the most common settings. 13 | # @default 1 14 | gc_probability: 1 15 | # @default 100 16 | gc_divisor: 100 17 | # 18 | # Set session lifetime (in seconds), i.e. the grace period for session 19 | # data. Sessions are deleted by the session garbage collector after one 20 | # session lifetime has elapsed since the user's last visit. When a session 21 | # is deleted, authenticated users are logged out, and the contents of the 22 | # user's session is discarded. 23 | # @default 200000 24 | gc_maxlifetime: 200000 25 | # 26 | # Set session cookie lifetime (in seconds), i.e. the time from the session 27 | # is created to the cookie expires, i.e. when the browser is expected to 28 | # discard the cookie. The value 0 means "until the browser is closed". 29 | # @default 2000000 30 | cookie_lifetime: 2000000 31 | # 32 | # Drupal automatically generates a unique session cookie name based on the 33 | # full domain name used to access the site. This mechanism is sufficient 34 | # for most use-cases, including multi-site deployments. However, if it is 35 | # desired that a session can be reused across different subdomains, the 36 | # cookie domain needs to be set to the shared base domain. Doing so assures 37 | # that users remain logged in as they cross between various subdomains. 38 | # To maximize compatibility and normalize the behavior across user agents, 39 | # the cookie domain should start with a dot. 40 | # 41 | # @default none 42 | # cookie_domain: '.example.com' 43 | # 44 | # Set the SameSite cookie attribute: 'None', 'Lax', or 'Strict'. If set, 45 | # this value will override the server value. See 46 | # https://www.php.net/manual/en/session.security.ini.php for more 47 | # information. 48 | # @default no value 49 | cookie_samesite: Lax 50 | # 51 | # Set the session ID string length. The length can be between 22 to 256. The 52 | # PHP recommended value is 48. See 53 | # https://www.php.net/manual/session.security.ini.php for more information. 54 | # This value should be kept in sync with 55 | # \Drupal\Core\Session\SessionConfiguration::__construct() 56 | # @default 48 57 | sid_length: 48 58 | # 59 | # Set the number of bits in encoded session ID character. The possible 60 | # values are '4' (0-9, a-f), '5' (0-9, a-v), and '6' (0-9, a-z, A-Z, "-", 61 | # ","). The PHP recommended value is 6. See 62 | # https://www.php.net/manual/session.security.ini.php for more information. 63 | # This value should be kept in sync with 64 | # \Drupal\Core\Session\SessionConfiguration::__construct() 65 | # @default 6 66 | sid_bits_per_character: 6 67 | # By default, Drupal generates a session cookie name based on the full 68 | # domain name. Set the name_suffix to a short random string to ensure this 69 | # session cookie name is unique on different installations on the same 70 | # domain and path (for example, when migrating from Drupal 7). 71 | name_suffix: '' 72 | twig.config: 73 | # Twig debugging: 74 | # 75 | # When debugging is enabled: 76 | # - The markup of each Twig template is surrounded by HTML comments that 77 | # contain theming information, such as template file name suggestions. 78 | # - Note that this debugging markup will cause automated tests that directly 79 | # check rendered HTML to fail. When running automated tests, 'debug' 80 | # should be set to FALSE. 81 | # - The dump() function can be used in Twig templates to output information 82 | # about template variables. 83 | # - Twig templates are automatically recompiled whenever the source code 84 | # changes (see auto_reload below). 85 | # 86 | # For more information about debugging Twig templates, see 87 | # https://www.drupal.org/node/1906392. 88 | # 89 | # Enabling Twig debugging is not recommended in production environments. 90 | # @default false 91 | debug: false 92 | # Twig auto-reload: 93 | # 94 | # Automatically recompile Twig templates whenever the source code changes. 95 | # If you don't provide a value for auto_reload, it will be determined 96 | # based on the value of debug. 97 | # 98 | # Enabling auto-reload is not recommended in production environments. 99 | # @default null 100 | auto_reload: null 101 | # Twig cache: 102 | # 103 | # By default, Twig templates will be compiled and stored in the filesystem 104 | # to increase performance. Disabling the Twig cache will recompile the 105 | # templates from source each time they are used. In most cases the 106 | # auto_reload setting above should be enabled rather than disabling the 107 | # Twig cache. 108 | # 109 | # Disabling the Twig cache is not recommended in production environments. 110 | # @default true 111 | cache: true 112 | # File extensions: 113 | # 114 | # List of file extensions the Twig system is allowed to load via the 115 | # twig.loader.filesystem service. Files with other extensions will not be 116 | # loaded unless they are added here. For example, to allow a file named 117 | # 'example.partial' to be loaded, add 'partial' to this list. To load files 118 | # with no extension, add an empty string '' to the list. 119 | # 120 | # @default ['css', 'html', 'js', 'svg', 'twig'] 121 | allowed_file_extensions: 122 | - css 123 | - html 124 | - js 125 | - svg 126 | - twig 127 | renderer.config: 128 | # Renderer required cache contexts: 129 | # 130 | # The Renderer will automatically associate these cache contexts with every 131 | # render array, hence varying every render array by these cache contexts. 132 | # 133 | # @default ['languages:language_interface', 'theme', 'user.permissions'] 134 | required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions'] 135 | # Renderer automatic placeholdering conditions: 136 | # 137 | # Drupal allows portions of the page to be automatically deferred when 138 | # rendering to improve cache performance. That is especially helpful for 139 | # cache contexts that vary widely, such as the active user. On some sites 140 | # those may be different, however, such as sites with only a handful of 141 | # users. If you know what the high-cardinality cache contexts are for your 142 | # site, specify those here. If you're not sure, the defaults are fairly safe 143 | # in general. 144 | # 145 | # For more information about rendering optimizations see 146 | # https://www.drupal.org/developing/api/8/render/arrays/cacheability#optimizing 147 | auto_placeholder_conditions: 148 | # Max-age at or below which caching is not considered worthwhile. 149 | # 150 | # Disable by setting to -1. 151 | # 152 | # @default 0 153 | max-age: 0 154 | # Cache contexts with a high cardinality. 155 | # 156 | # Disable by setting to []. 157 | # 158 | # @default ['session', 'user'] 159 | contexts: ['session', 'user'] 160 | # Tags with a high invalidation frequency. 161 | # 162 | # Disable by setting to []. 163 | # 164 | # @default [] 165 | tags: [] 166 | # Renderer cache debug: 167 | # 168 | # Allows cache debugging output for each rendered element. 169 | # 170 | # Enabling render cache debugging is not recommended in production 171 | # environments. 172 | # @default false 173 | debug: false 174 | # Cacheability debugging: 175 | # 176 | # Responses with cacheability metadata (CacheableResponseInterface instances) 177 | # get X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts and X-Drupal-Cache-Max-Age 178 | # headers. 179 | # 180 | # For more information about debugging cacheable responses, see 181 | # https://www.drupal.org/developing/api/8/response/cacheable-response-interface 182 | # 183 | # Enabling cacheability debugging is not recommended in production 184 | # environments. 185 | # @default false 186 | http.response.debug_cacheability_headers: false 187 | factory.keyvalue: {} 188 | # Default key/value storage service to use. 189 | # @default keyvalue.database 190 | # default: keyvalue.database 191 | # Collection-specific overrides. 192 | # state: keyvalue.database 193 | factory.keyvalue.expirable: {} 194 | # Default key/value expirable storage service to use. 195 | # @default keyvalue.database.expirable 196 | # default: keyvalue.database.expirable 197 | # Allowed protocols for URL generation. 198 | filter_protocols: 199 | - http 200 | - https 201 | - ftp 202 | - news 203 | - nntp 204 | - tel 205 | - telnet 206 | - mailto 207 | - irc 208 | - ssh 209 | - sftp 210 | - webcal 211 | - rtsp 212 | 213 | # Configure Cross-Site HTTP requests (CORS). 214 | # Read https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 215 | # for more information about the topic in general. 216 | # Note: By default the configuration is disabled. 217 | cors.config: 218 | enabled: false 219 | # Specify allowed headers, like 'x-allowed-header'. 220 | allowedHeaders: [] 221 | # Specify allowed request methods, specify ['*'] to allow all possible ones. 222 | allowedMethods: [] 223 | # Configure requests allowed from specific origins. Do not include trailing 224 | # slashes with URLs. 225 | allowedOrigins: ['*'] 226 | # Configure requests allowed from origins, matching against regex patterns. 227 | allowedOriginsPatterns: [] 228 | # Sets the Access-Control-Expose-Headers header. 229 | exposedHeaders: false 230 | # Sets the Access-Control-Max-Age header. 231 | maxAge: false 232 | # Sets the Access-Control-Allow-Credentials header. 233 | supportsCredentials: false 234 | 235 | queue.config: 236 | # The maximum number of seconds to wait if a queue is temporarily suspended. 237 | # This is not applicable when a queue is suspended but does not specify 238 | # how long to wait before attempting to resume. 239 | suspendMaximumWait: 30 240 | -------------------------------------------------------------------------------- /web/sites/default/default.settings.php: -------------------------------------------------------------------------------- 1 | 'database_name', 81 | * 'username' => 'sql_username', 82 | * 'password' => 'sql_password', 83 | * 'host' => 'localhost', 84 | * 'port' => '3306', 85 | * 'driver' => 'mysql', 86 | * 'prefix' => '', 87 | * 'collation' => 'utf8mb4_general_ci', 88 | * ]; 89 | * @endcode 90 | */ 91 | $databases = []; 92 | 93 | /** 94 | * Customizing database settings. 95 | * 96 | * Many of the values of the $databases array can be customized for your 97 | * particular database system. Refer to the sample in the section above as a 98 | * starting point. 99 | * 100 | * The "driver" property indicates what Drupal database driver the 101 | * connection should use. This is usually the same as the name of the 102 | * database type, such as mysql or sqlite, but not always. The other 103 | * properties will vary depending on the driver. For SQLite, you must 104 | * specify a database file name in a directory that is writable by the 105 | * webserver. For most other drivers, you must specify a 106 | * username, password, host, and database name. 107 | * 108 | * Drupal core implements drivers for mysql, pgsql, and sqlite. Other drivers 109 | * can be provided by contributed or custom modules. To use a contributed or 110 | * custom driver, the "namespace" property must be set to the namespace of the 111 | * driver. The code in this namespace must be autoloadable prior to connecting 112 | * to the database, and therefore, prior to when module root namespaces are 113 | * added to the autoloader. To add the driver's namespace to the autoloader, 114 | * set the "autoload" property to the PSR-4 base directory of the driver's 115 | * namespace. This is optional for projects managed with Composer if the 116 | * driver's namespace is in Composer's autoloader. 117 | * 118 | * For each database, you may optionally specify multiple "target" databases. 119 | * A target database allows Drupal to try to send certain queries to a 120 | * different database if it can but fall back to the default connection if not. 121 | * That is useful for primary/replica replication, as Drupal may try to connect 122 | * to a replica server when appropriate and if one is not available will simply 123 | * fall back to the single primary server (The terms primary/replica are 124 | * traditionally referred to as master/slave in database server documentation). 125 | * 126 | * The general format for the $databases array is as follows: 127 | * @code 128 | * $databases['default']['default'] = $info_array; 129 | * $databases['default']['replica'][] = $info_array; 130 | * $databases['default']['replica'][] = $info_array; 131 | * $databases['extra']['default'] = $info_array; 132 | * @endcode 133 | * 134 | * In the above example, $info_array is an array of settings described above. 135 | * The first line sets a "default" database that has one primary database 136 | * (the second level default). The second and third lines create an array 137 | * of potential replica databases. Drupal will select one at random for a given 138 | * request as needed. The fourth line creates a new database with a name of 139 | * "extra". 140 | * 141 | * For MySQL, MariaDB or equivalent databases the 'isolation_level' option can 142 | * be set. The recommended transaction isolation level for Drupal sites is 143 | * 'READ COMMITTED'. The 'REPEATABLE READ' option is supported but can result 144 | * in deadlocks, the other two options are 'READ UNCOMMITTED' and 'SERIALIZABLE'. 145 | * They are available but not supported; use them at your own risk. For more 146 | * info: 147 | * https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html 148 | * 149 | * On your settings.php, change the isolation level: 150 | * @code 151 | * $databases['default']['default']['init_commands'] = [ 152 | * 'isolation_level' => 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 153 | * ]; 154 | * @endcode 155 | * 156 | * You can optionally set a prefix for all database table names by using the 157 | * 'prefix' setting. If a prefix is specified, the table name will be prepended 158 | * with its value. Be sure to use valid database characters only, usually 159 | * alphanumeric and underscore. If no prefix is desired, do not set the 'prefix' 160 | * key or set its value to an empty string ''. 161 | * 162 | * For example, to have all database table prefixed with 'main_', set: 163 | * @code 164 | * 'prefix' => 'main_', 165 | * @endcode 166 | * 167 | * Advanced users can add or override initial commands to execute when 168 | * connecting to the database server, as well as PDO connection settings. For 169 | * example, to enable MySQL SELECT queries to exceed the max_join_size system 170 | * variable, and to reduce the database connection timeout to 5 seconds: 171 | * @code 172 | * $databases['default']['default'] = [ 173 | * 'init_commands' => [ 174 | * 'big_selects' => 'SET SQL_BIG_SELECTS=1', 175 | * ], 176 | * 'pdo' => [ 177 | * PDO::ATTR_TIMEOUT => 5, 178 | * ], 179 | * ]; 180 | * @endcode 181 | * 182 | * WARNING: The above defaults are designed for database portability. Changing 183 | * them may cause unexpected behavior, including potential data loss. See 184 | * https://www.drupal.org/docs/8/api/database-api/database-configuration for 185 | * more information on these defaults and the potential issues. 186 | * 187 | * More details can be found in the constructor methods for each driver: 188 | * - \Drupal\mysql\Driver\Database\mysql\Connection::__construct() 189 | * - \Drupal\pgsql\Driver\Database\pgsql\Connection::__construct() 190 | * - \Drupal\sqlite\Driver\Database\sqlite\Connection::__construct() 191 | * 192 | * Sample Database configuration format for PostgreSQL (pgsql): 193 | * @code 194 | * $databases['default']['default'] = [ 195 | * 'driver' => 'pgsql', 196 | * 'database' => 'database_name', 197 | * 'username' => 'sql_username', 198 | * 'password' => 'sql_password', 199 | * 'host' => 'localhost', 200 | * 'prefix' => '', 201 | * ]; 202 | * @endcode 203 | * 204 | * Sample Database configuration format for SQLite (sqlite): 205 | * @code 206 | * $databases['default']['default'] = [ 207 | * 'driver' => 'sqlite', 208 | * 'database' => '/path/to/database_filename', 209 | * ]; 210 | * @endcode 211 | * 212 | * Sample Database configuration format for a driver in a contributed module: 213 | * @code 214 | * $databases['default']['default'] = [ 215 | * 'driver' => 'my_driver', 216 | * 'namespace' => 'Drupal\my_module\Driver\Database\my_driver', 217 | * 'autoload' => 'modules/my_module/src/Driver/Database/my_driver/', 218 | * 'database' => 'database_name', 219 | * 'username' => 'sql_username', 220 | * 'password' => 'sql_password', 221 | * 'host' => 'localhost', 222 | * 'prefix' => '', 223 | * ]; 224 | * @endcode 225 | * 226 | * Sample Database configuration format for a driver that is extending another 227 | * database driver. 228 | * @code 229 | * $databases['default']['default'] = [ 230 | * 'driver' => 'my_driver', 231 | * 'namespace' => 'Drupal\my_module\Driver\Database\my_driver', 232 | * 'autoload' => 'modules/my_module/src/Driver/Database/my_driver/', 233 | * 'database' => 'database_name', 234 | * 'username' => 'sql_username', 235 | * 'password' => 'sql_password', 236 | * 'host' => 'localhost', 237 | * 'prefix' => '', 238 | * 'dependencies' => [ 239 | * 'parent_module' => [ 240 | * 'namespace' => 'Drupal\parent_module', 241 | * 'autoload' => 'core/modules/parent_module/src/', 242 | * ], 243 | * ], 244 | * ]; 245 | * @endcode 246 | */ 247 | 248 | /** 249 | * Location of the site configuration files. 250 | * 251 | * The $settings['config_sync_directory'] specifies the location of file system 252 | * directory used for syncing configuration data. On install, the directory is 253 | * created. This is used for configuration imports. 254 | * 255 | * The default location for this directory is inside a randomly-named 256 | * directory in the public files path. The setting below allows you to set 257 | * its location. 258 | */ 259 | # $settings['config_sync_directory'] = '/directory/outside/webroot'; 260 | 261 | /** 262 | * Settings: 263 | * 264 | * $settings contains environment-specific configuration, such as the files 265 | * directory and reverse proxy address, and temporary configuration, such as 266 | * security overrides. 267 | * 268 | * @see \Drupal\Core\Site\Settings::get() 269 | */ 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, and vary the value across environments (like 281 | * production and development); you should also ensure that this file is not 282 | * stored with backups of your database. 283 | * 284 | * Example: 285 | * @code 286 | * $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); 287 | * @endcode 288 | */ 289 | $settings['hash_salt'] = ''; 290 | 291 | /** 292 | * Deployment identifier. 293 | * 294 | * Drupal's dependency injection container will be automatically invalidated and 295 | * rebuilt when the Drupal core version changes. When updating contributed or 296 | * custom code that changes the container, changing this identifier will also 297 | * allow the container to be invalidated as soon as code is deployed. 298 | */ 299 | # $settings['deployment_identifier'] = \Drupal::VERSION; 300 | 301 | /** 302 | * Access control for update.php script. 303 | * 304 | * If you are updating your Drupal installation using the update.php script but 305 | * are not logged in using either an account with the "Administer software 306 | * updates" permission or the site maintenance account (the account that was 307 | * created during installation), you will need to modify the access check 308 | * statement below. Change the FALSE to a TRUE to disable the access check. 309 | * After finishing the upgrade, be sure to open this file again and change the 310 | * TRUE back to a FALSE! 311 | */ 312 | $settings['update_free_access'] = FALSE; 313 | 314 | /** 315 | * Fallback to HTTP for Update Manager and for fetching security advisories. 316 | * 317 | * If your site fails to connect to updates.drupal.org over HTTPS (either when 318 | * fetching data on available updates, or when fetching the feed of critical 319 | * security announcements), you may uncomment this setting and set it to TRUE to 320 | * allow an insecure fallback to HTTP. Note that doing so will open your site up 321 | * to a potential man-in-the-middle attack. You should instead attempt to 322 | * resolve the issues before enabling this option. 323 | * @see https://www.drupal.org/docs/system-requirements/php-requirements#openssl 324 | * @see https://en.wikipedia.org/wiki/Man-in-the-middle_attack 325 | * @see \Drupal\update\UpdateFetcher 326 | * @see \Drupal\system\SecurityAdvisories\SecurityAdvisoriesFetcher 327 | */ 328 | # $settings['update_fetch_with_http_fallback'] = TRUE; 329 | 330 | /** 331 | * External access proxy settings: 332 | * 333 | * If your site must access the Internet via a web proxy then you can enter the 334 | * proxy settings here. Set the full URL of the proxy, including the port, in 335 | * variables: 336 | * - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP 337 | * requests. 338 | * - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS 339 | * requests. 340 | * You can pass in the user name and password for basic authentication in the 341 | * URLs in these settings. 342 | * 343 | * You can also define an array of host names that can be accessed directly, 344 | * bypassing the proxy, in $settings['http_client_config']['proxy']['no']. 345 | */ 346 | # $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; 347 | # $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; 348 | # $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; 349 | 350 | /** 351 | * Reverse Proxy Configuration: 352 | * 353 | * Reverse proxy servers are often used to enhance the performance 354 | * of heavily visited sites and may also provide other site caching, 355 | * security, or encryption benefits. In an environment where Drupal 356 | * is behind a reverse proxy, the real IP address of the client should 357 | * be determined such that the correct client IP address is available 358 | * to Drupal's logging and access management systems. In the most simple 359 | * scenario, the proxy server will add an X-Forwarded-For header to the request 360 | * that contains the client IP address. However, HTTP headers are vulnerable to 361 | * spoofing, where a malicious client could bypass restrictions by setting the 362 | * X-Forwarded-For header directly. Therefore, Drupal's proxy configuration 363 | * requires the IP addresses of all remote proxies to be specified in 364 | * $settings['reverse_proxy_addresses'] to work correctly. 365 | * 366 | * Enable this setting to get Drupal to determine the client IP from the 367 | * X-Forwarded-For header. If you are unsure about this setting, do not have a 368 | * reverse proxy, or Drupal operates in a shared hosting environment, this 369 | * setting should remain commented out. 370 | * 371 | * In order for this setting to be used you must specify every possible 372 | * reverse proxy IP address in $settings['reverse_proxy_addresses']. 373 | * If a complete list of reverse proxies is not available in your 374 | * environment (for example, if you use a CDN) you may set the 375 | * $_SERVER['REMOTE_ADDR'] variable directly in settings.php. 376 | * Be aware, however, that it is likely that this would allow IP 377 | * address spoofing unless more advanced precautions are taken. 378 | */ 379 | # $settings['reverse_proxy'] = TRUE; 380 | 381 | /** 382 | * Reverse proxy addresses. 383 | * 384 | * Specify every reverse proxy IP address in your environment, as an array of 385 | * IPv4/IPv6 addresses or subnets in CIDR notation. This setting is required if 386 | * $settings['reverse_proxy'] is TRUE. 387 | */ 388 | # $settings['reverse_proxy_addresses'] = ['a.b.c.d', 'e.f.g.h/24', ...]; 389 | 390 | /** 391 | * Reverse proxy trusted headers. 392 | * 393 | * Sets which headers to trust from your reverse proxy. 394 | * 395 | * Common values are: 396 | * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR 397 | * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST 398 | * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT 399 | * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO 400 | * - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 401 | * 402 | * Note the default value of 403 | * @code 404 | * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 405 | * @endcode 406 | * is not secure by default. The value should be set to only the specific 407 | * headers the reverse proxy uses. For example: 408 | * @code 409 | * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO 410 | * @endcode 411 | * This would trust the following headers: 412 | * - X_FORWARDED_FOR 413 | * - X_FORWARDED_HOST 414 | * - X_FORWARDED_PROTO 415 | * - X_FORWARDED_PORT 416 | * 417 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR 418 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST 419 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT 420 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO 421 | * @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED 422 | * @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies 423 | */ 424 | # $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED; 425 | 426 | 427 | /** 428 | * Page caching: 429 | * 430 | * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page 431 | * views. This tells a HTTP proxy that it may return a page from its local 432 | * cache without contacting the web server, if the user sends the same Cookie 433 | * header as the user who originally requested the cached page. Without "Vary: 434 | * Cookie", authenticated users would also be served the anonymous page from 435 | * the cache. If the site has mostly anonymous users except a few known 436 | * editors/administrators, the Vary header can be omitted. This allows for 437 | * better caching in HTTP proxies (including reverse proxies), i.e. even if 438 | * clients send different cookies, they still get content served from the cache. 439 | * However, authenticated users should access the site directly (i.e. not use an 440 | * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid 441 | * getting cached pages from the proxy. 442 | */ 443 | # $settings['omit_vary_cookie'] = TRUE; 444 | 445 | 446 | /** 447 | * Cache TTL for client error (4xx) responses. 448 | * 449 | * Items cached per-URL tend to result in a large number of cache items, and 450 | * this can be problematic on 404 pages which by their nature are unbounded. A 451 | * fixed TTL can be set for these items, defaulting to one hour, so that cache 452 | * backends which do not support LRU can purge older entries. To disable caching 453 | * of client error responses set the value to 0. Currently applies only to 454 | * page_cache module. 455 | */ 456 | # $settings['cache_ttl_4xx'] = 3600; 457 | 458 | /** 459 | * Expiration of cached forms. 460 | * 461 | * Drupal's Form API stores details of forms in a cache and these entries are 462 | * kept for at least 6 hours by default. Expired entries are cleared by cron. 463 | * 464 | * @see \Drupal\Core\Form\FormCache::setCache() 465 | */ 466 | # $settings['form_cache_expiration'] = 21600; 467 | 468 | /** 469 | * Class Loader. 470 | * 471 | * If the APCu extension is detected, the classloader will be optimized to use 472 | * it. Set to FALSE to disable this. 473 | * 474 | * @see https://getcomposer.org/doc/articles/autoloader-optimization.md 475 | */ 476 | # $settings['class_loader_auto_detect'] = FALSE; 477 | 478 | /** 479 | * Authorized file system operations: 480 | * 481 | * The Update Manager module included with Drupal provides a mechanism for 482 | * site administrators to securely install missing updates for the site 483 | * directly through the web user interface. On securely-configured servers, 484 | * the Update manager will require the administrator to provide SSH or FTP 485 | * credentials before allowing the installation to proceed; this allows the 486 | * site to update the new files as the user who owns all the Drupal files, 487 | * instead of as the user the webserver is running as. On servers where the 488 | * webserver user is itself the owner of the Drupal files, the administrator 489 | * will not be prompted for SSH or FTP credentials (note that these server 490 | * setups are common on shared hosting, but are inherently insecure). 491 | * 492 | * Some sites might wish to disable the above functionality, and only update 493 | * the code directly via SSH or FTP themselves. This setting completely 494 | * disables all functionality related to these authorized file operations. 495 | * 496 | * @see https://www.drupal.org/node/244924 497 | * 498 | * Remove the leading hash signs to disable. 499 | */ 500 | # $settings['allow_authorize_operations'] = FALSE; 501 | 502 | /** 503 | * Default mode for directories and files written by Drupal. 504 | * 505 | * Value should be in PHP Octal Notation, with leading zero. 506 | */ 507 | # $settings['file_chmod_directory'] = 0775; 508 | # $settings['file_chmod_file'] = 0664; 509 | 510 | /** 511 | * Optimized assets path: 512 | * 513 | * A local file system path where optimized assets will be stored. This directory 514 | * must exist and be writable by Drupal. This directory must be relative to 515 | * the Drupal installation directory and be accessible over the web. 516 | */ 517 | # $settings['file_assets_path'] = 'sites/default/files'; 518 | 519 | /** 520 | * Public file base URL: 521 | * 522 | * An alternative base URL to be used for serving public files. This must 523 | * include any leading directory path. 524 | * 525 | * A different value from the domain used by Drupal to be used for accessing 526 | * public files. This can be used for a simple CDN integration, or to improve 527 | * security by serving user-uploaded files from a different domain or subdomain 528 | * pointing to the same server. Do not include a trailing slash. 529 | */ 530 | # $settings['file_public_base_url'] = 'http://downloads.example.com/files'; 531 | 532 | /** 533 | * Public file path: 534 | * 535 | * A local file system path where public files will be stored. This directory 536 | * must exist and be writable by Drupal. This directory must be relative to 537 | * the Drupal installation directory and be accessible over the web. 538 | */ 539 | # $settings['file_public_path'] = 'sites/default/files'; 540 | 541 | /** 542 | * Additional public file schemes: 543 | * 544 | * Public schemes are URI schemes that allow download access to all users for 545 | * all files within that scheme. 546 | * 547 | * The "public" scheme is always public, and the "private" scheme is always 548 | * private, but other schemes, such as "https", "s3", "example", or others, 549 | * can be either public or private depending on the site. By default, they're 550 | * private, and access to individual files is controlled via 551 | * hook_file_download(). 552 | * 553 | * Typically, if a scheme should be public, a module makes it public by 554 | * implementing hook_file_download(), and granting access to all users for all 555 | * files. This could be either the same module that provides the stream wrapper 556 | * for the scheme, or a different module that decides to make the scheme 557 | * public. However, in cases where a site needs to make a scheme public, but 558 | * is unable to add code in a module to do so, the scheme may be added to this 559 | * variable, the result of which is that system_file_download() grants public 560 | * access to all files within that scheme. 561 | */ 562 | # $settings['file_additional_public_schemes'] = ['example']; 563 | 564 | /** 565 | * File schemes whose paths should not be normalized: 566 | * 567 | * Normally, Drupal normalizes '/./' and '/../' segments in file URIs in order 568 | * to prevent unintended file access. For example, 'private://css/../image.png' 569 | * is normalized to 'private://image.png' before checking access to the file. 570 | * 571 | * On Windows, Drupal also replaces '\' with '/' in URIs for the local 572 | * filesystem. 573 | * 574 | * If file URIs with one or more scheme should not be normalized like this, then 575 | * list the schemes here. For example, if 'porcelain://china/./plate.png' should 576 | * not be normalized to 'porcelain://china/plate.png', then add 'porcelain' to 577 | * this array. In this case, make sure that the module providing the 'porcelain' 578 | * scheme does not allow unintended file access when using '/../' to move up the 579 | * directory tree. 580 | */ 581 | # $settings['file_sa_core_2023_005_schemes'] = ['porcelain']; 582 | 583 | /** 584 | * Configuration for phpinfo() admin status report. 585 | * 586 | * Drupal's admin UI includes a report at admin/reports/status/php which shows 587 | * the output of phpinfo(). The full output can contain sensitive information 588 | * so by default Drupal removes some sections. 589 | * 590 | * This behavior can be configured by setting this variable to a different 591 | * value corresponding to the flags parameter of phpinfo(). 592 | * 593 | * If you need to expose more information in the report - for example to debug a 594 | * problem - consider doing so temporarily. 595 | * 596 | * @see https://www.php.net/manual/function.phpinfo.php 597 | */ 598 | # $settings['sa_core_2023_004_phpinfo_flags'] = ~ (INFO_VARIABLES | INFO_ENVIRONMENT); 599 | 600 | /** 601 | * Private file path: 602 | * 603 | * A local file system path where private files will be stored. This directory 604 | * must be absolute, outside of the Drupal installation directory and not 605 | * accessible over the web. 606 | * 607 | * Note: Caches need to be cleared when this value is changed to make the 608 | * private:// stream wrapper available to the system. 609 | * 610 | * See https://www.drupal.org/documentation/modules/file for more information 611 | * about securing private files. 612 | */ 613 | # $settings['file_private_path'] = ''; 614 | 615 | /** 616 | * Temporary file path: 617 | * 618 | * A local file system path where temporary files will be stored. This directory 619 | * must be absolute, outside of the Drupal installation directory and not 620 | * accessible over the web. 621 | * 622 | * If this is not set, the default for the operating system will be used. 623 | * 624 | * @see \Drupal\Component\FileSystem\FileSystem::getOsTemporaryDirectory() 625 | */ 626 | # $settings['file_temp_path'] = '/tmp'; 627 | 628 | /** 629 | * Session write interval: 630 | * 631 | * Set the minimum interval between each session write to database. 632 | * For performance reasons it defaults to 180. 633 | */ 634 | # $settings['session_write_interval'] = 180; 635 | 636 | /** 637 | * String overrides: 638 | * 639 | * To override specific strings on your site with or without enabling the Locale 640 | * module, add an entry to this list. This functionality allows you to change 641 | * a small number of your site's default English language interface strings. 642 | * 643 | * Remove the leading hash signs to enable. 644 | * 645 | * The "en" part of the variable name, is dynamic and can be any langcode of 646 | * any added language. (eg locale_custom_strings_de for german). 647 | */ 648 | # $settings['locale_custom_strings_en'][''] = [ 649 | # 'Home' => 'Front page', 650 | # '@count min' => '@count minutes', 651 | # ]; 652 | 653 | /** 654 | * A custom theme for the offline page: 655 | * 656 | * This applies when the site is explicitly set to maintenance mode through the 657 | * administration page or when the database is inactive due to an error. 658 | * The template file should also be copied into the theme. It is located inside 659 | * 'core/modules/system/templates/maintenance-page.html.twig'. 660 | * 661 | * Note: This setting does not apply to installation and update pages. 662 | */ 663 | # $settings['maintenance_theme'] = 'claro'; 664 | 665 | /** 666 | * PHP settings: 667 | * 668 | * To see what PHP settings are possible, including whether they can be set at 669 | * runtime (by using ini_set()), read the PHP documentation: 670 | * http://php.net/manual/ini.list.php 671 | * See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime 672 | * settings and the .htaccess file for non-runtime settings. 673 | * Settings defined there should not be duplicated here so as to avoid conflict 674 | * issues. 675 | */ 676 | 677 | /** 678 | * If you encounter a situation where users post a large amount of text, and 679 | * the result is stripped out upon viewing but can still be edited, Drupal's 680 | * output filter may not have sufficient memory to process it. If you 681 | * experience this issue, you may wish to uncomment the following two lines 682 | * and increase the limits of these variables. For more information, see 683 | * http://php.net/manual/pcre.configuration.php. 684 | */ 685 | # ini_set('pcre.backtrack_limit', 200000); 686 | # ini_set('pcre.recursion_limit', 200000); 687 | 688 | /** 689 | * Configuration overrides. 690 | * 691 | * To globally override specific configuration values for this site, 692 | * set them here. You usually don't need to use this feature. This is 693 | * useful in a configuration file for a vhost or directory, rather than 694 | * the default settings.php. 695 | * 696 | * Note that any values you provide in these variable overrides will not be 697 | * viewable from the Drupal administration interface. The administration 698 | * interface displays the values stored in configuration so that you can stage 699 | * changes to other environments that don't have the overrides. 700 | * 701 | * There are particular configuration values that are risky to override. For 702 | * example, overriding the list of installed modules in 'core.extension' is not 703 | * supported as module install or uninstall has not occurred. Other examples 704 | * include field storage configuration, because it has effects on database 705 | * structure, and 'core.menu.static_menu_link_overrides' since this is cached in 706 | * a way that is not config override aware. Also, note that changing 707 | * configuration values in settings.php will not fire any of the configuration 708 | * change events. 709 | */ 710 | # $config['system.site']['name'] = 'My Drupal site'; 711 | # $config['user.settings']['anonymous'] = 'Visitor'; 712 | 713 | /** 714 | * Load services definition file. 715 | */ 716 | $settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; 717 | 718 | /** 719 | * Override the default service container class. 720 | * 721 | * This is useful for example to trace the service container for performance 722 | * tracking purposes, for testing a service container with an error condition or 723 | * to test a service container that throws an exception. 724 | */ 725 | # $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; 726 | 727 | /** 728 | * Override the default yaml parser class. 729 | * 730 | * Provide a fully qualified class name here if you would like to provide an 731 | * alternate implementation YAML parser. The class must implement the 732 | * \Drupal\Component\Serialization\SerializationInterface interface. 733 | */ 734 | # $settings['yaml_parser_class'] = NULL; 735 | 736 | /** 737 | * Trusted host configuration. 738 | * 739 | * Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host 740 | * header spoofing. 741 | * 742 | * To enable the trusted host mechanism, you enable your allowable hosts 743 | * in $settings['trusted_host_patterns']. This should be an array of regular 744 | * expression patterns, without delimiters, representing the hosts you would 745 | * like to allow. 746 | * 747 | * For example: 748 | * @code 749 | * $settings['trusted_host_patterns'] = [ 750 | * '^www\.example\.com$', 751 | * ]; 752 | * @endcode 753 | * will allow the site to only run from www.example.com. 754 | * 755 | * If you are running multisite, or if you are running your site from 756 | * different domain names (eg, you don't redirect http://www.example.com to 757 | * http://example.com), you should specify all of the host patterns that are 758 | * allowed by your site. 759 | * 760 | * For example: 761 | * @code 762 | * $settings['trusted_host_patterns'] = [ 763 | * '^example\.com$', 764 | * '^.+\.example\.com$', 765 | * '^example\.org$', 766 | * '^.+\.example\.org$', 767 | * ]; 768 | * @endcode 769 | * will allow the site to run off of all variants of example.com and 770 | * example.org, with all subdomains included. 771 | * 772 | * @see https://www.drupal.org/docs/installing-drupal/trusted-host-settings 773 | */ 774 | # $settings['trusted_host_patterns'] = []; 775 | 776 | /** 777 | * The default list of directories that will be ignored by Drupal's file API. 778 | * 779 | * By default ignore node_modules and bower_components folders to avoid issues 780 | * with common frontend tools and recursive scanning of directories looking for 781 | * extensions. 782 | * 783 | * @see \Drupal\Core\File\FileSystemInterface::scanDirectory() 784 | * @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() 785 | */ 786 | $settings['file_scan_ignore_directories'] = [ 787 | 'node_modules', 788 | 'bower_components', 789 | ]; 790 | 791 | /** 792 | * The default number of entities to update in a batch process. 793 | * 794 | * This is used by update and post-update functions that need to go through and 795 | * change all the entities on a site, so it is useful to increase this number 796 | * if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a 797 | * larger number of entities to be processed in a single batch run. 798 | */ 799 | $settings['entity_update_batch_size'] = 50; 800 | 801 | /** 802 | * Entity update backup. 803 | * 804 | * This is used to inform the entity storage handler that the backup tables as 805 | * well as the original entity type and field storage definitions should be 806 | * retained after a successful entity update process. 807 | */ 808 | $settings['entity_update_backup'] = TRUE; 809 | 810 | /** 811 | * State caching. 812 | * 813 | * State caching uses the cache collector pattern to cache all requested keys 814 | * from the state API in a single cache entry, which can greatly reduce the 815 | * amount of database queries. However, some sites may use state with a 816 | * lot of dynamic keys which could result in a very large cache. 817 | */ 818 | $settings['state_cache'] = TRUE; 819 | 820 | /** 821 | * Node migration type. 822 | * 823 | * This is used to force the migration system to use the classic node migrations 824 | * instead of the default complete node migrations. The migration system will 825 | * use the classic node migration only if there are existing migrate_map tables 826 | * for the classic node migrations and they contain data. These tables may not 827 | * exist if you are developing custom migrations and do not want to use the 828 | * complete node migrations. Set this to TRUE to force the use of the classic 829 | * node migrations. 830 | */ 831 | $settings['migrate_node_migrate_type_classic'] = FALSE; 832 | 833 | /** 834 | * The default settings for migration sources. 835 | * 836 | * These settings are used as the default settings on the Credential form at 837 | * /upgrade/credentials. 838 | * 839 | * - migrate_source_version - The version of the source database. This can be 840 | * '6' or '7'. Defaults to '7'. 841 | * - migrate_source_connection - The key in the $databases array for the source 842 | * site. 843 | * - migrate_file_public_path - The location of the source Drupal 6 or Drupal 7 844 | * public files. This can be a local file directory containing the source 845 | * Drupal 6 or Drupal 7 site (e.g /var/www/docroot), or the site address 846 | * (e.g http://example.com). 847 | * - migrate_file_private_path - The location of the source Drupal 7 private 848 | * files. This can be a local file directory containing the source Drupal 7 849 | * site (e.g /var/www/docroot), or empty to use the same value as Public 850 | * files directory. 851 | * 852 | * Sample configuration for a drupal 6 source site with the source files in a 853 | * local directory. 854 | * 855 | * @code 856 | * $settings['migrate_source_version'] = '6'; 857 | * $settings['migrate_source_connection'] = 'migrate'; 858 | * $settings['migrate_file_public_path'] = '/var/www/drupal6'; 859 | * @endcode 860 | * 861 | * Sample configuration for a drupal 7 source site with public source files on 862 | * the source site and the private files in a local directory. 863 | * 864 | * @code 865 | * $settings['migrate_source_version'] = '7'; 866 | * $settings['migrate_source_connection'] = 'migrate'; 867 | * $settings['migrate_file_public_path'] = 'https://drupal7.com'; 868 | * $settings['migrate_file_private_path'] = '/var/www/drupal7'; 869 | * @endcode 870 | */ 871 | # $settings['migrate_source_connection'] = ''; 872 | # $settings['migrate_source_version'] = ''; 873 | # $settings['migrate_file_public_path'] = ''; 874 | # $settings['migrate_file_private_path'] = ''; 875 | 876 | /** 877 | * Load local development override configuration, if available. 878 | * 879 | * Create a settings.local.php file to override variables on secondary (staging, 880 | * development, etc.) installations of this site. 881 | * 882 | * Typical uses of settings.local.php include: 883 | * - Disabling caching. 884 | * - Disabling JavaScript/CSS compression. 885 | * - Rerouting outgoing emails. 886 | * 887 | * Keep this code block at the end of this file to take full effect. 888 | */ 889 | # 890 | # if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) { 891 | # include $app_root . '/' . $site_path . '/settings.local.php'; 892 | # } 893 | -------------------------------------------------------------------------------- /web/sites/default/settings.nodehive.php: -------------------------------------------------------------------------------- 1 |