summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.env.example5
-rw-r--r--.gitignore2
-rw-r--r--Readme.md79
-rwxr-xr-xbin/build.php48
-rwxr-xr-xbin/run.php9
-rwxr-xr-xbin/setup.php28
-rw-r--r--composer.json6
-rw-r--r--composer.lock618
-rw-r--r--docker-compose.yml40
9 files changed, 835 insertions, 0 deletions
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..c9fe1e6
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,5 @@
+POSTGRES_PASSWORD=password
+DOMAIN=mastodon.example.org
+LETS_ENCRYPT_EMAIL=le@example.org
+COMPOSE_PROJECT_NAME=mastodon
+TRAEFIK_NETWORK=traefik-public
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a4a031f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+/build/
diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..a809966
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1,79 @@
+Mastodon Docker Setup with traefik
+===
+
+The scripts provided modify the official `docker-compose.yml` file
+to be
+
+- fast and easy to set up, without build step
+- usable with [traefik](https://traefik.io/)
+
+The provided [docker-compose.yml](docker-compose.yml) file can be used to set up traefik.
+
+## Requirements
+
+- PHP
+- Docker
+- [traefik](https://traefik.io/)
+
+
+## Instructions
+
+Run the scripts in the following order
+
+```
+./bin/build.php
+./bin/setup.php
+./bin/run.php
+```
+
+### Build
+
+```
+./bin/build.php
+```
+
+Builds the docker-compose.yml file with traefik labels
+
+
+### Setup
+
+```
+./bin/setup.php
+```
+
+This runs the `mastodon:setup` command to populate the `.env.production` file.
+
+Config:
+
+- Domain name: ${same as in .env DOMAIN}
+- Single user mode?: up to you
+- Using docker?: Yes
+- PostgreSQL host: default (db)
+- PostgreSQL port: default (5432)
+- PostgreSQL database: default (postgres)
+- PostgreSQL user: default (postgres)
+- PostgreSQL password: ${same as in .env POSTGRES_PASSWORD}
+- Redis host: default (redis)
+- Redis port: default (6379)
+- Redis password: default (empty)
+- Store uploaded files on the cloud?: up to you
+- Send e-mails from localhost?: up to you
+- Save configuration?: y
+- Prepare the database now?: y
+- Create admin user?: up to you
+
+
+### Run
+
+```
+./bin/run.php
+```
+
+Runs mastodon
+
+## Credits
+
+- https://github.com/peterrus/docker-mastodon
+- https://www.innoq.com/en/blog/traefik-v2-and-mastodon/
+- https://gist.github.com/fredix/6ef5c95c600dbbb9afc0e0538a93d90d
+- https://www.howtoforge.com/how-to-install-mastodon-social-network-with-docker-on-ubuntu-1804/
diff --git a/bin/build.php b/bin/build.php
new file mode 100755
index 0000000..07aa584
--- /dev/null
+++ b/bin/build.php
@@ -0,0 +1,48 @@
+#!/usr/bin/env php
+
+<?php
+
+require_once dirname(__DIR__) . '/vendor/autoload.php';
+
+use Symfony\Component\Yaml\Yaml;
+
+$rootDir = dirname(__DIR__);
+$buildDir = "$rootDir/build";
+@mkdir($buildDir);
+
+// get official compose file
+$dockerCompose = Yaml::parse(file_get_contents('https://raw.githubusercontent.com/tootsuite/mastodon/main/docker-compose.yml'));
+
+// set missing POSTGRES_PASSWORD
+$dockerCompose['services']['db']['environment'][] = 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}';
+
+// set traefik labels for external services
+$dockerCompose['services']['web']['labels'] = [
+ 'traefik.enable=true',
+ 'traefik.docker.network=${TRAEFIK_NETWORK}',
+ 'traefik.http.services.${COMPOSE_PROJECT_NAME}-web.loadbalancer.server.port=3000',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${DOMAIN}`)',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.entrypoints=websecure',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.tls.certresolver=letsencrypt',
+];
+$dockerCompose['services']['streaming']['labels'] = [
+ 'traefik.enable=true',
+ 'traefik.docker.network=${TRAEFIK_NETWORK}',
+ 'traefik.http.services.${COMPOSE_PROJECT_NAME}-streaming.loadbalancer.server.port=4000',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-streaming.rule=(Host(`${DOMAIN}`) && PathPrefix(`/api/v1/streaming`))',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-streaming.entrypoints=websecure',
+ 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-streaming.tls.certresolver=letsencrypt',
+];
+
+// remove build instructions to use pre-built images
+unset($dockerCompose['services']['web']['build']);
+unset($dockerCompose['services']['streaming']['build']);
+unset($dockerCompose['services']['sidekiq']['build']);
+
+// set external network for use with traefik
+$dockerCompose['services']['web']['networks'][] = '${TRAEFIK_NETWORK}';
+$dockerCompose['services']['streaming']['networks'][] = '${TRAEFIK_NETWORK}';
+$dockerCompose['networks']['${TRAEFIK_NETWORK}']['external'] = true;
+
+// write to build dir
+file_put_contents("$buildDir/docker-compose.yml", Yaml::dump($dockerCompose, 99));
diff --git a/bin/run.php b/bin/run.php
new file mode 100755
index 0000000..2621c5d
--- /dev/null
+++ b/bin/run.php
@@ -0,0 +1,9 @@
+#!/usr/bin/env php
+
+<?php
+
+$rootDir = dirname(__DIR__);
+$buildDir = "$rootDir/build";
+
+chdir($buildDir);
+exec("docker-compose up -d");
diff --git a/bin/setup.php b/bin/setup.php
new file mode 100755
index 0000000..ade01c6
--- /dev/null
+++ b/bin/setup.php
@@ -0,0 +1,28 @@
+#!/usr/bin/env php
+
+<?php
+
+$rootDir = dirname(__DIR__);
+$buildDir = "$rootDir/build";
+
+// check if .env is propery set
+if (! file_exists("$buildDir/.env")) {
+ copy("$rootDir/.env.example", "$buildDir/.env");
+ exit('Adjust .env in build directory first.');
+}
+else if (strpos(file_get_contents("$buildDir/.env"), 'example.org') !== false) {
+ exit('Adjust .env in build directory first.');
+}
+
+// load .env
+$dotenv = \Dotenv\Dotenv::createImmutable($buildDir);
+$dotenv->load();
+
+// change to build dir
+chdir($buildDir);
+
+// create .env.production for mastodon setup
+exec("touch $buildDir/.env.production");
+
+// run mastodon:setup
+exec("docker-compose run --rm -v $buildDir/.env.production:/opt/mastodon/.env.production web bundle exec rake mastodon:setup");
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..cf2357f
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,6 @@
+{
+ "require": {
+ "symfony/yaml": "^5.3",
+ "vlucas/phpdotenv": "^5.3"
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..4175251
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,618 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "59dbd6375c7b06927d5d2f34ee27f9a1",
+ "packages": [
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0|^8.0",
+ "phpoption/phpoption": "^1.7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-04-13T13:17:36+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.7.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "support": {
+ "issues": "https://github.com/schmittjoh/php-option/issues",
+ "source": "https://github.com/schmittjoh/php-option/tree/1.7.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-20T17:29:33+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-23T23:28:01+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-19T12:13:01+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
+ "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-05-27T09:27:20+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0",
+ "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-19T12:13:01+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v5.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229",
+ "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "symfony/console": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v5.3.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-06-24T08:13:00+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.1",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.7.4",
+ "symfony/polyfill-ctype": "^1.17",
+ "symfony/polyfill-mbstring": "^1.17",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "homepage": "https://gjcampbell.co.uk/"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://vancelucas.com/"
+ }
+ ],
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-20T15:23:13+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.1.0"
+}
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..95477b1
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,40 @@
+version: "3"
+
+services:
+ traefik:
+ image: traefik
+ container_name: "traefik"
+ restart: always
+ command:
+ #- "--log.level=DEBUG"
+ - "--api.insecure=true"
+ - "--entrypoints.web.address=:80"
+ - "--entrypoints.websecure.address=:443"
+ - "--providers.docker=true"
+ - "--providers.docker.exposedbydefault=false"
+ ports:
+ - "80:80"
+ - "443:443"
+ labels:
+ - "traefik.enable=true"
+ # Dashboard
+ - "traefik.http.services.traefik.loadbalancer.server.port=8080"
+ - "traefik.http.routers.traefik.rule=Host(`${DOMAIN}`)"
+ - "traefik.http.routers.traefik.entrypoints=websecure"
+ - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
+ # Dashboard Auth
+ #- "traefik.http.routers.traefik.middlewares=dashboardauth"
+ #- "traefik.http.middlewares.dashboardauth.basicauth.users=admin:${ADMIN_PASSWORD}"
+ # HTTPS redirect
+ - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
+ - "traefik.http.routers.http-catchall.entrypoints=web"
+ - "traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker"
+ - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ networks:
+ - traefik-public
+
+networks:
+ traefik-public:
+ name: traefik-public