add docker-compose and traefik configurations for Authentik and NAS integration

This commit is contained in:
CalvinSteenbergen 2025-11-28 23:03:52 +01:00
parent 4d07c78971
commit 127773c908
5 changed files with 160 additions and 66 deletions

View file

@ -0,0 +1,90 @@
services:
postgresql:
image: docker.io/library/postgres:16-alpine
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
- database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
env_file:
- .env
networks:
- internal
redis:
image: docker.io/library/redis:alpine
command: --save 60 1 --loglevel warning
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
volumes:
- redis:/data
networks:
- internal
server:
image: ghcr.io/goauthentik/server:2024.10.1
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
volumes:
- ./media:/media
- ./custom-templates:/templates
env_file:
- .env
networks:
- internal
- proxy # Moet in proxy netwerk om door Traefik gezien te worden
labels:
- "traefik.enable=true"
# De URL waarop Authentik bereikbaar wordt:
- "traefik.http.routers.authentik.rule=Host(`authentik.stackbabber.nl`)"
- "traefik.http.routers.authentik.entrypoints=web"
- "traefik.http.services.authentik.loadbalancer.server.port=9000"
worker:
image: ghcr.io/goauthentik/server:2024.10.1
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
depends_on:
- postgresql
- redis
env_file:
- .env
networks:
- internal
volumes:
database:
driver: local
redis:
driver: local
networks:
proxy:
external: true
internal:
driver: bridge

View file

@ -0,0 +1,15 @@
http:
routers:
# Router voor je NAS interface
nas-router:
rule: "Host(`nas.stackbabber.nl`)"
service: "nas-service"
entryPoints:
- "web"
services:
# Service definitie (IP en Poort van de NAS)
nas-service:
loadBalancer:
servers:
- url: "http://10.52.150.20:5000" # Pas poort aan indien nodig

View file

@ -5,30 +5,21 @@ api:
entryPoints: entryPoints:
web: web:
address: ":80" address: ":80"
# BELANGRIJK: Omdat NPM de SSL doet, zetten we de automatische redirect hier UIT. # Trusted IPs config (zodat Authentik straks de juiste IP's ziet via de NAS)
# Anders krijg je een "Too many redirects" loop.
# http:
# redirections:
# entryPoint:
# to: websecure
# scheme: https
# Hier vertellen we Traefik: "Vertrouw headers van de NAS"
forwardedHeaders:
trustedIPs:
- "127.0.0.1/32" # Localhost
- "10.0.0.0/8" # Intern netwerk (ruim)
- "192.168.0.0/16" # Intern netwerk (ruim)
- "172.16.0.0/12" # Docker intern
- "10.52.150.20/32" # <--- JOUW NAS IP (Cruciaal!)
websecure:
address: ":443"
# Ook voor HTTPS poort (voor het geval NPM via 443 doorstuurt)
forwardedHeaders: forwardedHeaders:
trustedIPs: trustedIPs:
- "127.0.0.1/32" - "127.0.0.1/32"
- "10.52.150.20/32" # <--- JOUW NAS IP - "10.0.0.0/8"
- "192.168.0.0/16"
- "172.16.0.0/12"
- "10.52.150.20/32" # Jouw NAS IP
websecure:
address: ":443"
forwardedHeaders:
trustedIPs:
- "127.0.0.1/32"
- "10.52.150.20/32" # Jouw NAS IP
providers: providers:
docker: docker:
@ -36,8 +27,12 @@ providers:
exposedByDefault: false exposedByDefault: false
network: proxy network: proxy
# We laten de certificaat-resolvers wel in de config staan voor de toekomst, # --- NIEUW: FILE PROVIDER ---
# maar Traefik gebruikt ze nu nog niet omdat NPM de certificaten regelt. # Hiermee kun je externe hosts (zoals je NAS zelf) koppelen
file:
directory: "/rules"
watch: true
certificatesResolvers: certificatesResolvers:
letsencrypt: letsencrypt:
acme: acme:

View file

@ -12,20 +12,19 @@ services:
- "443:443" - "443:443"
- "8080:8080" - "8080:8080"
environment: environment:
# Deze leest hij uit je .env bestand op de server
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN} - CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
volumes: volumes:
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro - ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json - ./data/acme.json:/acme.json
# Hier koppelen we de map met regels voor externe hosts (NAS etc.)
- ./data/rules:/rules
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
# We gebruiken nu je echte domein!
- "traefik.http.routers.traefik.rule=Host(`traefik.stackbabber.nl`)" - "traefik.http.routers.traefik.rule=Host(`traefik.stackbabber.nl`)"
- "traefik.http.routers.traefik.entrypoints=websecure" - "traefik.http.routers.traefik.entrypoints=web"
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt" - "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
networks: networks:
proxy: proxy:

View file

