shlink_in_docker.local.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink;
  4. use Monolog\Handler\StreamHandler;
  5. use Monolog\Logger;
  6. use function explode;
  7. use function Functional\contains;
  8. use function Shlinkio\Shlink\Common\env;
  9. use const Shlinkio\Shlink\Core\DEFAULT_DELETE_SHORT_URL_THRESHOLD;
  10. use const Shlinkio\Shlink\Core\DEFAULT_REDIRECT_CACHE_LIFETIME;
  11. use const Shlinkio\Shlink\Core\DEFAULT_REDIRECT_STATUS_CODE;
  12. use const Shlinkio\Shlink\Core\DEFAULT_SHORT_CODES_LENGTH;
  13. use const Shlinkio\Shlink\Core\MIN_SHORT_CODES_LENGTH;
  14. $helper = new class {
  15. private const DB_DRIVERS_MAP = [
  16. 'mysql' => 'pdo_mysql',
  17. 'maria' => 'pdo_mysql',
  18. 'postgres' => 'pdo_pgsql',
  19. 'mssql' => 'pdo_sqlsrv',
  20. ];
  21. private const DB_PORTS_MAP = [
  22. 'mysql' => '3306',
  23. 'maria' => '3306',
  24. 'postgres' => '5432',
  25. 'mssql' => '1433',
  26. ];
  27. public function getDbConfig(): array
  28. {
  29. $driver = env('DB_DRIVER');
  30. $isMysql = contains(['maria', 'mysql'], $driver);
  31. if ($driver === null || $driver === 'sqlite') {
  32. return [
  33. 'driver' => 'pdo_sqlite',
  34. 'path' => 'data/database.sqlite',
  35. ];
  36. }
  37. $driverOptions = ! $isMysql ? [] : [
  38. // 1002 -> PDO::MYSQL_ATTR_INIT_COMMAND
  39. 1002 => 'SET NAMES utf8',
  40. // 1000 -> PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
  41. 1000 => true,
  42. ];
  43. return [
  44. 'driver' => self::DB_DRIVERS_MAP[$driver],
  45. 'dbname' => env('DB_NAME', 'shlink'),
  46. 'user' => env('DB_USER'),
  47. 'password' => env('DB_PASSWORD'),
  48. 'host' => env('DB_HOST', $driver === 'postgres' ? env('DB_UNIX_SOCKET') : null),
  49. 'port' => env('DB_PORT', self::DB_PORTS_MAP[$driver]),
  50. 'driverOptions' => $driverOptions,
  51. 'unix_socket' => $isMysql ? env('DB_UNIX_SOCKET') : null,
  52. ];
  53. }
  54. public function getNotFoundRedirectsConfig(): array
  55. {
  56. return [
  57. 'invalid_short_url' => env('INVALID_SHORT_URL_REDIRECT_TO'),
  58. 'regular_404' => env('REGULAR_404_REDIRECT_TO'),
  59. 'base_url' => env('BASE_URL_REDIRECT_TO'),
  60. ];
  61. }
  62. public function getVisitsWebhooks(): array
  63. {
  64. $webhooks = env('VISITS_WEBHOOKS');
  65. return $webhooks === null ? [] : explode(',', $webhooks);
  66. }
  67. public function getRedisConfig(): ?array
  68. {
  69. $redisServers = env('REDIS_SERVERS');
  70. return $redisServers === null ? null : ['servers' => $redisServers];
  71. }
  72. public function getDefaultShortCodesLength(): int
  73. {
  74. $value = (int) env('DEFAULT_SHORT_CODES_LENGTH', DEFAULT_SHORT_CODES_LENGTH);
  75. return $value < MIN_SHORT_CODES_LENGTH ? MIN_SHORT_CODES_LENGTH : $value;
  76. }
  77. public function getMercureConfig(): array
  78. {
  79. $publicUrl = env('MERCURE_PUBLIC_HUB_URL');
  80. return [
  81. 'public_hub_url' => $publicUrl,
  82. 'internal_hub_url' => env('MERCURE_INTERNAL_HUB_URL', $publicUrl),
  83. 'jwt_secret' => env('MERCURE_JWT_SECRET'),
  84. ];
  85. }
  86. };
  87. return [
  88. 'app_options' => [
  89. 'disable_track_param' => env('DISABLE_TRACK_PARAM'),
  90. ],
  91. 'delete_short_urls' => [
  92. 'check_visits_threshold' => true,
  93. 'visits_threshold' => (int) env('DELETE_SHORT_URL_THRESHOLD', DEFAULT_DELETE_SHORT_URL_THRESHOLD),
  94. ],
  95. 'entity_manager' => [
  96. 'connection' => $helper->getDbConfig(),
  97. ],
  98. 'url_shortener' => [
  99. 'domain' => [
  100. 'schema' => env('SHORT_DOMAIN_SCHEMA', 'http'),
  101. 'hostname' => env('SHORT_DOMAIN_HOST', ''),
  102. ],
  103. 'validate_url' => (bool) env('VALIDATE_URLS', false),
  104. 'anonymize_remote_addr' => (bool) env('ANONYMIZE_REMOTE_ADDR', true),
  105. 'visits_webhooks' => $helper->getVisitsWebhooks(),
  106. 'default_short_codes_length' => $helper->getDefaultShortCodesLength(),
  107. 'redirect_status_code' => (int) env('REDIRECT_STATUS_CODE', DEFAULT_REDIRECT_STATUS_CODE),
  108. 'redirect_cache_lifetime' => (int) env('REDIRECT_CACHE_LIFETIME', DEFAULT_REDIRECT_CACHE_LIFETIME),
  109. 'auto_resolve_titles' => (bool) env('AUTO_RESOLVE_TITLES', false),
  110. 'track_orphan_visits' => (bool) env('TRACK_ORPHAN_VISITS', true),
  111. ],
  112. 'not_found_redirects' => $helper->getNotFoundRedirectsConfig(),
  113. 'logger' => [
  114. 'Shlink' => [
  115. 'handlers' => [
  116. 'shlink_handler' => [
  117. 'name' => StreamHandler::class,
  118. 'params' => [
  119. 'level' => Logger::INFO,
  120. 'stream' => 'php://stdout',
  121. ],
  122. ],
  123. ],
  124. ],
  125. ],
  126. 'dependencies' => [
  127. 'aliases' => env('REDIS_SERVERS') === null ? [] : [
  128. 'lock_store' => 'redis_lock_store',
  129. ],
  130. ],
  131. 'cache' => [
  132. 'redis' => $helper->getRedisConfig(),
  133. ],
  134. 'router' => [
  135. 'base_path' => env('BASE_PATH', ''),
  136. ],
  137. 'mezzio-swoole' => [
  138. 'swoole-http-server' => [
  139. 'port' => (int) env('PORT', 8080),
  140. 'options' => [
  141. 'worker_num' => (int) env('WEB_WORKER_NUM', 16),
  142. 'task_worker_num' => (int) env('TASK_WORKER_NUM', 16),
  143. ],
  144. ],
  145. ],
  146. 'geolite2' => [
  147. 'license_key' => env('GEOLITE_LICENSE_KEY', 'G4Lm0C60yJsnkdPi'),
  148. ],
  149. 'mercure' => $helper->getMercureConfig(),
  150. ];