Switch external services to k3s-managed SSL certs using cert-manager
This commit is contained in:
parent
c5c00dacb7
commit
d2852ab9c5
14 changed files with 199 additions and 20 deletions
BIN
.DS_Store
vendored
Normal file
BIN
.DS_Store
vendored
Normal file
Binary file not shown.
16
cert-manager/letsencrypt-cluster-issuer.yaml
Normal file
16
cert-manager/letsencrypt-cluster-issuer.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: ClusterIssuer
|
||||||
|
metadata:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
spec:
|
||||||
|
acme:
|
||||||
|
server: https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
email: nest@mynest.love
|
||||||
|
privateKeySecretRef:
|
||||||
|
name: letsencrypt-prod-account-key
|
||||||
|
solvers:
|
||||||
|
- dns01:
|
||||||
|
cloudflare:
|
||||||
|
apiTokenSecretRef:
|
||||||
|
name: cloudflare-api-token-secret
|
||||||
|
key: api-token
|
||||||
BIN
external-secrets/.DS_Store
vendored
Normal file
BIN
external-secrets/.DS_Store
vendored
Normal file
Binary file not shown.
18
external-secrets/cloudflare-api-token.yaml
Normal file
18
external-secrets/cloudflare-api-token.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
apiVersion: external-secrets.io/v1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: cloudflare-api-token
|
||||||
|
namespace: cert-manager
|
||||||
|
spec:
|
||||||
|
refreshInterval: "1h"
|
||||||
|
secretStoreRef:
|
||||||
|
name: vault-external-secrets-store
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
target:
|
||||||
|
name: cloudflare-api-token-secret
|
||||||
|
creationPolicy: Owner
|
||||||
|
data:
|
||||||
|
- secretKey: api-token
|
||||||
|
remoteRef:
|
||||||
|
key: cloudflare
|
||||||
|
property: api-key
|
||||||
18
external-secrets/secretstores/vault-secretstore.yaml
Normal file
18
external-secrets/secretstores/vault-secretstore.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
apiVersion: external-secrets.io/v1
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
metadata:
|
||||||
|
name: vault-external-secrets-store
|
||||||
|
namespace: external-secrets
|
||||||
|
spec:
|
||||||
|
provider:
|
||||||
|
vault:
|
||||||
|
server: "http://vault.vault.svc.cluster.local:8200"
|
||||||
|
path: "secret"
|
||||||
|
version: "v2"
|
||||||
|
auth:
|
||||||
|
kubernetes:
|
||||||
|
mountPath: "kubernetes"
|
||||||
|
role: "eso-role"
|
||||||
|
serviceAccountRef:
|
||||||
|
name: "external-secrets"
|
||||||
|
namespace: "external-secrets"
|
||||||
|
|
@ -1,11 +1,29 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: audiobookshelf-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: audiobookshelf-ingress
|
name: audiobookshelf-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-audiobookshelf-proxy-headers@kubernetescrd
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- lyrebird.mynest.love
|
||||||
|
secretName: audiobookshelf-tls
|
||||||
rules:
|
rules:
|
||||||
- host: lyrebird.mynest.love
|
- host: lyrebird.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ metadata:
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: calibre-web
|
io.kompose.service: calibre-web
|
||||||
name: calibre-web
|
name: calibre-web
|
||||||
|
annotations:
|
||||||
|
reloader.stakater.com/auto: "true"
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,28 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: calibre-web-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: calibre-web-ingress
|
name: calibre-web-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-calibre-web-proxy-headers@kubernetescrd
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- rookery.mynest.love
|
||||||
|
secretName: calibre-web-tls
|
||||||
rules:
|
rules:
|
||||||
- host: rookery.mynest.love
|
- host: rookery.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
|
||||||
kompose.cmd: kompose convert -f foundry-compose.yml
|
|
||||||
kompose.version: 1.38.0 (HEAD)
|
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: foundry-vtt
|
io.kompose.service: foundry-vtt
|
||||||
name: foundry-vtt
|
name: foundry-vtt
|
||||||
|
annotations:
|
||||||
|
reloader.stakater.com/auto: "true"
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|
@ -16,23 +15,9 @@ spec:
|
||||||
type: Recreate
|
type: Recreate
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
|
||||||
kompose.cmd: kompose convert -f foundry-compose.yml
|
|
||||||
kompose.version: 1.38.0 (HEAD)
|
|
||||||
vault.hashicorp.com/agent-inject: "true"
|
|
||||||
vault.hashicorp.com/role: "foundry-role"
|
|
||||||
vault.hashicorp.com/agent-inject-secret-credentials: "secret/data/foundry-vtt/config"
|
|
||||||
vault.hashicorp.com/agent-inject-template-credentials: |
|
|
||||||
{{- with secret "secret/data/foundry-vtt/config" -}}
|
|
||||||
export FOUNDRY_ADMIN_KEY="{{ .Data.data.admin_key }}"
|
|
||||||
export FOUNDRY_LICENSE_KEY="{{ .Data.data.license_key }}"
|
|
||||||
export FOUNDRY_PASSWORD="{{ .Data.data.password }}"
|
|
||||||
export FOUNDRY_USERNAME="{{ .Data.data.username }}"
|
|
||||||
{{- end -}}
|
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: foundry-vtt
|
io.kompose.service: foundry-vtt
|
||||||
spec:
|
spec:
|
||||||
serviceAccountName: foundry-vtt-sa
|
|
||||||
containers:
|
containers:
|
||||||
- name: foundry-vtt
|
- name: foundry-vtt
|
||||||
image: felddy/foundryvtt:release
|
image: felddy/foundryvtt:release
|
||||||
|
|
@ -40,15 +25,21 @@ spec:
|
||||||
- containerPort: 30000
|
- containerPort: 30000
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
name: web-ui
|
name: web-ui
|
||||||
|
envFrom:
|
||||||
|
- secretRef:
|
||||||
|
name: foundry-vtt-secret
|
||||||
env:
|
env:
|
||||||
- name: CONTAINER_PRESERVE_CONFIG
|
|
||||||
value: "true"
|
|
||||||
- name: FOUNDRY_MINIFY_STATIC_FILES
|
- name: FOUNDRY_MINIFY_STATIC_FILES
|
||||||
value: "true"
|
value: "true"
|
||||||
|
- name: FOUNDRY_HOSTNAME
|
||||||
|
value: "foundry.mynest.love"
|
||||||
|
- name: FOUNDRY_PROXY_PORT
|
||||||
|
value: "443"
|
||||||
|
- name: FOUNDRY_PROXY_SSL
|
||||||
|
value: "true"
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- mountPath: /data
|
- mountPath: /data
|
||||||
name: foundry-vtt-volume
|
name: foundry-vtt-volume
|
||||||
hostname: 8a7c791facf9
|
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
volumes:
|
volumes:
|
||||||
- name: foundry-vtt-volume
|
- name: foundry-vtt-volume
|
||||||
|
|
|
||||||
30
services/foundryvtt/foundry-vtt-external-secrets.yaml
Normal file
30
services/foundryvtt/foundry-vtt-external-secrets.yaml
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
apiVersion: external-secrets.io/v1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: foundry-vtt-credentials
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
refreshInterval: "1h"
|
||||||
|
secretStoreRef:
|
||||||
|
name: vault-external-secrets-store
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
target:
|
||||||
|
name: foundry-vtt-secret
|
||||||
|
creationPolicy: Owner
|
||||||
|
data:
|
||||||
|
- secretKey: FOUNDRY_ADMIN_KEY
|
||||||
|
remoteRef:
|
||||||
|
key: foundry-vtt/config
|
||||||
|
property: admin_key
|
||||||
|
- secretKey: FOUNDRY_LICENSE_KEY
|
||||||
|
remoteRef:
|
||||||
|
key: foundry-vtt/config
|
||||||
|
property: license_key
|
||||||
|
- secretKey: FOUNDRY_PASSWORD
|
||||||
|
remoteRef:
|
||||||
|
key: foundry-vtt/config
|
||||||
|
property: password
|
||||||
|
- secretKey: FOUNDRY_USERNAME
|
||||||
|
remoteRef:
|
||||||
|
key: foundry-vtt/config
|
||||||
|
property: username
|
||||||
|
|
@ -1,11 +1,28 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: foundry-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: foundry-ingress
|
name: foundry-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-foundry-proxy-headers@kubernetescrd
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- foundry.mynest.love
|
||||||
|
secretName: foundry-vtt-tls
|
||||||
rules:
|
rules:
|
||||||
- host: foundry.mynest.love
|
- host: foundry.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,28 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: jellyfin-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-ingress
|
name: jellyfin-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-jellyfin-proxy-headers@kubernetescrd
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- beak.mynest.love
|
||||||
|
secretName: jellyfin-tls
|
||||||
rules:
|
rules:
|
||||||
- host: beak.mynest.love
|
- host: beak.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,28 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: navidrome-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: navidrome-ingress
|
name: navidrome-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-navidrome-proxy-headers@kubernetescrd
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- chirp.mynest.love
|
||||||
|
secretName: navidrome-tls
|
||||||
rules:
|
rules:
|
||||||
- host: chirp.mynest.love
|
- host: chirp.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,29 @@
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: vaultwarden-proxy-headers
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: vaultwarden-ingress
|
name: vaultwarden-ingress
|
||||||
namespace: default
|
namespace: default
|
||||||
annotations:
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||||
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-vaultwarden-proxy-headers@kubernetescrd
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- vault.mynest.love
|
||||||
|
secretName: vaultwarden-tls
|
||||||
rules:
|
rules:
|
||||||
- host: vault.mynest.love
|
- host: vault.mynest.love
|
||||||
http:
|
http:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue