From 74e3024833e8de2ad466aacc4925755e932b140f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=A1nek?= Date: Thu, 26 Feb 2026 14:45:43 +0100 Subject: [PATCH] Complete stack --- .env.example | 2 ++ .gitignore | 5 +++ README.md | 62 +++++++++++++++++++++++++++++++++++++ docker-compose.yml | 58 ++++++++++++++++++++++++++++++++++ portainer/.gitkeep | 0 run | 34 ++++++++++++++++++++ traefik/logs/.gitkeep | 0 traefik/traefik_dynamic.yml | 0 8 files changed, 161 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 portainer/.gitkeep create mode 100755 run create mode 100644 traefik/logs/.gitkeep create mode 100644 traefik/traefik_dynamic.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c737eac --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +DEV_URL=localhost +EXTERNAL_NETWORK=traefiknet \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68852af --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.env +portainer/* +!portainer/.gitkeep +traefik/logs/* +!traefik/logs/.gitkeep \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0fffa3a --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Local Docker Management - Traefik & Portainer + +Docker stack s reverse proxy (Traefik) a webovým rozhraním pro správu kontejnerů (Portainer). + +## 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 + ``` + +2. **Spuštění** + ```bash + ./run up # Spustit stack + ./run restart # Restartovat stack + ./run down # Zastavit stack + ``` + +## Přístup ke službám + +| Služba | URL | +|--------|-----| +| Traefik Dashboard | http://traefik.dev.linuxak.com | +| Portainer | http://portainer.dev.linuxak.com | + +## Struktura + +``` +Stack/ +├── docker-compose.yml # Definice služeb +├── run # Skript pro správu +├── .env # Konfigurace prostředí +├── traefik/ # Traefik konfigurace a logy +└── portainer/ # Portainer data +``` + +## Persistence + +Složka `portainer` je persistentním úložištěm pro službu Portainer a všechna data této služby zůstanou uložená i po vypnutí stacku, dokud je ručně nesmažete. + +## Přidání nové služby + +Do vašeho `docker-compose.yml` přidejte Traefik labels: + +```yaml +labels: + - "traefik.enable=true" + - "traefik.http.routers.myapp.rule=Host(`myapp.${DEV_URL}`)" + - "traefik.http.routers.myapp.entrypoints=web" +networks: + - ${EXTERNAL_NETWORK} +``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3bda3de --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,58 @@ +services: + traefik: + 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.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}" + - "--providers.docker.exposedbydefault=false" + - "--providers.docker.watch=true" + - "--providers.file.filename=/etc/traefik/traefik_dynamic.yml" + - "--providers.file.watch=true" + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.${DEV_URL}`)" + - "traefik.http.routers.traefik-dashboard.entrypoints=web" + - "traefik.http.routers.traefik-dashboard.service=api@internal" + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./traefik/traefik_dynamic.yml:/etc/traefik/traefik_dynamic.yml:ro + - ./traefik/logs:/logs + networks: + - ${EXTERNAL_NETWORK} + + portainer: + image: portainer/portainer-ce:latest + container_name: portainer + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./portainer:/data + labels: + - "traefik.enable=true" + - "traefik.http.routers.portainer.rule=Host(`portainer.${DEV_URL}`)" + - "traefik.http.routers.portainer.entrypoints=web" + - "traefik.http.routers.portainer.service=portainer" + - "traefik.http.services.portainer.loadbalancer.server.port=9000" + networks: + - ${EXTERNAL_NETWORK} + +networks: + traefiknet: + name: ${EXTERNAL_NETWORK} + external: true \ No newline at end of file diff --git a/portainer/.gitkeep b/portainer/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/run b/run new file mode 100755 index 0000000..4292d55 --- /dev/null +++ b/run @@ -0,0 +1,34 @@ +#!/bin/zsh + +# Load parameters +ACTION=$1 +ENV_FILE=".env" + +# Check if .env file exists +if [[ ! -f $ENV_FILE ]]; then + echo "Error: $ENV_FILE file not found!" + echo "Please create $ENV_FILE file with the following variables:" + echo "DEV_URL=your.domain.com" + echo "EXTERNAL_NETWORK=your_network_name" + exit 1 +fi + +# Load environment variables +source $ENV_FILE + +case "$ACTION" in + "up") + docker network create $EXTERNAL_NETWORK > /dev/null 2>&1 || true + docker compose up -d + ;; + "restart") + docker compose restart + ;; + "down") + docker compose down + ;; + *) + echo "Usage: $0 [up|restart|down]" + exit 1 + ;; +esac diff --git a/traefik/logs/.gitkeep b/traefik/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/traefik/traefik_dynamic.yml b/traefik/traefik_dynamic.yml new file mode 100644 index 0000000..e69de29