@ -1,71 +1,66 @@
#!/bin/bash #!/bin/bash
# Stop het script direct als er een error optreedt # Stop direct bij errors
set -e set -e
# --- KLEUREN DEFINITIES (Voor mooie output) --- # --- KLEUREN ---
GREEN='\033[0;32m' GREEN='\033[0;32m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
RED='\033[0;31m' RED='\033[0;31m'
NC='\033[0m' # No Color NC='\033[0m'
# --- PADEN AUTOMATISCH BEPALEN --- # --- PADEN ---
# Dit is de magie: We kijken waar DIT script staat, en gaan 1 map omhoog.
# Hierdoor werkt het script altijd, ongeacht hoe je hoofdmap heet.
SCRIPT_PATH=$(readlink -f "$0") SCRIPT_PATH=$(readlink -f "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH") SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
REPO_DIR=$(dirname "$SCRIPT_DIR") REPO_DIR=$(dirname "$SCRIPT_DIR")
STACKS_DIR="$REPO_DIR/1. docker-stacks" STACKS_DIR="$REPO_DIR/1. docker-stacks" # Let op: kleine letters zoals op jouw server
echo -e "${BLUE}==========================================${NC}" echo -e "${BLUE}==========================================${NC}"
echo -e "${BLUE}🚀 Start Docker Update Script - $(date)${NC}" echo -e "${BLUE}🚀 Start Docker Update - $(date)${NC}"
echo -e "${BLUE}==========================================${NC}"
# 1. GIT UPDATE # 1. GIT
echo -e "${YELLOW}📥 Pullen van Git...${NC}" echo -e "${YELLOW}📥 Git Pull...${NC}"
echo -e " Locatie: $REPO_DIR"
cd "$REPO_DIR" cd "$REPO_DIR"
git pull origin main git fetch --all
git reset --hard origin/main
# 2. CONTAINERS UPDATEN # 2. TRAEFIK VOORBEREIDING (Cruciaal!)
echo -e "${YELLOW}🔄 Containers bijwerken...${NC}" # Traefik heeft specifieke mappen en lege bestanden nodig
TRAEFIK_DIR="$STACKS_DIR/traefik"
if [ -d "$TRAEFIK_DIR" ]; then
echo -e " 🔨 ${YELLOW}Traefik checks uitvoeren...${NC}"
mkdir -p "$TRAEFIK_DIR/data"
# Certificaten bestand (moet chmod 600 zijn)
if [ ! -f "$TRAEFIK_DIR/data/acme.json" ]; then
touch "$TRAEFIK_DIR/data/acme.json"
chmod 600 "$TRAEFIK_DIR/data/acme.json"
fi
# Externe regels bestand (voor je NAS/andere hosts)
if [ ! -f "$TRAEFIK_DIR/data/rules/external.yml" ]; then
mkdir -p "$TRAEFIK_DIR/data/rules"
touch "$TRAEFIK_DIR/data/rules/external.yml"
fi
fi
# Zoek alle mappen die een docker-compose.yml bevatten (max 2 diep in 1. Docker-Stacks) # 3. CONTAINERS STARTEN
echo -e "${YELLOW}🔄 Services starten...${NC}"
find "$STACKS_DIR" -maxdepth 2 -name "docker-compose.yml" | while read composefile; do find "$STACKS_DIR" -maxdepth 2 -name "docker-compose.yml" | while read composefile; do
dir=$(dirname "$composefile") dir=$(dirname "$composefile")
service_name=$(basename "$dir") service_name=$(basename "$dir")
echo -e " 👉 Bezig met service: ${GREEN}$service_name${NC}" echo -e " 👉 Service: ${GREEN}$service_name${NC}"
cd "$dir" cd "$dir"
# --- SPECIAAL VOOR TRAEFIK ---
# Traefik crasht als acme.json niet bestaat of verkeerde rechten heeft.
# Dit script repareert dat automatisch.
if [ "$service_name" == "traefik" ]; then
if [ ! -f "./data/acme.json" ]; then
echo -e " 🔨 ${YELLOW}Traefik: acme.json aanmaken en rechten (600) zetten...${NC}"
mkdir -p ./data
touch ./data/acme.json
chmod 600 ./data/acme.json
fi
fi
# -----------------------------
# Check of er een .env bestand is (informatief)
if [ -f .env ]; then if [ -f .env ]; then
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
else else
echo -e " ⚠️ ${RED}Let op: Geen .env bestand gevonden (check je secrets)!${NC}" echo -e " ⚠️ ${RED}Geen .env gevonden! (Check je secrets op de server)${NC}"
# We proberen alsnog te starten, sommige containers hebben geen .env nodig
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
fi fi
done done
# 3. OPRUIMEN echo -e "${YELLOW}🧹 Opruimen...${NC}"
echo -e "${YELLOW}🧹 Oude images opruimen...${NC}"
docker image prune -f docker image prune -f
echo -e "${BLUE}==========================================${NC}" echo -e "${GREEN}✅ Klaar!${NC}"
echo -e "${GREEN}✅ Update compleet!${NC}"
echo -e "${BLUE}==========================================${NC}"