mirror of
https://github.com/TecharoHQ/anubis.git
synced 2026-04-05 16:28:17 +00:00
215 lines
6.9 KiB
Plaintext
215 lines
6.9 KiB
Plaintext
---
|
|
id: traefik
|
|
title: Traefik
|
|
---
|
|
|
|
:::note
|
|
|
|
This only talks about integration through Compose,
|
|
but it also applies to docker cli options.
|
|
|
|
:::
|
|
|
|
Currently, Anubis doesn't have any Traefik middleware,
|
|
so you need to manually route it between Traefik and your target service.
|
|
This routing is done per labels in Traefik.
|
|
|
|
In this example, we will use 4 Containers:
|
|
|
|
- `traefik` - the Traefik instance
|
|
- `anubis` - the Anubis instance
|
|
- `target` - our service to protect (`traefik/whoami` in this case)
|
|
- `target2` - a second service that isn't supposed to be protected (`traefik/whoami` in this case)
|
|
|
|
There are 3 steps we need to follow:
|
|
|
|
1. Create a new exclusive Traefik endpoint for Anubis
|
|
2. Pass all unspecified requests to Anubis
|
|
3. Let Anubis pass all verified requests back to Traefik on its exclusive endpoint
|
|
|
|
## Diagram of Flow
|
|
|
|
This is a small diagram depicting the flow.
|
|
Keep in mind that `8080` or `80` can be anything depending on your containers.
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
user[User]
|
|
traefik[Traefik]
|
|
anubis[Anubis]
|
|
target[Target]
|
|
|
|
user-->|:443 - Requesting Service|traefik
|
|
traefik-->|:8080 - Passing to Anubis|anubis
|
|
anubis-->|:3923 - Passing back to Traefik|traefik
|
|
traefik-->|:80 - Passing to the target|target
|
|
```
|
|
|
|
## Create an Exclusive Anubis Endpoint in Traefik
|
|
|
|
There are 2 ways of registering a new endpoint in Traefik.
|
|
Which one to use depends on how you configured your Traefik so far.
|
|
|
|
**CLI Options:**
|
|
|
|
```yml
|
|
--entrypoints.anubis.address=:3923
|
|
```
|
|
|
|
**traefik.yml:**
|
|
|
|
```yml
|
|
entryPoints:
|
|
anubis:
|
|
address: ":3923"
|
|
```
|
|
|
|
It is important that the specified port isn't actually reachable from the outside,
|
|
but only exposed in the Docker network.
|
|
Exposing the Anubis port on Traefik directly will allow direct unprotected access to all containers behind it.
|
|
|
|
## Passing all unspecified Web Requests to Anubis
|
|
|
|
There are cases where you want Traefik to still route some requests without protection, just like before.
|
|
To achieve this, we can register Anubis as the default handler for non-protected requests.
|
|
|
|
We also don't want users to get SSL Errors during the checking phase,
|
|
thus we also need to let Traefik provide SSL Certs for our endpoint.
|
|
This example expects an TLS cert resolver called `le`.
|
|
|
|
We also expect there to be an endpoint called `websecure` for HTTPS in this example.
|
|
|
|
This is an example of the required labels to configure Traefik on the Anubis container:
|
|
|
|
```yml
|
|
labels:
|
|
- traefik.enable=true # Enabling Traefik
|
|
- traefik.docker.network=traefik # Telling Traefik which network to use
|
|
- traefik.http.routers.anubis.priority=1 # Setting Anubis to the lowest priority, so it only takes the slack
|
|
- traefik.http.routers.anubis.rule=PathRegexp(`.*`) # Wildcard match every path
|
|
- traefik.http.routers.anubis.entrypoints=websecure # Listen on HTTPS
|
|
- traefik.http.services.anubis.loadbalancer.server.port=8080 # Telling Traefik to which port it should route requests
|
|
- traefik.http.routers.anubis.service=anubis # Telling Traefik to use the above specified port
|
|
- traefik.http.routers.anubis.tls.certresolver=le # Telling Traefik to resolve a Cert for Anubis
|
|
```
|
|
|
|
## Passing all Verified Requests Back Correctly to Traefik
|
|
|
|
To pass verified requests back to Traefik,
|
|
we only need to configure Anubis using its environment variables:
|
|
|
|
```yml
|
|
environment:
|
|
- BIND=:8080
|
|
- TARGET=http://traefik:3923
|
|
```
|
|
|
|
## Full Example Config
|
|
|
|
Now that we know how to pass all requests back and forth, here is the example.
|
|
This example contains 2 services: one that is protected and the other one that is not.
|
|
|
|
**compose.yml**
|
|
|
|
```yml
|
|
services:
|
|
traefik:
|
|
image: traefik:v3.3
|
|
ports:
|
|
- 80:80
|
|
- 443:443
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
- ./letsencrypt:/letsencrypt
|
|
- ./traefik.yml:/traefik.yml:ro
|
|
networks:
|
|
- traefik
|
|
labels:
|
|
# Enable Traefik
|
|
- traefik.enable=true
|
|
- traefik.docker.network=traefik
|
|
# Redirect any HTTP to HTTPS
|
|
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
|
|
- traefik.http.routers.web.rule=PathPrefix(`/`)
|
|
- traefik.http.routers.web.entrypoints=web
|
|
- traefik.http.routers.web.middlewares=redirect-to-https
|
|
- traefik.http.routers.web.tls=false
|
|
|
|
anubis:
|
|
image: ghcr.io/techarohq/anubis:main
|
|
environment:
|
|
# Telling Anubis, where to listen for Traefik
|
|
- BIND=:8080
|
|
# Telling Anubis to point to Traefik via the Docker network
|
|
- TARGET=http://traefik:3923
|
|
networks:
|
|
- traefik
|
|
labels:
|
|
- traefik.enable=true # Enabling Traefik
|
|
- traefik.docker.network=traefik # Telling Traefik which network to use
|
|
- traefik.http.routers.anubis.priority=1 # Setting Anubis to the lowest priority, so it only takes the slack
|
|
- traefik.http.routers.anubis.rule=PathRegexp(`.*`) # wildcard match anything
|
|
- traefik.http.routers.anubis.entrypoints=websecure # Listen on HTTPS
|
|
- traefik.http.services.anubis.loadbalancer.server.port=8080 # Telling Traefik to which port it should route requests
|
|
- traefik.http.routers.anubis.service=anubis # Telling Traefik to use the above specified port
|
|
- traefik.http.routers.anubis.tls.certresolver=le # Telling Traefik to resolve a Cert for Anubis
|
|
|
|
# Protected by Anubis
|
|
target:
|
|
image: traefik/whoami:latest
|
|
networks:
|
|
- traefik
|
|
labels:
|
|
- traefik.enable=true # Enabling Traefik
|
|
- traefik.docker.network=traefik # Telling Traefik which network to use
|
|
- traefik.http.routers.target.rule=Host(`example.com`) # Only Matching Requests for example.com
|
|
- traefik.http.routers.target.entrypoints=anubis # Listening on the exclusive Anubis Network
|
|
- traefik.http.services.target.loadbalancer.server.port=80 # Telling Traefik where to receive requests
|
|
- traefik.http.routers.target.service=target # Telling Traefik to use the above specified port
|
|
|
|
# Not Protected by Anubis
|
|
target2:
|
|
image: traefik/whoami:latest
|
|
networks:
|
|
- traefik
|
|
labels:
|
|
- traefik.enable=true # Enabling Traefik
|
|
- traefik.docker.network=traefik # Telling Traefik which network to use
|
|
- traefik.http.routers.target2.rule=Host(`another.com`) # Only Matching Requests for example.com
|
|
- traefik.http.routers.target2.entrypoints=websecure # Listening on the exclusive Anubis Network
|
|
- traefik.http.services.target2.loadbalancer.server.port=80 # Telling Traefik where to receive requests
|
|
- traefik.http.routers.target2.service=target2 # Telling Traefik to use the above specified port
|
|
- traefik.http.routers.target2.tls.certresolver=le # Telling Traefik to resolve a Cert for this Target
|
|
|
|
networks:
|
|
traefik:
|
|
name: traefik
|
|
```
|
|
|
|
**traefik.yml**
|
|
|
|
```yml
|
|
api:
|
|
insecure: false # shouldn't be enabled in prod
|
|
|
|
entryPoints:
|
|
# Web
|
|
web:
|
|
address: ":80"
|
|
websecure:
|
|
address: ":443"
|
|
# Anubis
|
|
anubis:
|
|
address: ":3923"
|
|
|
|
certificatesResolvers:
|
|
le:
|
|
acme:
|
|
tlsChallenge: {}
|
|
email: "admin@example.com"
|
|
storage: "/letsencrypt/acme.json"
|
|
|
|
providers:
|
|
docker: {}
|
|
```
|