From 46601443f5b4d6a24cf3a2ab4a45d4ec0a4f6d67 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Wed, 23 Oct 2024 09:16:52 +0200 Subject: [PATCH] Load specific env file when running API tests --- .dockerignore | 1 + bin/test/run-api-tests.sh | 4 ++ config/test/shlink-test.env | 8 ++++ config/test/test_config.global.php | 14 ------- data/infra/roadrunner.Dockerfile | 2 + docker-compose.yml | 2 - module/CLI/src/ApiKey/RoleResolver.php | 2 +- module/CLI/test/ApiKey/RoleResolverTest.php | 5 +-- .../ShortUrl/CreateShortUrlCommandTest.php | 5 +-- .../Config/Options/UrlShortenerOptions.php | 16 +++----- module/Core/src/Domain/DomainService.php | 4 +- .../ShortUrl/Helper/ShortUrlStringifier.php | 6 +-- .../PersistenceShortUrlRelationResolver.php | 2 +- .../Core/src/ShortUrl/ShortUrlListService.php | 2 +- module/Core/test/Action/QrCodeActionTest.php | 1 - module/Core/test/Domain/DomainServiceTest.php | 5 +-- .../test/Matomo/MatomoVisitSenderTest.php | 2 +- .../Helper/ShortUrlStringifierTest.php | 38 ++++++++++--------- ...ersistenceShortUrlRelationResolverTest.php | 4 +- .../src/Action/Visit/DomainVisitsAction.php | 2 +- ...DropDefaultDomainFromRequestMiddleware.php | 2 +- .../ShortUrl/ListShortUrlsActionTest.php | 5 +-- .../Action/Visit/DomainVisitsActionTest.php | 5 +-- ...DefaultDomainFromRequestMiddlewareTest.php | 4 +- shlink-dev.env.dist | 1 + 25 files changed, 59 insertions(+), 83 deletions(-) create mode 100644 config/test/shlink-test.env diff --git a/.dockerignore b/.dockerignore index e3aff686..db2d21f0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -23,3 +23,4 @@ php*xml* build* **/.* !config/roadrunner/.rr.yml +*.env* diff --git a/bin/test/run-api-tests.sh b/bin/test/run-api-tests.sh index ffc152b7..4c519a9b 100755 --- a/bin/test/run-api-tests.sh +++ b/bin/test/run-api-tests.sh @@ -17,8 +17,12 @@ touch $OUTPUT_LOGS # Try to stop server just in case it hanged in last execution [ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -f -w . +# Resolve .env file absolute path, as it fails to load with relative paths +TESTS_DOTENV="${PWD}/config/test/shlink-test.env" + echo 'Starting server...' [ "$TEST_RUNTIME" = 'rr' ] && bin/rr serve -p -w . -c=config/roadrunner/.rr.test.yml \ + --dotenv "$TESTS_DOTENV" \ -o=logs.output="${PWD}/${OUTPUT_LOGS}" \ -o=logs.channels.http.output="${PWD}/${OUTPUT_LOGS}" \ -o=logs.channels.server.output="${PWD}/${OUTPUT_LOGS}" & diff --git a/config/test/shlink-test.env b/config/test/shlink-test.env new file mode 100644 index 00000000..d0eac32a --- /dev/null +++ b/config/test/shlink-test.env @@ -0,0 +1,8 @@ +# URL shortener +DEFAULT_DOMAIN=s.test +IS_HTTPS_ENABLED=false + +# Disable mercure integration during E2E tests +MERCURE_PUBLIC_HUB_URL=null +MERCURE_INTERNAL_HUB_URL=null +MERCURE_JWT_SECRET=null diff --git a/config/test/test_config.global.php b/config/test/test_config.global.php index aad5e9d0..bd6771e6 100644 --- a/config/test/test_config.global.php +++ b/config/test/test_config.global.php @@ -93,13 +93,6 @@ return [ ConfigAggregator::ENABLE_CACHE => false, FastRouteRouter::CONFIG_CACHE_ENABLED => false, - 'url_shortener' => [ - 'domain' => [ - 'schema' => 'http', - 'hostname' => 's.test', - ], - ], - 'routes' => [ // This route is used to test that title resolution is skipped if the long URL times out [ @@ -120,13 +113,6 @@ return [ ], ], - // Disable mercure integration during E2E tests - 'mercure' => [ - 'public_hub_url' => null, - 'internal_hub_url' => null, - 'jwt_secret' => null, - ], - 'dependencies' => [ 'services' => [ 'shlink_test_api_client' => new Client([ diff --git a/data/infra/roadrunner.Dockerfile b/data/infra/roadrunner.Dockerfile index 8c412350..28d2d343 100644 --- a/data/infra/roadrunner.Dockerfile +++ b/data/infra/roadrunner.Dockerfile @@ -73,5 +73,7 @@ CMD \ if [[ ! -d "./vendor" ]]; then /usr/local/bin/composer install ; fi && \ # Download roadrunner binary if [[ ! -f "./bin/rr" ]]; then ./vendor/bin/rr get --no-interaction --no-config --location bin/ && chmod +x bin/rr ; fi && \ + # Create .env file if it does not exist yet + if [[ ! -f "./shlink-dev.env" ]]; then cp ./shlink-dev.env.dist ./shlink-dev.env ; fi && \ # Run with `exec` so that signals are properly handled exec ./bin/rr serve --dotenv /home/shlink/shlink-dev.env -c config/roadrunner/.rr.dev.yml diff --git a/docker-compose.yml b/docker-compose.yml index 2052b1cf..05132dfb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,8 +61,6 @@ services: - shlink_mercure_proxy - shlink_rabbitmq - shlink_matomo - environment: - DEFAULT_DOMAIN: localhost:8800 extra_hosts: - 'host.docker.internal:host-gateway' diff --git a/module/CLI/src/ApiKey/RoleResolver.php b/module/CLI/src/ApiKey/RoleResolver.php index bfcf11a3..ece56c77 100644 --- a/module/CLI/src/ApiKey/RoleResolver.php +++ b/module/CLI/src/ApiKey/RoleResolver.php @@ -40,7 +40,7 @@ readonly class RoleResolver implements RoleResolverInterface private function resolveRoleForAuthority(string $domainAuthority): RoleDefinition { - if ($domainAuthority === $this->urlShortenerOptions->defaultDomain()) { + if ($domainAuthority === $this->urlShortenerOptions->defaultDomain) { throw InvalidRoleConfigException::forDomainOnlyWithDefaultDomain(); } diff --git a/module/CLI/test/ApiKey/RoleResolverTest.php b/module/CLI/test/ApiKey/RoleResolverTest.php index d1f696f5..184780d7 100644 --- a/module/CLI/test/ApiKey/RoleResolverTest.php +++ b/module/CLI/test/ApiKey/RoleResolverTest.php @@ -25,10 +25,7 @@ class RoleResolverTest extends TestCase protected function setUp(): void { $this->domainService = $this->createMock(DomainServiceInterface::class); - $this->resolver = new RoleResolver( - $this->domainService, - new UrlShortenerOptions(domain: ['hostname' => 'default.com']), - ); + $this->resolver = new RoleResolver($this->domainService, new UrlShortenerOptions('default.com')); } #[Test, DataProvider('provideRoles')] diff --git a/module/CLI/test/Command/ShortUrl/CreateShortUrlCommandTest.php b/module/CLI/test/Command/ShortUrl/CreateShortUrlCommandTest.php index 86bd87fb..19c57481 100644 --- a/module/CLI/test/Command/ShortUrl/CreateShortUrlCommandTest.php +++ b/module/CLI/test/Command/ShortUrl/CreateShortUrlCommandTest.php @@ -37,10 +37,7 @@ class CreateShortUrlCommandTest extends TestCase $command = new CreateShortUrlCommand( $this->urlShortener, $this->stringifier, - new UrlShortenerOptions( - domain: ['hostname' => 'example.com', 'schema' => ''], - defaultShortCodesLength: 5, - ), + new UrlShortenerOptions(defaultDomain: 'example.com', defaultShortCodesLength: 5), ); $this->commandTester = CliTestUtils::testerForCommand($command); } diff --git a/module/Core/src/Config/Options/UrlShortenerOptions.php b/module/Core/src/Config/Options/UrlShortenerOptions.php index b815ac0f..98b450b4 100644 --- a/module/Core/src/Config/Options/UrlShortenerOptions.php +++ b/module/Core/src/Config/Options/UrlShortenerOptions.php @@ -15,10 +15,11 @@ use const Shlinkio\Shlink\MIN_SHORT_CODES_LENGTH; final readonly class UrlShortenerOptions { /** - * @param array{schema: ?string, hostname: ?string} $domain + * @param 'http'|'https' $schema */ public function __construct( - public array $domain = ['schema' => null, 'hostname' => null], + public string $defaultDomain = '', + public string $schema = 'http', public int $defaultShortCodesLength = DEFAULT_SHORT_CODES_LENGTH, public bool $autoResolveTitles = false, public bool $appendExtraPath = false, @@ -37,10 +38,8 @@ final readonly class UrlShortenerOptions $mode = EnvVars::SHORT_URL_MODE->loadFromEnv(); return new self( - domain: [ - 'schema' => ((bool) EnvVars::IS_HTTPS_ENABLED->loadFromEnv()) ? 'https' : 'http', - 'hostname' => EnvVars::DEFAULT_DOMAIN->loadFromEnv(), - ], + defaultDomain: EnvVars::DEFAULT_DOMAIN->loadFromEnv(), + schema: ((bool) EnvVars::IS_HTTPS_ENABLED->loadFromEnv()) ? 'https' : 'http', defaultShortCodesLength: $shortCodesLength, autoResolveTitles: (bool) EnvVars::AUTO_RESOLVE_TITLES->loadFromEnv(), appendExtraPath: (bool) EnvVars::REDIRECT_APPEND_EXTRA_PATH->loadFromEnv(), @@ -54,9 +53,4 @@ final readonly class UrlShortenerOptions { return $this->mode === ShortUrlMode::LOOSE; } - - public function defaultDomain(): string - { - return $this->domain['hostname'] ?? ''; - } } diff --git a/module/Core/src/Domain/DomainService.php b/module/Core/src/Domain/DomainService.php index 382ca08e..e514af55 100644 --- a/module/Core/src/Domain/DomainService.php +++ b/module/Core/src/Domain/DomainService.php @@ -37,7 +37,7 @@ readonly class DomainService implements DomainServiceInterface return [ DomainItem::forDefaultDomain( - $this->urlShortenerOptions->defaultDomain(), + $this->urlShortenerOptions->defaultDomain, $default ?? new EmptyNotFoundRedirectConfig(), ), ...$mappedDomains, @@ -56,7 +56,7 @@ readonly class DomainService implements DomainServiceInterface $restOfDomains = []; foreach ($allDomains as $domain) { - if ($domain->authority === $this->urlShortenerOptions->defaultDomain()) { + if ($domain->authority === $this->urlShortenerOptions->defaultDomain) { $defaultDomain = $domain; } else { $restOfDomains[] = $domain; diff --git a/module/Core/src/ShortUrl/Helper/ShortUrlStringifier.php b/module/Core/src/ShortUrl/Helper/ShortUrlStringifier.php index 540b444c..6659bc0c 100644 --- a/module/Core/src/ShortUrl/Helper/ShortUrlStringifier.php +++ b/module/Core/src/ShortUrl/Helper/ShortUrlStringifier.php @@ -20,8 +20,7 @@ readonly class ShortUrlStringifier implements ShortUrlStringifierInterface public function stringify(ShortUrl $shortUrl): string { - $domainConfig = $this->urlShortenerOptions->domain; - $uriWithoutShortCode = (new Uri())->withScheme($domainConfig['schema'] ?? 'http') + $uriWithoutShortCode = (new Uri())->withScheme($this->urlShortenerOptions->schema) ->withHost($this->resolveDomain($shortUrl)) ->withPath($this->basePath) ->__toString(); @@ -32,7 +31,6 @@ readonly class ShortUrlStringifier implements ShortUrlStringifierInterface private function resolveDomain(ShortUrl $shortUrl): string { - $domainConfig = $this->urlShortenerOptions->domain; - return $shortUrl->getDomain()?->authority ?? $domainConfig['hostname'] ?? ''; + return $shortUrl->getDomain()?->authority ?? $this->urlShortenerOptions->defaultDomain; } } diff --git a/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php b/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php index 0b79f97d..94fb314a 100644 --- a/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php +++ b/module/Core/src/ShortUrl/Resolver/PersistenceShortUrlRelationResolver.php @@ -40,7 +40,7 @@ class PersistenceShortUrlRelationResolver implements ShortUrlRelationResolverInt public function resolveDomain(?string $domain): ?Domain { - if ($domain === null || $domain === $this->options->defaultDomain()) { + if ($domain === null || $domain === $this->options->defaultDomain) { return null; } diff --git a/module/Core/src/ShortUrl/ShortUrlListService.php b/module/Core/src/ShortUrl/ShortUrlListService.php index b6539256..853a40b9 100644 --- a/module/Core/src/ShortUrl/ShortUrlListService.php +++ b/module/Core/src/ShortUrl/ShortUrlListService.php @@ -24,7 +24,7 @@ readonly class ShortUrlListService implements ShortUrlListServiceInterface */ public function listShortUrls(ShortUrlsParams $params, ?ApiKey $apiKey = null): Paginator { - $defaultDomain = $this->urlShortenerOptions->defaultDomain(); + $defaultDomain = $this->urlShortenerOptions->defaultDomain; $paginator = new Paginator(new ShortUrlRepositoryAdapter($this->repo, $params, $apiKey, $defaultDomain)); $paginator->setMaxPerPage($params->itemsPerPage) ->setCurrentPage($params->page); diff --git a/module/Core/test/Action/QrCodeActionTest.php b/module/Core/test/Action/QrCodeActionTest.php index d040b7d7..5e499403 100644 --- a/module/Core/test/Action/QrCodeActionTest.php +++ b/module/Core/test/Action/QrCodeActionTest.php @@ -17,7 +17,6 @@ use Psr\Log\NullLogger; use Shlinkio\Shlink\Common\Response\QrCodeResponse; use Shlinkio\Shlink\Core\Action\QrCodeAction; use Shlinkio\Shlink\Core\Config\Options\QrCodeOptions; -use Shlinkio\Shlink\Core\Config\Options\UrlShortenerOptions; use Shlinkio\Shlink\Core\Exception\ShortUrlNotFoundException; use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl; use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifier; diff --git a/module/Core/test/Domain/DomainServiceTest.php b/module/Core/test/Domain/DomainServiceTest.php index 82a25654..7e2fea18 100644 --- a/module/Core/test/Domain/DomainServiceTest.php +++ b/module/Core/test/Domain/DomainServiceTest.php @@ -29,10 +29,7 @@ class DomainServiceTest extends TestCase protected function setUp(): void { $this->em = $this->createMock(EntityManagerInterface::class); - $this->domainService = new DomainService( - $this->em, - new UrlShortenerOptions(domain: ['hostname' => 'default.com']), - ); + $this->domainService = new DomainService($this->em, new UrlShortenerOptions(defaultDomain: 'default.com')); } #[Test, DataProvider('provideExcludedDomains')] diff --git a/module/Core/test/Matomo/MatomoVisitSenderTest.php b/module/Core/test/Matomo/MatomoVisitSenderTest.php index 1794973b..6a4659f1 100644 --- a/module/Core/test/Matomo/MatomoVisitSenderTest.php +++ b/module/Core/test/Matomo/MatomoVisitSenderTest.php @@ -37,7 +37,7 @@ class MatomoVisitSenderTest extends TestCase $this->visitSender = new MatomoVisitSender( $this->trackerBuilder, - new ShortUrlStringifier(new UrlShortenerOptions(domain: ['hostname' => 's2.test'])), + new ShortUrlStringifier(new UrlShortenerOptions(defaultDomain: 's2.test')), $this->visitIterationRepository, ); } diff --git a/module/Core/test/ShortUrl/Helper/ShortUrlStringifierTest.php b/module/Core/test/ShortUrl/Helper/ShortUrlStringifierTest.php index 42379531..d28fdf0e 100644 --- a/module/Core/test/ShortUrl/Helper/ShortUrlStringifierTest.php +++ b/module/Core/test/ShortUrl/Helper/ShortUrlStringifierTest.php @@ -14,14 +14,18 @@ use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlCreation; class ShortUrlStringifierTest extends TestCase { + /** + * @param 'http'|'https' $schema + */ #[Test, DataProvider('provideConfigAndShortUrls')] public function generatesExpectedOutputBasedOnConfigAndShortUrl( - array $domainConfig, + string $defaultDomain, + string $schema, string $basePath, ShortUrl $shortUrl, string $expected, ): void { - $stringifier = new ShortUrlStringifier(new UrlShortenerOptions($domainConfig), $basePath); + $stringifier = new ShortUrlStringifier(new UrlShortenerOptions($defaultDomain, $schema), $basePath); self::assertEquals($expected, $stringifier->stringify($shortUrl)); } @@ -36,45 +40,45 @@ class ShortUrlStringifierTest extends TestCase ]), ); - yield 'no config' => [[], '', $shortUrlWithShortCode('foo'), 'http:/foo']; - yield 'hostname in config' => [ - ['hostname' => 'example.com'], + yield 'no default domain' => ['', 'http', '', $shortUrlWithShortCode('foo'), 'http:/foo']; + yield 'default domain' => [ + 'example.com', + 'http', '', $shortUrlWithShortCode('bar'), 'http://example.com/bar', ]; yield 'special chars in short code' => [ - ['hostname' => 'example.com'], + 'example.com', + 'http', '', $shortUrlWithShortCode('グーグル'), 'http://example.com/グーグル', ]; yield 'emojis in short code' => [ - ['hostname' => 'example.com'], + 'example.com', + 'http', '', $shortUrlWithShortCode('🦣-🍅'), 'http://example.com/🦣-🍅', ]; - yield 'hostname with base path in config' => [ - ['hostname' => 'example.com/foo/bar'], + yield 'default domain with base path' => [ + 'example.com/foo/bar', + 'http', '', $shortUrlWithShortCode('abc'), 'http://example.com/foo/bar/abc', ]; - yield 'full config' => [ - ['schema' => 'https', 'hostname' => 'foo.com'], - '', - $shortUrlWithShortCode('baz'), - 'https://foo.com/baz', - ]; yield 'custom domain' => [ - ['schema' => 'https', 'hostname' => 'foo.com'], + 'foo.com', + 'https', '', $shortUrlWithShortCode('baz', 'mydom.es'), 'https://mydom.es/baz', ]; yield 'custom domain with base path' => [ - ['schema' => 'https', 'hostname' => 'foo.com'], + 'foo.com', + 'https', '/foo/bar', $shortUrlWithShortCode('baz', 'mydom.es'), 'https://mydom.es/foo/bar/baz', diff --git a/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php b/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php index d6223734..722ac347 100644 --- a/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php +++ b/module/Core/test/ShortUrl/Resolver/PersistenceShortUrlRelationResolverTest.php @@ -29,9 +29,7 @@ class PersistenceShortUrlRelationResolverTest extends TestCase $this->em = $this->createMock(EntityManagerInterface::class); $this->em->method('getEventManager')->willReturn(new EventManager()); - $this->resolver = new PersistenceShortUrlRelationResolver($this->em, new UrlShortenerOptions( - domain: ['schema' => 'https', 'hostname' => 'default.com'], - )); + $this->resolver = new PersistenceShortUrlRelationResolver($this->em, new UrlShortenerOptions('default.com')); } #[Test, DataProvider('provideDomainsThatEmpty')] diff --git a/module/Rest/src/Action/Visit/DomainVisitsAction.php b/module/Rest/src/Action/Visit/DomainVisitsAction.php index 31b8add4..4d534202 100644 --- a/module/Rest/src/Action/Visit/DomainVisitsAction.php +++ b/module/Rest/src/Action/Visit/DomainVisitsAction.php @@ -38,7 +38,7 @@ class DomainVisitsAction extends AbstractRestAction private function resolveDomainParam(Request $request): string { $domainParam = $request->getAttribute('domain', ''); - if ($domainParam === $this->urlShortenerOptions->defaultDomain()) { + if ($domainParam === $this->urlShortenerOptions->defaultDomain) { return 'DEFAULT'; } diff --git a/module/Rest/src/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddleware.php b/module/Rest/src/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddleware.php index f50341d2..acf33603 100644 --- a/module/Rest/src/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddleware.php +++ b/module/Rest/src/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddleware.php @@ -28,7 +28,7 @@ readonly class DropDefaultDomainFromRequestMiddleware implements MiddlewareInter private function sanitizeDomainFromPayload(array $payload): array { - if (isset($payload['domain']) && $payload['domain'] === $this->urlShortenerOptions->defaultDomain()) { + if (isset($payload['domain']) && $payload['domain'] === $this->urlShortenerOptions->defaultDomain) { unset($payload['domain']); } diff --git a/module/Rest/test/Action/ShortUrl/ListShortUrlsActionTest.php b/module/Rest/test/Action/ShortUrl/ListShortUrlsActionTest.php index 071fb844..a3beba1b 100644 --- a/module/Rest/test/Action/ShortUrl/ListShortUrlsActionTest.php +++ b/module/Rest/test/Action/ShortUrl/ListShortUrlsActionTest.php @@ -31,10 +31,7 @@ class ListShortUrlsActionTest extends TestCase $this->service = $this->createMock(ShortUrlListServiceInterface::class); $this->action = new ListShortUrlsAction($this->service, new ShortUrlDataTransformer( - new ShortUrlStringifier(new UrlShortenerOptions(domain: [ - 'hostname' => 's.test', - 'schema' => 'https', - ])), + new ShortUrlStringifier(new UrlShortenerOptions('s.test')), )); } diff --git a/module/Rest/test/Action/Visit/DomainVisitsActionTest.php b/module/Rest/test/Action/Visit/DomainVisitsActionTest.php index 3fb4c498..d60dae2e 100644 --- a/module/Rest/test/Action/Visit/DomainVisitsActionTest.php +++ b/module/Rest/test/Action/Visit/DomainVisitsActionTest.php @@ -25,10 +25,7 @@ class DomainVisitsActionTest extends TestCase protected function setUp(): void { $this->visitsHelper = $this->createMock(VisitsStatsHelperInterface::class); - $this->action = new DomainVisitsAction( - $this->visitsHelper, - new UrlShortenerOptions(domain: ['hostname' => 'the_default.com']), - ); + $this->action = new DomainVisitsAction($this->visitsHelper, new UrlShortenerOptions('the_default.com')); } #[Test, DataProvider('provideDomainAuthorities')] diff --git a/module/Rest/test/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddlewareTest.php b/module/Rest/test/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddlewareTest.php index 530e28ca..b8235498 100644 --- a/module/Rest/test/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddlewareTest.php +++ b/module/Rest/test/Middleware/ShortUrl/DropDefaultDomainFromRequestMiddlewareTest.php @@ -24,9 +24,7 @@ class DropDefaultDomainFromRequestMiddlewareTest extends TestCase protected function setUp(): void { $this->next = $this->createMock(RequestHandlerInterface::class); - $this->middleware = new DropDefaultDomainFromRequestMiddleware( - new UrlShortenerOptions(domain: ['hostname' => 's.test']), - ); + $this->middleware = new DropDefaultDomainFromRequestMiddleware(new UrlShortenerOptions('s.test')); } #[Test, DataProvider('provideQueryParams')] diff --git a/shlink-dev.env.dist b/shlink-dev.env.dist index 5ab21ea1..1bd58636 100644 --- a/shlink-dev.env.dist +++ b/shlink-dev.env.dist @@ -3,6 +3,7 @@ LC_ALL=C #GEOLITE_LICENSE_KEY= # URL shortener +DEFAULT_DOMAIN=localhost:8800 IS_HTTPS_ENABLED=false # Database - MySQL