Add in cloudflare ddns and restructure repo

This commit is contained in:
James Thompson
2026-05-19 08:30:25 +00:00
parent c546fab5e1
commit 6fb3fc65e4
35 changed files with 132 additions and 131 deletions

6
services/traefik/.env.example Executable file
View File

@@ -0,0 +1,6 @@
# traefik/.env
# Copy to .env and fill in real values. NEVER commit .env.
TRAEFIK_DASHBOARD_PORT=8080
ACME_EMAIL=letsencrypt@example.com
DASHBOARD_BASIC_AUTH=admin:$$apr1$$changeme$$REPLACE_WITH_HTPASSWD_HASH

View File

@@ -0,0 +1 @@
This is the core proxy that protects my server. It handles SSL termination, routing, and the dashboard for monitoring. I use Traefik's Docker provider to automatically discover services and route traffic based on labels in their `docker-compose.yml` files.

View File

@@ -0,0 +1,52 @@
services:
traefik:
image: traefik:v3.6
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "${TRAEFIK_DASHBOARD_PORT}:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${STORAGE_PATH}/traefik/certs:/certs:rw
- ./dynamic:/dynamic:ro
- ${STORAGE_PATH}/traefik/letsencrypt:/letsencrypt
networks:
- web
security_opt:
- no-new-privileges:true
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=${DASHBOARD_BASIC_AUTH}"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.middlewares=dashboard-auth@docker"
- "traefik.http.routers.dashboard.rule=Host(`dashboard.${DOMAIN}`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.tls=true"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
command:
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.network=web"
- "--api.dashboard=true"
- "--api.insecure=false"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/certs/acme.json"
- "--metrics.prometheus=true"
- "--accesslog=true"
- "--providers.file.directory=/dynamic"
- "--providers.file.watch=true"
environment:
- DOMAIN=${DOMAIN}
networks:
web:
external: true

View File

@@ -0,0 +1,38 @@
http:
routers:
nextcloud:
rule: 'Host(`nextcloud.{{ env "DOMAIN" }}`)'
entryPoints:
- websecure
service: nextcloud
middlewares:
- nextcloud-chain
tls:
certResolver: letsencrypt
services:
nextcloud:
loadBalancer:
servers:
- url: "http://nextcloud-aio-apache:11000"
middlewares:
nextcloud-secure-headers:
headers:
hostsProxyHeaders:
- X-Forwarded-Host
customRequestHeaders:
X-Forwarded-Proto: https
referrerPolicy: same-origin
nextcloud-dav:
redirectRegex:
regex: "^https://([^/]+)/.well-known/(card|cal)dav"
replacement: "https://${1}/remote.php/dav/"
permanent: true
nextcloud-chain:
chain:
middlewares:
- nextcloud-dav
- nextcloud-secure-headers

View File

@@ -0,0 +1,4 @@
tls:
certificates:
- certFile: /certs/local.crt
keyFile: /certs/local.key