diff --git a/.env.example b/.env.example index db0ad29..f199d07 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,3 @@ DEV_URL=dev.linuxak.com -EXTERNAL_NETWORK=traefiknet \ No newline at end of file +EXTERNAL_NETWORK=traefiknet +FORCE_HTTPS_REDIRECT=true \ No newline at end of file diff --git a/README.md b/README.md index b2cc2fc..bd2e4fd 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,44 @@ -# Local Docker Management - Traefik & Portainer +# Local Docker Management -Docker stack s reverse proxy (Traefik) a webovým rozhraním pro správu kontejnerů (Portainer). +## Traefik + +- Reverzní proxy +- Validní https pro lokální vývoj (wildcard certifikát s vlastním CA) +- Přizpůsobitelné nastavení nuceného přesměrování HTTP na HTTPS +- Připojení dalších (vlastních) služeb pomocí Traefik labels +- Dashboard pro monitorování a správu routování + +## Portainer + +- Webové rozhraní pro správu kontejnerů ## Požadavky - Docker & Docker Compose -- Nastavené DNS záznamy nebo `/etc/hosts` ## Instalace ### 1. Konfigurace prostředí ```bash -# Přejmenujte soubor .env.example na .env -mv .env.example .env - -# Upravte .env soubor dle svých nastavení -DEV_URL=dev.linuxak.com -EXTERNAL_NETWORK=traefiknet +# Zkopírujte soubor .env.example na .env +cp .env.example .env ``` -> **Poznámka:** +V případě nutnosti upravte hodnoty dle svých nastavení + +`DEV_URL` - doména používaná pro lokální vývoj +`EXTERNAL_NETWORK` - název externí sítě, kterou používáte pro své kontejnery +`FORCE_HTTPS_REDIRECT` - nastavení vynuceného přesměrování HTTP na HTTPS (true/false) + +> **Poznámka:** > -> Doménu `dev.linuxak.com` můžete ponechat, směřuje na `127.0.0.1` tedy na váš lokální počítač. Pokud chcete použít -> jinou doménu, nezapomeňte ji přidat do vašeho `/etc/hosts` souboru a vygenerovat novou sadu certifikátů pro tuto doménu. +> Přednastavenou doménu `dev.linuxak.com` můžete ponechat. Je plně funkční a směřuje +> na IP adresu `127.0.0.1` tedy na váš lokální počítač. ### 2. Import CA do systému -Traefik používá vlastní certifikát pro HTTPS komunikaci. Pro správné fungování je potřeba importovat `rootCA.pem` do důvěryhodných certifikátů vašeho operačního systému. +Traefik používá pro doménu `dev.linuxak.com` vlastní certifikát pro HTTPS komunikaci. Pro správné +fungování je potřeba importovat `rootCA.pem` do důvěryhodných certifikátů vašeho operačního systému. #### MacOS ```bash @@ -83,9 +95,11 @@ Složka `portainer` je persistentním úložištěm pro službu Portainer a vše Do vašeho `docker-compose.yml` přidejte Traefik labels: -> Hodnotu `` nahraďte skutečnou doménou své služby. -> Hodnotu `` nahraďte skutečným portem své služby. -> Hodnotu `` nahraďte skutečným náyvem své externí sítě. +`` - nahraďte skutečnou doménou své služby +`` - nahraďte skutečným portem své služby +`` - nahraďte skutečným názvem své externí sítě + +Příklad pro službu s náyvem `myapp`: ```yaml labels: diff --git a/docker-compose.https-redirect.yml b/docker-compose.https-redirect.yml new file mode 100644 index 0000000..551f478 --- /dev/null +++ b/docker-compose.https-redirect.yml @@ -0,0 +1,6 @@ +services: + traefik: + environment: + TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO: websecure + TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_SCHEME: https + TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_PERMANENT: true diff --git a/docker-compose.yml b/docker-compose.yml index 3ed83ce..036f40d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,27 +8,24 @@ services: image: traefik:latest container_name: traefik restart: always - command: - - "--global.checknewversion=false" - - "--log.level=INFO" - - "--log.filepath=/logs/traefik.log" - - "--accesslog=true" - - "--accesslog.filepath=/logs/access.log" - - "--entrypoints.web.address=:80" - - "--entrypoints.web.forwardedheaders.trustedips=0.0.0.0/0" - - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - - "--entrypoints.web.http.redirections.entrypoint.scheme=https" - - "--entrypoints.web.http.redirections.entrypoint.permanent=true" - - "--entrypoints.websecure.address=:443" - - "--entrypoints.websecure.forwardedheaders.trustedips=0.0.0.0/0" - - "--api.dashboard=true" - - "--providers.docker=true" - - "--providers.docker.endpoint=unix:///var/run/docker.sock" - - "--providers.docker.network=${EXTERNAL_NETWORK:-traefiknet}" - - "--providers.docker.exposedbydefault=false" - - "--providers.docker.watch=true" - - "--providers.file.filename=/etc/traefik/traefik_dynamic.yml" - - "--providers.file.watch=true" + environment: + TRAEFIK_GLOBAL_CHECKNEWVERSION: false + TRAEFIK_LOG_LEVEL: INFO + TRAEFIK_LOG_FILEPATH: /logs/traefik.log + TRAEFIK_ACCESSLOG: true + TRAEFIK_ACCESSLOG_FILEPATH: /logs/access.log + TRAEFIK_ENTRYPOINTS_WEB_ADDRESS: ":80" + TRAEFIK_ENTRYPOINTS_WEB_FORWARDEDHEADERS_TRUSTEDIPS: "0.0.0.0/0" + TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS: ":443" + TRAEFIK_ENTRYPOINTS_WEBSECURE_FORWARDEDHEADERS_TRUSTEDIPS: "0.0.0.0/0" + TRAEFIK_API_DASHBOARD: true + TRAEFIK_PROVIDERS_DOCKER: true + TRAEFIK_PROVIDERS_DOCKER_ENDPOINT: "unix:///var/run/docker.sock" + TRAEFIK_PROVIDERS_DOCKER_NETWORK: "${EXTERNAL_NETWORK:-traefiknet}" + TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT: false + TRAEFIK_PROVIDERS_DOCKER_WATCH: true + TRAEFIK_PROVIDERS_FILE_FILENAME: "/etc/traefik/traefik_dynamic.yml" + TRAEFIK_PROVIDERS_FILE_WATCH: true labels: - "traefik.enable=true" - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.${DEV_URL}`)" @@ -39,10 +36,10 @@ services: - "80:80" - "443:443" volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik/certs:/certs:ro - - ./traefik/traefik_dynamic.yml:/etc/traefik/traefik_dynamic.yml:ro - ./traefik/logs:/logs + - ./traefik/traefik_dynamic.yml:/etc/traefik/traefik_dynamic.yml:ro + - /var/run/docker.sock:/var/run/docker.sock:ro networks: - external-net diff --git a/run b/run index e9f7b7a..2e97f42 100755 --- a/run +++ b/run @@ -10,6 +10,7 @@ if [[ ! -f $ENV_FILE ]]; then echo "Please create $ENV_FILE file with the following variables:" echo "DEV_URL=your.domain.com" echo "EXTERNAL_NETWORK=your_network_name" + echo "FORCE_HTTPS_REDIRECT=true # Set to 'false' to disable HTTPS redirect" exit 1 fi @@ -19,8 +20,17 @@ source $ENV_FILE case "$ACTION" in "up") docker network create $EXTERNAL_NETWORK > /dev/null 2>&1 || true - docker compose up -d - echo "\nServices are starting up..." + + # Check HTTPS redirect setting + if [[ "${FORCE_HTTPS_REDIRECT}" == "true" ]]; then + MSG="Starting with HTTPS redirect enabled..." + docker compose -f docker-compose.yml -f docker-compose.https-redirect.yml up -d + else + MSG="Starting without HTTPS redirect..." + docker compose up -d + fi + + echo "\n${MSG}" sleep 2 echo "\nAvailable services:" echo "Traefik: https://traefik.${DEV_URL}"