Complete stack
This commit is contained in:
2
.env.example
Normal file
2
.env.example
Normal file
@@ -0,0 +1,2 @@
|
||||
DEV_URL=localhost
|
||||
EXTERNAL_NETWORK=traefiknet
|
||||
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.env
|
||||
portainer/*
|
||||
!portainer/.gitkeep
|
||||
traefik/logs/*
|
||||
!traefik/logs/.gitkeep
|
||||
62
README.md
Normal file
62
README.md
Normal file
@@ -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}
|
||||
```
|
||||
58
docker-compose.yml
Normal file
58
docker-compose.yml
Normal file
@@ -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
|
||||
0
portainer/.gitkeep
Normal file
0
portainer/.gitkeep
Normal file
34
run
Executable file
34
run
Executable file
@@ -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
|
||||
0
traefik/logs/.gitkeep
Normal file
0
traefik/logs/.gitkeep
Normal file
0
traefik/traefik_dynamic.yml
Normal file
0
traefik/traefik_dynamic.yml
Normal file
Reference in New Issue
Block a user