first commit
This commit is contained in:
+25
@@ -0,0 +1,25 @@
|
||||
certs
|
||||
|
||||
# Ignore log files
|
||||
logs/*.log
|
||||
*.log
|
||||
# Ignore acme.json (contains sensitive certificate data)
|
||||
acme.json
|
||||
|
||||
# Ignore Docker-related files
|
||||
docker-compose.override.yml
|
||||
|
||||
# Ignore temporary files
|
||||
*.tmp
|
||||
*.swp
|
||||
*.bak
|
||||
|
||||
# Ignore node_modules if using Node.js in this folder
|
||||
node_modules/
|
||||
|
||||
# Ignore environment files
|
||||
.env
|
||||
.env.*
|
||||
|
||||
# Ignore backup files
|
||||
*.~*
|
||||
@@ -0,0 +1,79 @@
|
||||
# GB Traefik Setup
|
||||
|
||||
This repository contains the configuration files and setup instructions for deploying [Traefik](https://traefik.io/), a modern reverse proxy and load balancer.
|
||||
|
||||
Configuration files is customized for Gbanyan personal usage.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker installed on your system
|
||||
- Docker Compose (if using `docker-compose.yml`)
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Clone this repository:
|
||||
```bash
|
||||
git clone https://gitea.gbanyan.net/gbanyan/GB-Traefik.git
|
||||
cd GB-Traefik
|
||||
```
|
||||
|
||||
2. Update the `traefik.yml` and `docker-compose.yml` files as needed for your environment.
|
||||
|
||||
3. Start Traefik:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
4. Access the Traefik dashboard (if enabled) at `http://<your-domain-or-ip>:8080`.
|
||||
|
||||
## Configuration
|
||||
|
||||
- **.env**: Cloudflare E-mail and API Token for SSL DNS Challenge
|
||||
- **Traefik Configuration**: Modify `traefik.yml`, `dynamic.yml` to customize Traefik's behavior.
|
||||
- **Docker Compose**: Use `docker-compose.yml` to define services and networks.
|
||||
|
||||
|
||||
## Detail:
|
||||
|
||||
My traefik is split into internal and external entrypoint.
|
||||
|
||||
Internal entrypoint is for private and secure service without exposing.
|
||||
|
||||
Each entrypoint is bind to different ip address for isolation.
|
||||
|
||||
Then, other docker service is attached to different entrypoin guided by label in docker compose
|
||||
|
||||
```yaml
|
||||
label:
|
||||
- "traefik.http.routers.service-name.entrypoints=websecure"
|
||||
```
|
||||
|
||||
Besides the entrypoint setup, I add cloudflare proxy, crowdsec-bouncer, compression with brotli middlrewares method in traefik.yml and dynamic.yml
|
||||
|
||||
Adding middlewares is also guided by labels:
|
||||
|
||||
```yaml
|
||||
label:
|
||||
- "traefik.http.routers.service-name.middlewares=cloudflarewarp@file,crowdsec@file,compress-middleware@file"
|
||||
```
|
||||
|
||||
The order of middlewares is meaningful.
|
||||
|
||||
Traefik has ability to auto apply SSL certs.
|
||||
Just offer the required DNS API authentication (Like cloudflare).
|
||||
|
||||
Please refer the traefik documentation.
|
||||
|
||||
The following is an example of a docker service I hosted in its docker-compose.yaml:
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.ghost.entrypoints=websecure"
|
||||
- "traefik.http.routers.ghost.rule=Host(`blog.gbanyan.net`)"
|
||||
- "traefik.http.services.ghost.loadbalancer.server.port=2368"
|
||||
- "traefik.http.routers.ghost.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.routers.ghost.middlewares=cloudflarewarp@file,crowdsec@file,compress-middleware@file"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.docker.network=traefik_default"
|
||||
```
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,41 @@
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
network_mode: host
|
||||
# ports:
|
||||
# - 10.0.0.225:80:80
|
||||
# - 10.0.0.225:443:443
|
||||
# - 192.168.50.4:8080:8080
|
||||
# - 192.168.50.4:80:80
|
||||
# - 192.168.50.4:443:443 # Added port mapping for the dashboard
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
|
||||
- CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN}
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./certs:/letsencrypt
|
||||
#- ./dashboard_authfile:/dashboard_authfile:ro
|
||||
- ./dynamic.yml:/dynamic.yml
|
||||
- ./traefik.yml:/traefik.yml
|
||||
- ./traefik.log:/var/log/traefik/traefik.log
|
||||
- ./access.log:/var/log/traefik/access.log
|
||||
# networks:
|
||||
# - traefik_default
|
||||
# - internal_traefik_default
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.traefik.rule=Host(`traefik.gbanyan.net`)"
|
||||
- "traefik.http.routers.traefik.entrypoints=internal_websecure"
|
||||
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.routers.traefik.service=api@internal"
|
||||
- "com.centurylinklabs.watchtower.enable=true" # Added label for Watchtower
|
||||
# "traefik.http.middlewares.auth.basicauth.usersfile=/dashboard_authfile"
|
||||
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
|
||||
|
||||
# networks:
|
||||
# traefik_default:
|
||||
# external: true
|
||||
# internal_traefik_default:
|
||||
# external: true
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
http:
|
||||
middlewares:
|
||||
block-ip-access:
|
||||
headers:
|
||||
customRequestHeaders:
|
||||
Host: "" # This will catch requests with no Host header or invalid ones
|
||||
cloudflarewarp:
|
||||
plugin:
|
||||
cloudflare:
|
||||
trustedCIDRs: []
|
||||
overwriteRequestHeader: true
|
||||
debug: true
|
||||
crowdsec:
|
||||
plugin:
|
||||
bouncer:
|
||||
enabled: true
|
||||
crowdsecMode: stream
|
||||
crowdsecLapiHost: "localhost:8080"
|
||||
crowdsecLapiKey: gFJjSzdbB0GCe/1Y9HcxMPP1vQmoa4psZOFyleJZJVQ
|
||||
compress-middleware:
|
||||
compress:
|
||||
encodings:
|
||||
- br
|
||||
- gzip
|
||||
defaultEncoding: br
|
||||
routers:
|
||||
block-direct-access:
|
||||
rule: "HostRegexp(`{host:.+}`)" # Matches any host
|
||||
service: noop@internal
|
||||
priority: 1 # Low priority to catch unmatched requests
|
||||
entryPoints:
|
||||
- web
|
||||
- websecure
|
||||
middlewares:
|
||||
- block-ip-access
|
||||
netdata:
|
||||
rule: Host(`netdata.gbanyan.net`)
|
||||
service: netdata
|
||||
entryPoints: ["internal_websecure"]
|
||||
tls:
|
||||
certResolver: letsencrypt
|
||||
|
||||
services:
|
||||
netdata:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://127.0.0.1:19999"
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
## STATIC CONFIGURATION
|
||||
|
||||
log:
|
||||
level: "DEBUG"
|
||||
filePath: "/var/log/traefik/traefik.log"
|
||||
accessLog:
|
||||
filePath: "/var/log/traefik/access.log"
|
||||
filters:
|
||||
statusCodes:
|
||||
- "200-299" # log successful http requests
|
||||
- "400-599" # log failed http requests
|
||||
|
||||
api:
|
||||
insecure: false
|
||||
dashboard: true
|
||||
|
||||
entryPoints:
|
||||
web:
|
||||
address: "10.0.0.225:80"
|
||||
forwardedHeaders:
|
||||
trustedIPs: &trustedIps
|
||||
# Start of Cloudlare's public IP list
|
||||
- 103.21.244.0/22
|
||||
- 103.22.200.0/22
|
||||
- 103.31.4.0/22
|
||||
- 104.16.0.0/13
|
||||
- 104.24.0.0/14
|
||||
- 108.162.192.0/18
|
||||
- 131.0.72.0/22
|
||||
- 141.101.64.0/18
|
||||
- 162.158.0.0/15
|
||||
- 172.64.0.0/13
|
||||
- 173.245.48.0/20
|
||||
- 188.114.96.0/20
|
||||
- 190.93.240.0/20
|
||||
- 197.234.240.0/22
|
||||
- 198.41.128.0/17
|
||||
- 2400:cb00::/32
|
||||
- 2606:4700::/32
|
||||
- 2803:f800::/32
|
||||
- 2405:b500::/32
|
||||
- 2405:8100::/32
|
||||
- 2a06:98c0::/29
|
||||
- 2c0f:f248::/32
|
||||
# End of Cloudlare's public IP list
|
||||
http:
|
||||
redirections: # HTTPS redirection (80 to 443)
|
||||
entryPoint:
|
||||
to: "websecure" # The target element
|
||||
scheme: "https"
|
||||
websecure:
|
||||
address: "10.0.0.225:443"
|
||||
forwardedHeaders:
|
||||
# Reuse the list of Cloudflare's public IPs from above
|
||||
trustedIPs: *trustedIps
|
||||
http3: {}
|
||||
internal_web:
|
||||
address: "192.168.50.4:80"
|
||||
http:
|
||||
redirections: # HTTPS redirection (80 to 443)
|
||||
entryPoint:
|
||||
to: "internal_websecure" # The target element
|
||||
scheme: "https"
|
||||
internal_websecure:
|
||||
address: "192.168.50.4:443"
|
||||
http3: {}
|
||||
metrics:
|
||||
address: "127.0.0.1:8082"
|
||||
|
||||
global:
|
||||
checknewversion: false # Periodically check if a new version has been released.
|
||||
sendanonymoususage: false # Periodically send anonymous usage statistics.
|
||||
|
||||
providers:
|
||||
docker:
|
||||
exposedByDefault: false
|
||||
# network: traefik_default # Ensure this matches the Docker network
|
||||
file:
|
||||
filename: "/dynamic.yml" # Enable dynamic configuration file
|
||||
certificatesResolvers:
|
||||
letsencrypt:
|
||||
acme:
|
||||
email: gbanyan.huang@gmail.com
|
||||
storage: /letsencrypt/acme.json
|
||||
dnsChallenge:
|
||||
provider: cloudflare
|
||||
resolvers:
|
||||
- "1.1.1.1:53"
|
||||
- "8.8.8.8:53"
|
||||
# caServer: "https://acme-staging.api.letsencrypt.org/directory"
|
||||
|
||||
metrics:
|
||||
prometheus:
|
||||
entryPoint: metrics
|
||||
|
||||
experimental:
|
||||
plugins:
|
||||
cloudflare:
|
||||
moduleName: github.com/agence-gaya/traefik-plugin-cloudflare
|
||||
version: v1.2.0
|
||||
bouncer:
|
||||
moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
|
||||
version: v1.4.2
|
||||
Reference in New Issue
Block a user