Compare commits

..

2 Commits

Author SHA1 Message Date
Patrick Melanson 4e7ed0fcee slightly improve DNS provider integration docs
continuous-integration/drone/pr Build is failing
2026-02-16 15:35:17 -08:00
Patrick Melanson c6bfe41c94 Add support for porkbun
continuous-integration/drone/pr Build is failing
2026-02-16 14:46:54 -08:00
15 changed files with 50 additions and 106 deletions
+9 -23
View File
@@ -38,7 +38,7 @@ COMPOSE_FILE="compose.yml"
## Enable dns challenge (for wildcard domains)
## https://go-acme.github.io/lego/dns/#dns-providers
#LETS_ENCRYPT_DNS_CHALLENGE_ENABLED=1
## *Currently* one of ovh, gandi, gandiv5, digitalocean, azure, porkbun, and cloudflare.
## *Currently* one of ovh, gandi, gandiv5, digitalocean, azure, porkbun.
## Uncomment the corresponding provider below to insert your secret token/key.
#LETS_ENCRYPT_DNS_CHALLENGE_PROVIDER=ovh
@@ -47,25 +47,25 @@ COMPOSE_FILE="compose.yml"
#OVH_ENABLED=1
#OVH_APPLICATION_KEY=
#OVH_ENDPOINT=
#SECRET_OVH_APP_SECRET_VERSION=v1 # generate=false
#SECRET_OVH_CONSUMER_KEY=v1 # generate=false
#SECRET_OVH_APP_SECRET_VERSION=v1
#SECRET_OVH_CONSUMER_KEY=v1
## Gandi, https://gandi.net
## note(3wc): only "V5" (new) API is supported, so far
#COMPOSE_FILE="$COMPOSE_FILE:compose.gandi-api-key.yml"
#GANDI_API_KEY_ENABLED=1
#SECRET_GANDIV5_API_KEY_VERSION=v1 # generate=false
#SECRET_GANDIV5_API_KEY_VERSION=v1
## Gandi, https://gandi.net
## note: uses GandiV5 Personal Access Token
#COMPOSE_FILE="$COMPOSE_FILE:compose.gandi-personal-access-token.yml"
#GANDI_PERSONAL_ACCESS_TOKEN_ENABLED=1
#SECRET_GANDIV5_PERSONAL_ACCESS_TOKEN_VERSION=v1 # generate=false
#SECRET_GANDIV5_PERSONAL_ACCESS_TOKEN_VERSION=v1
## DigitalOcean, https://digitalocean.com
#COMPOSE_FILE="$COMPOSE_FILE:compose.digitalocean.yml"
#DIGITALOCEAN_ENABLED=1
#SECRET_DIGITALOCEAN_AUTH_TOKEN_VERSION=v1 # generate=false
#SECRET_DIGITALOCEAN_AUTH_TOKEN_VERSION=v1
## Azure, https://azure.com
## To insert your Azure client secret:
@@ -76,26 +76,15 @@ COMPOSE_FILE="compose.yml"
#AZURE_CLIENT_ID=
#AZURE_SUBSCRIPTION_ID=
#AZURE_RESOURCE_GROUP=
#SECRET_AZURE_SECRET_VERSION=v1 # generate=false
#SECRET_AZURE_SECRET_VERSION=v1
## Porkbun, https://porkbun.com
## To insert your secrets:
## abra app secret insert 1312.net pb_api_key v1 pk1_413
## abra app secret insert 1312.net pb_s_api_key v1 sk1_612
#COMPOSE_FILE="$COMPOSE_FILE:compose.porkbun.yml"
#SECRET_PORKBUN_API_KEY_VERSION=v1 # generate=false
#SECRET_PORKBUN_SECRET_API_KEY_VERSION=v1 # generate=false
## Cloudflare, htps://cloudflare.com
## To insert your secrets:
## abra app secret insert {myapp.example.coop} cf_dns_token v1 "<CLOUDFLARE_DNS_API_TOKEN>"
## abra app secret insert {myapp.example.coop} cf_zone_token v1 "<CLOUDFLARE_ZONE_API_TOKEN>"
## These can be the same token or different tokens
## cf_dns_token needs DNS edit access, cf_zone_token needs zone edit access
## See LEGO docs for more info: https://go-acme.github.io/lego/dns/cloudflare/index.html
#COMPOSE_FILE="$COMPOSE_FILE:compose.cloudflare.yml"
#SECRET_CLOUDFLARE_DNS_API_TOKEN_VERSION=v1 # generate=false
#SECRET_CLOUDFLARE_ZONE_API_TOKEN_VERSION=v1 # generate=false
#SECRET_PORKBUN_API_KEY_VERSION=v1
#SECRET_PORKBUN_SECRET_API_KEY_VERSION=v1
#####################################################################
# Manual wildcard certificate insertion #
@@ -133,10 +122,8 @@ COMPOSE_FILE="compose.yml"
## Enable prometheus metrics collection
## used used by the coop-cloud monitoring stack
## BASIC_AUTH should also be enabled
#COMPOSE_FILE="$COMPOSE_FILE:compose.metrics.yml"
#METRICS_ENABLED=1
#METRICS_FQDN=metrics.traefik.example.com
#####################################################################
# File provider directory configuration #
@@ -214,7 +201,6 @@ COMPOSE_FILE="compose.yml"
#ANUBIS_OG_EXPIRY_TIME=1h
#ANUBIS_OG_CACHE_CONSIDER_HOST=true
#ANUBIS_SERVE_ROBOTS_TXT=true
#ANUBIS_SLOG_LEVEL=INFO
## Enable onion service support
#ONION_ENABLED=1
+4 -3
View File
@@ -7,9 +7,10 @@ certain quality and consistency, that others can rely on.
A recipe maintainer has the following responsibilities:
- Respond to pull requests / issues within two weeks
- Make image security updates within a week
- Make image major updates every three months
- Respond to pull requests / issues within a week
- Make image security updates within a day
- Make image patch / minor updates within a week
- Make image major updates within a month
In order to fullfill these responsibilities a recipe maintainer:
+7 -8
View File
@@ -5,7 +5,7 @@
> https://docs.traefik.io
<!-- metadata -->
* **Maintainer**: [@p4u1](https://git.coopcloud.tech/p4u1), [@decentral1se](https://git.coopcloud.tech/decentral1se), [@javielico](https://git.coopcloud.tech/javielico), Local-IT: [@moritz](https://git.coopcloud.tech/moritz), [@msimon](https://git.coopcloud.tech/simon), [@carla](https://git.coopcloud.tech/carla)
* **Maintainer**: [@p4u1](https://git.coopcloud.tech/p4u1), [@decentral1se](https://git.coopcloud.tech/decentral1se), [@javielico](https://git.coopcloud.tech/javielico)
* **Status**: `stable`
* **Category**: Utilities
* **Features**: ?
@@ -32,16 +32,15 @@
3. Insert the secret: `abra app secret insert <domain> usersfile v1 -f usersfile
4. Redploy your app: `abra app deploy -f <domain>`
## Configuring SSL using DNS
## Configuring wildcard SSL using DNS
Automatic certificate generation will Just Work™ for most recipes which use a
fixed number of subdomains. If your server can't be reached from the Internet,
or if you're deploying a recipe that needs to work across arbitrary
Automatic certificate generation will Just Work™ for most recipes which use a fixed
number of subdomains. For some recipes which need to work across arbitrary
subdomains, like
[`federatedwiki`](https://git.coopcloud.tech/coop-cloud/federatedwiki/) and
[`go-ssb-room`](https://git.coopcloud.tech/coop-cloud/federatedwiki/) (requiring
the use of wildcard certificates,) you can give Traefik access to your DNS provider
so that it can carry out Letsencrypt DNS challenges.
[`go-ssb-room`](https://git.coopcloud.tech/coop-cloud/federatedwiki/), you'll
need to give Traefik access to your DNS provider so that it can carry out
Letsencrypt DNS challenges.
1. Use Gandi, OVH, DO, Azure, or PorkBun for DNS 🤡 (support for other providers
can be easily added, see
+2 -2
View File
@@ -1,3 +1,3 @@
export TRAEFIK_YML_VERSION=v31
export FILE_PROVIDER_YML_VERSION=v12
export TRAEFIK_YML_VERSION=v29
export FILE_PROVIDER_YML_VERSION=v11
export ENTRYPOINT_VERSION=v5
+1 -3
View File
@@ -5,9 +5,8 @@ services:
deploy:
labels:
- "traefik.http.middlewares.anubis.forwardauth.address=http://anubis:8080/.within.website/x/cmd/anubis/api/check"
- "traefik.http.middlewares.anubis.forwardauth.trustForwardHeader=true"
anubis:
image: "ghcr.io/techarohq/anubis:v1.25.0"
image: "ghcr.io/techarohq/anubis:v1.24.0"
environment:
BIND: ":8080"
TARGET: " "
@@ -18,7 +17,6 @@ services:
OG_EXPIRY_TIME: "${ANUBIS_OG_EXPIRY_TIME}"
OG_CACHE_CONSIDER_HOST: "${ANUBIS_OG_CACHE_CONSIDER_HOST}"
SERVE_ROBOTS_TXT: "${ANUBIS_SERVE_ROBOTS_TXT}"
SLOG_LEVEL: "${ANUBIS_SLOG_LEVEL:-INFO}"
networks:
- proxy
deploy:
-18
View File
@@ -1,18 +0,0 @@
version: "3.8"
services:
app:
environment:
- CLOUDFLARE_DNS_API_TOKEN_FILE=/run/secrets/cf_dns_token
- CLOUDFLARE_ZONE_API_TOKEN_FILE=/run/secrets/cf_zone_token
secrets:
- cf_dns_token
- cf_zone_token
secrets:
cf_dns_token:
name: ${STACK_NAME}_cf_dns_token_${SECRET_CLOUDFLARE_DNS_API_TOKEN_VERSION}
external: true
cf_zone_token:
name: ${STACK_NAME}_cf_zone_token_${SECRET_CLOUDFLARE_ZONE_API_TOKEN_VERSION}
external: true
+1 -4
View File
@@ -4,7 +4,4 @@ services:
environment:
- GARAGE_RPC_ENABLED
ports:
- target: 3901
published: 3901
protocol: tcp
mode: host
- "3901:3901"
+4
View File
@@ -3,3 +3,7 @@ services:
app:
environment:
- METRICS_ENABLED
ports:
- target: 8082
published: 8082
mode: host
+3 -4
View File
@@ -3,7 +3,7 @@ version: "3.8"
services:
app:
image: "traefik:v3.7.5"
image: "traefik:v3.6.8"
# Note(decentral1se): *please do not* add any additional ports here.
# Doing so could break new installs with port conflicts. Please use
# the usual `compose.$app.yml` approach for any additional ports
@@ -55,12 +55,12 @@ services:
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.service=api@internal"
- "traefik.http.routers.${STACK_NAME}.middlewares=security@file"
- "coop-cloud.${STACK_NAME}.version=5.1.1+v3.6.15"
- "coop-cloud.${STACK_NAME}.version=3.10.0+v3.6.7"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}"
- "backupbot.backup=${ENABLE_BACKUPS:-true}"
socket-proxy:
image: lscr.io/linuxserver/socket-proxy:3.4.0
image: lscr.io/linuxserver/socket-proxy:3.2.10-r0-ls65
deploy:
endpoint_mode: dnsrr
environment:
@@ -91,7 +91,6 @@ services:
- TASKS=1 # Needs access
- VERSION=1 # Needs access
- VOLUMES=0
- LOG_LEVEL=warning
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
-12
View File
@@ -30,18 +30,6 @@ http:
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: "31536000"
{{ if eq (env "METRICS_ENABLED") "1" }}
routers:
traefik-metrics:
rule: "Host(`{{ env "METRICS_FQDN" }}`)"
entrypoints:
- web-secure
tls:
certResolver: {{ env "LETS_ENCRYPT_ENV" }}
middlewares:
- basicauth@file
service: prometheus@internal
{{ end }}
tls:
options:
-11
View File
@@ -1,11 +0,0 @@
Short summary of the latest changes:
* Exposed ports have been switched to host-mode port publishing by default
This adds support for IPv6 ingress, which means that after deploying this
change, DNS AAAA records can be made to point to the relevant IPv6
address and Traefik will handle public IPv6 ingress traffic (including ACME
HTTP-01 challenges)
/!\ This is a breaking change. It is still possible to revert ports 80 and
443 to ingress-mode (the previous default) but keep in mind that there
is no longer an easy way to publish additional ports in ingress mode.
-10
View File
@@ -1,10 +0,0 @@
/!\ BREAKING CHANGE: Change metrics endpoint to use https instead of http 8082
to prevent sending BASIC_AUTH in plaintext
The metrics endpoint changed from http on port 8082 to the web-secure
endpoint to prevent sending BASIC_AUTH credentials plaintext. If metrics is
enabled you need to configure a FQDN for it by setting METRICS_FQDN in your
.env. You should also update the scrape config files in prometheus for
Traefik metrics from port 8082 to the new FQDN.
All changes: https://git.coopcloud.tech/coop-cloud/traefik/compare/5.0.0+v3.6.10...4.0.0+v3.6.10
-1
View File
@@ -1 +0,0 @@
Patched CVES: CVE-2026-32595 and CVE-2026-32305
+11 -1
View File
@@ -1 +1,11 @@
letsencrypt: Avoid HTTP-01 challenge if `LETS_ENCRYPT_DNS_CHALLENGE_ENABLED` is set, in order to rely on DNS-01 challenges for servers not exposed to the internet.
Short summary of the latest changes:
* Exposed ports have been switched to host-mode port publishing by default
This adds support for IPv6 ingress, which means that after deploying this
change, DNS AAAA records can be made to point to the relevant IPv6
address and Traefik will handle public IPv6 ingress traffic (including ACME
HTTP-01 challenges)
/!\ This is a breaking change. It is still possible to revert ports 80 and
443 to ingress-mode (the previous default) but keep in mind that there
is no longer an easy way to publish additional ports in ingress mode.
+8 -6
View File
@@ -94,6 +94,13 @@ entrypoints:
irc:
address: ":6697"
{{- end }}
{{- if eq (env "METRICS_ENABLED") "1" }}
metrics:
address: ":8082"
http:
middlewares:
- basicauth@file
{{- end }}
{{- if eq (env "MATRIX_FEDERATION_ENABLED") "1" }}
matrix-federation:
address: ":9001"
@@ -115,8 +122,7 @@ ping:
{{- if eq (env "METRICS_ENABLED") "1" }}
metrics:
prometheus:
entryPoint: web-secure
manualRouting: true
entryPoint: metrics
addRoutersLabels: true
addServicesLabels: true
{{- end }}
@@ -127,10 +133,8 @@ certificatesResolvers:
email: {{ env "LETS_ENCRYPT_EMAIL" }}
storage: /etc/letsencrypt/staging-acme.json
caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
{{- if ne (env "LETS_ENCRYPT_DNS_CHALLENGE_ENABLED") "1" }}
httpChallenge:
entryPoint: web
{{- end }}
{{- if eq (env "LETS_ENCRYPT_DNS_CHALLENGE_ENABLED") "1" }}
dnsChallenge:
provider: {{ (env "LETS_ENCRYPT_DNS_CHALLENGE_PROVIDER") }}
@@ -142,10 +146,8 @@ certificatesResolvers:
acme:
email: {{ env "LETS_ENCRYPT_EMAIL" }}
storage: /etc/letsencrypt/production-acme.json
{{- if ne (env "LETS_ENCRYPT_DNS_CHALLENGE_ENABLED") "1" }}
httpChallenge:
entryPoint: web
{{- end }}
{{- if eq (env "LETS_ENCRYPT_DNS_CHALLENGE_ENABLED") "1" }}
dnsChallenge:
provider: {{ (env "LETS_ENCRYPT_DNS_CHALLENGE_PROVIDER") }}