Compare commits

..

6 Commits

Author SHA1 Message Date
15c597406a small changes 2026-07-17 21:13:08 -03:00
2d29bddfcd adding ansible 2026-07-17 21:12:47 -03:00
7c2086009a adding bitwarden ESO and secrets 2026-07-16 20:44:15 -03:00
656f9053b4 adding deployments and small adjustments 2026-07-16 13:00:48 -03:00
ce8270290d fix(eso): bw-serve startup actually authenticates + re-logins every cycle
The bitwarden-cli Deployment's startup script never set BW_SESSION when
running without API-key creds (empty password branch / bw unlock --check
only), so bw serve started unauthenticated and every ExternalSecret across
all namespaces failed with HTTP 400 / 'Not found'. Wrap login in a function,
export the session, warm the cache once, and re-login every 5m in the
background loop so the session token never lapses.
2026-07-14 06:59:33 -03:00
d742121719 updating docs 2026-07-10 23:22:28 -03:00
28 changed files with 891 additions and 165 deletions

2
.gitignore vendored
View File

@@ -13,5 +13,3 @@ cronjobs
*.key *.key
chacal/ chacal/
secrets/

View File

@@ -1,3 +1,11 @@
# Helm configuration for Alloy (OSS monitoring collector)
This directory contains Helm configuration for deploying Grafana Alloy, an open-source observability data collector.
## Quick Install
```bash
helm repo add grafana https://grafana.github.io/helm-charts helm repo add grafana https://grafana.github.io/helm-charts
helm repo update helm repo update
helm install alloy grafana/alloy --namespace alloy -f values.yaml helm install alloy grafana/alloy --namespace alloy -f values.yaml
```

4
ansible/.ansible-lint Normal file
View File

@@ -0,0 +1,4 @@
---
profile: basic
exclude_paths:
- collections/

13
ansible/.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Encrypted secrets
group_vars/all/vault.yml
# Installed collections
collections/
# Ansible retry files
*.retry
# Local controller environment and test caches
.venv/
__pycache__/
.pytest_cache/

9
ansible/ansible.cfg Normal file
View File

@@ -0,0 +1,9 @@
[defaults]
inventory = inventory.yml
host_key_checking = True
retry_files_enabled = False
stdout_callback = default
result_format = yaml
collections_path = ./collections
roles_path = ./roles
interpreter_python = auto_silent

49
ansible/inventory.yml Normal file
View File

@@ -0,0 +1,49 @@
---
# Proxmox connection: local API access (the controller reaches the node directly).
# This is the "proxmox" group — not an SSH target, just connection params.
all:
children:
proxmox_nodes:
hosts:
otherside:
ansible_host: otherside.haven
ansible_connection: local # we call the Proxmox API, not SSH
astrid:
ansible_host: astrid.haven
ansible_connection: local # we call the Proxmox API, not SSH
k3s_cluster:
children:
grp_k3s_server: # group name == group_vars/grp_k3s_server.yml
hosts:
iris:
ansible_host: iris.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3
grp_k3s_agent: # group name == group_vars/grp_k3s_agent.yml
hosts:
vega:
ansible_host: vega.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3
nebula:
ansible_host: nebula.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3
nexus:
ansible_host: nexus.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3
lxcs:
children:
grp_docker_build: # group name == group_vars/grp_docker_build.yml
hosts:
docker_build:
ansible_host: docker-build.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3
grp_redis: # group name == group_vars/grp_redis.yml
hosts:
redis:
ansible_host: redis.haven
ansible_user: root
ansible_python_interpreter: /usr/bin/python3

View File

@@ -0,0 +1,69 @@
## Updates k3s in the entire cluster
- name: Update k3s Control Plane
hosts: grp_k3s_server
serial: 1
gather_facts: false
become: true
tasks:
- name: Update k3s on control plane node
ansible.builtin.shell: >
sh <(curl -sfL https://get.k3s.io)
args:
executable: /bin/bash
register: k3s_update
- name: Print update output
ansible.builtin.debug:
var: k3s_update
- name: Update k3s Agents
hosts: grp_k3s_agent
serial: 1
gather_facts: false
become: true
tasks:
- name: Cordon agent node
ansible.builtin.command: kubectl cordon {{ inventory_hostname }}
delegate_to: "{{ groups['grp_k3s_server'][0] }}"
environment:
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
ignore_errors: true
- name: Drain agent node
ansible.builtin.command: >
kubectl drain {{ inventory_hostname }}
--ignore-daemonsets
--delete-emptydir-data
--force
--timeout=60s
delegate_to: "{{ groups['grp_k3s_server'][0] }}"
environment:
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
ignore_errors: true
- name: Kill k3s-agent process
ansible.builtin.shell: k3s-killall.sh
ignore_errors: true
- name: Update k3s on agent node
ansible.builtin.shell: >
sh <(curl -sfL https://get.k3s.io)
args:
executable: /bin/bash
register: k3s_update
- name: Restart k3s-agent service
ansible.builtin.systemd:
name: k3s-agent
state: restarted
- name: Print update output
ansible.builtin.debug:
var: k3s_update
- name: Uncordon agent node
ansible.builtin.command: kubectl uncordon {{ inventory_hostname }}
delegate_to: "{{ groups['grp_k3s_server'][0] }}"
environment:
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
ignore_errors: true

View File

@@ -0,0 +1,2 @@
-r requirements-python.txt
ansible-lint==26.6.0

View File

@@ -0,0 +1,3 @@
ansible-core==2.21.2
proxmoxer==2.3.0
requests==2.34.2

6
ansible/requirements.yml Normal file
View File

@@ -0,0 +1,6 @@
---
collections:
- name: community.proxmox
version: "2.0.0"
- name: community.general
version: "13.2.0"

81
default/haven-notify.yaml Normal file
View File

@@ -0,0 +1,81 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: haven-notify
namespace: default
labels:
app: haven-notify
spec:
replicas: 1
selector:
matchLabels:
app: haven-notify
template:
metadata:
labels:
app: haven-notify
spec:
containers:
- name: haven-notify
image: git.ivanch.me/ivanch/haven-notify:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
- name: WEBHOOK_URL
valueFrom:
secretKeyRef:
name: discord-webhook
key: HAVEN_WEBHOOK_URL
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /live
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: haven-notify
namespace: default
spec:
selector:
app: haven-notify
ports:
- protocol: TCP
port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: haven-notify
namespace: default
spec:
ingressClassName: nginx
rules:
- host: notify.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: haven-notify
port:
number: 8080

View File

@@ -30,6 +30,31 @@ spec:
ports: ports:
- containerPort: 80 - containerPort: 80
name: vault-port name: vault-port
# /alive requires no authentication and verifies the Vaultwarden process
startupProbe:
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 30
readinessProbe:
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
livenessProbe:
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 15
timeoutSeconds: 3
failureThreshold: 6
volumeMounts: volumeMounts:
- name: vaultwarden-data - name: vaultwarden-data
mountPath: /data mountPath: /data
@@ -87,9 +112,9 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
tls: tls:
- hosts: - hosts:
- vault.haven - vault.haven
secretName: vaultwarden-tls secretName: vaultwarden-tls
rules: rules:
- host: vault.haven - host: vault.haven
http: http:

View File

@@ -14,6 +14,10 @@ data:
- "ubuntu-amd64:docker://docker.gitea.com/runner-images:ubuntu-latest" - "ubuntu-amd64:docker://docker.gitea.com/runner-images:ubuntu-latest"
- "ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest" - "ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
- "ubuntu-slim:docker://docker.gitea.com/runner-images:ubuntu-latest-slim" - "ubuntu-slim:docker://docker.gitea.com/runner-images:ubuntu-latest-slim"
- "runner-full:docker://git.ivanch.me/ivanch/runner-images:full"
- "runner-slim:docker://git.ivanch.me/ivanch/runner-images:slim"
- "runner-full-amd64:docker://git.ivanch.me/ivanch/runner-images:full"
- "runner-slim-amd64:docker://git.ivanch.me/ivanch/runner-images:slim"
--- ---
# --- ConfigMap for the ARM64 Runner --- # --- ConfigMap for the ARM64 Runner ---
apiVersion: v1 apiVersion: v1
@@ -28,6 +32,8 @@ data:
timeout: 1h timeout: 1h
labels: labels:
- "ubuntu-arm64:docker://docker.gitea.com/runner-images:ubuntu-latest" - "ubuntu-arm64:docker://docker.gitea.com/runner-images:ubuntu-latest"
- "runner-full-arm64:docker://git.ivanch.me/ivanch/runner-images:full"
- "runner-slim-arm64:docker://git.ivanch.me/ivanch/runner-images:slim"
--- ---
# PersistentVolumeClaim for AMD64 # PersistentVolumeClaim for AMD64
apiVersion: v1 apiVersion: v1
@@ -78,55 +84,55 @@ spec:
app: gitea-runner-amd64 app: gitea-runner-amd64
spec: spec:
containers: containers:
- name: gitea-runner - name: gitea-runner
image: gitea/act_runner:latest image: gitea/act_runner:latest
imagePullPolicy: Always imagePullPolicy: Always
resources: resources:
requests: requests:
cpu: "500m" cpu: "500m"
memory: "512Mi" memory: "512Mi"
limits: limits:
cpu: "4000m" cpu: "4000m"
memory: "4Gi" memory: "4Gi"
volumeMounts: volumeMounts:
- name: config-volume - name: config-volume
mountPath: /etc/gitea-runner/config.yaml mountPath: /etc/gitea-runner/config.yaml
subPath: config.yaml subPath: config.yaml
- name: docker-socket - name: docker-socket
mountPath: /var/run/docker.sock mountPath: /var/run/docker.sock
- name: gitea-runner-amd64-pvc - name: gitea-runner-amd64-pvc
mountPath: /data mountPath: /data
env: env:
- name: GITEA_RUNNER_REGISTRATION_TOKEN - name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: gitea-runner-token name: gitea-runner-token
key: REGISTRATION_TOKEN key: REGISTRATION_TOKEN
- name: GITEA_INSTANCE_URL - name: GITEA_INSTANCE_URL
value: https://git.ivanch.me value: https://git.ivanch.me
- name: GITEA_RUNNER_NAME - name: GITEA_RUNNER_NAME
value: k8s-runner-amd64 value: k8s-runner-amd64
- name: CONFIG_FILE - name: CONFIG_FILE
value: /etc/gitea-runner/config.yaml value: /etc/gitea-runner/config.yaml
volumes: volumes:
- name: config-volume - name: config-volume
configMap: configMap:
name: gitea-runner-amd64-config name: gitea-runner-amd64-config
- name: docker-socket - name: docker-socket
hostPath: hostPath:
path: /var/run/docker.sock path: /var/run/docker.sock
- name: gitea-runner-amd64-pvc - name: gitea-runner-amd64-pvc
persistentVolumeClaim: persistentVolumeClaim:
claimName: gitea-runner-amd64-pvc claimName: gitea-runner-amd64-pvc
affinity: affinity:
nodeAffinity: nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms: nodeSelectorTerms:
- matchExpressions: - matchExpressions:
- key: kubernetes.io/hostname - key: kubernetes.io/hostname
operator: In operator: In
values: values:
- iris - iris
--- ---
# --- Deployment for the ARM64 Runner --- # --- Deployment for the ARM64 Runner ---
apiVersion: apps/v1 apiVersion: apps/v1
@@ -145,52 +151,52 @@ spec:
app: gitea-runner-arm64 app: gitea-runner-arm64
spec: spec:
containers: containers:
- name: gitea-runner - name: gitea-runner
image: gitea/act_runner:latest image: gitea/act_runner:latest
imagePullPolicy: Always imagePullPolicy: Always
resources: resources:
requests: requests:
cpu: "500m" cpu: "500m"
memory: "512Mi" memory: "512Mi"
limits: limits:
cpu: "4000m" cpu: "4000m"
memory: "4Gi" memory: "4Gi"
volumeMounts: volumeMounts:
- name: config-volume - name: config-volume
mountPath: /etc/gitea-runner/config.yaml mountPath: /etc/gitea-runner/config.yaml
subPath: config.yaml subPath: config.yaml
- name: docker-socket - name: docker-socket
mountPath: /var/run/docker.sock mountPath: /var/run/docker.sock
- name: gitea-runner-arm64-pvc - name: gitea-runner-arm64-pvc
mountPath: /data mountPath: /data
env: env:
- name: GITEA_RUNNER_REGISTRATION_TOKEN - name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: gitea-runner-token name: gitea-runner-token
key: REGISTRATION_TOKEN key: REGISTRATION_TOKEN
- name: GITEA_INSTANCE_URL - name: GITEA_INSTANCE_URL
value: https://git.ivanch.me value: https://git.ivanch.me
- name: GITEA_RUNNER_NAME - name: GITEA_RUNNER_NAME
value: k8s-runner-arm64 value: k8s-runner-arm64
- name: CONFIG_FILE - name: CONFIG_FILE
value: /etc/gitea-runner/config.yaml value: /etc/gitea-runner/config.yaml
volumes: volumes:
- name: config-volume - name: config-volume
configMap: configMap:
name: gitea-runner-arm64-config name: gitea-runner-arm64-config
- name: docker-socket - name: docker-socket
hostPath: hostPath:
path: /var/run/docker.sock path: /var/run/docker.sock
- name: gitea-runner-arm64-pvc - name: gitea-runner-arm64-pvc
persistentVolumeClaim: persistentVolumeClaim:
claimName: gitea-runner-arm64-pvc claimName: gitea-runner-arm64-pvc
affinity: affinity:
nodeAffinity: nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms: nodeSelectorTerms:
- matchExpressions: - matchExpressions:
- key: kubernetes.io/hostname - key: kubernetes.io/hostname
operator: In operator: In
values: values:
- nexus - nexus

View File

@@ -1,6 +0,0 @@
## Setup AdGuard Sync credentials
```bash
kubectl create secret generic adguardhome-password \
--from-literal=password='your_adguardhome_password' \
--from-literal=username='your_adguardhome_username' -n dns
```

View File

@@ -0,0 +1,121 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: bitwarden-cli
namespace: infra
labels:
app.kubernetes.io/name: bitwarden-cli
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: bitwarden-cli
template:
metadata:
labels:
app.kubernetes.io/name: bitwarden-cli
spec:
containers:
- name: bitwarden-cli
image: ghcr.io/charlesthomas/bitwarden-cli:2026.3.0
imagePullPolicy: IfNotPresent
# Override the baked entrypoint so --disable-origin-protection is
# actually passed (it was commented out in the image's entrypoint.sh,
# which made bw serve reject all cross-pod requests -> connection refused).
command: ["/bin/bash", "-lc"]
args:
- |
set -e
bw config server "${BW_HOST}"
# Authenticate. Prefer the API key if client creds are present,
# otherwise fall back to username+password. The session is exported
# so the background loop can re-derive (and refresh) it.
login() {
if [ -n "$BW_CLIENTID" ] && [ -n "$BW_CLIENTSECRET" ]; then
echo "Using apikey to log in"
BW_SESSION=$(bw login --apikey --raw) || return 1
else
echo "Using password to log in"
BW_SESSION=$(bw login "${BW_USER}" --passwordenv BW_PASSWORD --raw) || return 1
fi
export BW_SESSION
}
login
# Warm the vault cache once at startup so bw serve has data immediately.
bw sync
bw status
# Keep the session alive: RE-LOGIN every cycle and re-sync so the on-disk
# vault cache stays warm and the session token never lapses. A loop that
# only re-ran `bw sync` with a captured session would eventually fail once
# the session expired (-> stale cache / "Not found" for changed items, or a
# full unauthenticated 400 if the initial login never happened at all).
echo "Starting periodic bw login+sync loop (every 5m)"
(
while true; do
sleep 300
login || true
echo "[$(date -u +%FT%TZ)] bw sync"
bw sync >/dev/null 2>&1 || echo "[$(date -u +%FT%TZ)] bw sync failed"
done
) &
echo 'Running `bw serve` on port 8087'
bw serve --hostname 0.0.0.0 --disable-origin-protection
env:
- name: BW_HOST
valueFrom:
secretKeyRef:
name: bitwarden-cli
key: BW_HOST
- name: BW_USER
valueFrom:
secretKeyRef:
name: bitwarden-cli
key: BW_USERNAME
- name: BW_PASSWORD
valueFrom:
secretKeyRef:
name: bitwarden-cli
key: BW_PASSWORD
ports:
- name: http
containerPort: 8087
protocol: TCP
startupProbe:
tcpSocket: { port: 8087 }
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 30
readinessProbe:
tcpSocket: { port: 8087 }
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
livenessProbe:
tcpSocket: { port: 8087 }
periodSeconds: 15
timeoutSeconds: 3
failureThreshold: 6
resources:
limits:
cpu: 400m
memory: 512Mi
requests:
cpu: 50m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: bitwarden-cli
namespace: infra
labels:
app.kubernetes.io/name: bitwarden-cli
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: bitwarden-cli
ports:
- name: http
port: 8087
targetPort: http
protocol: TCP

View File

@@ -0,0 +1,21 @@
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: bw-cli
namespace: infra
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: bitwarden-cli
policyTypes:
- Ingress
ingress:
- from:
# ESO pods (app.kubernetes.io/name: external-secrets) in the external-secrets namespace.
# Both podSelector AND namespaceSelector must match for cross-namespace traffic.
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: external-secrets
podSelector:
matchLabels:
app.kubernetes.io/name: external-secrets

View File

@@ -0,0 +1,20 @@
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata: { name: bitwarden-login }
spec:
provider:
webhook:
url: "http://bitwarden-cli.infra.svc:8087/object/item/{{ .remoteRef.key }}"
result: { jsonPath: "$.data.login.{{ .remoteRef.property }}" }
---
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata: { name: bitwarden-fields }
spec:
provider:
webhook:
url: "http://bitwarden-cli.infra.svc:8087/object/item/{{ .remoteRef.key }}"
result:
{
jsonPath: '$.data.fields[?@.name=="{{ .remoteRef.property }}"].value',
}

View File

@@ -33,56 +33,59 @@ spec:
affinity: affinity:
nodeAffinity: nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100 - weight: 100
preference: preference:
matchExpressions: matchExpressions:
- key: kubernetes.io/hostname - key: kubernetes.io/hostname
operator: In operator: In
values: values:
- nexus - nexus
containers: containers:
- name: wg-easy - name: wg-easy
image: ghcr.io/wg-easy/wg-easy:latest image: ghcr.io/wg-easy/wg-easy:latest
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- containerPort: 51820 - containerPort: 51820
protocol: UDP protocol: UDP
name: wg-port name: wg-port
- containerPort: 51821 - containerPort: 51821
protocol: TCP protocol: TCP
name: web-port name: web-port
env: env:
- name: LANG - name: LANG
value: en value: en
- name: WG_HOST - name: WG_HOST
value: vpn.ivanch.me value: vpn.ivanch.me
- name: WG_MTU - name: WG_MTU
value: "1420" value: "1420"
- name: UI_TRAFFIC_STATS - name: UI_TRAFFIC_STATS
value: "true" value: "true"
- name: UI_CHART_TYPE - name: UI_CHART_TYPE
value: "0" value: "0"
- name: WG_ENABLE_ONE_TIME_LINKS - name: WG_ENABLE_ONE_TIME_LINKS
value: "true" value: "true"
- name: UI_ENABLE_SORT_CLIENTS - name: UI_ENABLE_SORT_CLIENTS
value: "true" value: "true"
securityContext: securityContext:
capabilities: capabilities:
add: add:
- NET_ADMIN - NET_ADMIN
- SYS_MODULE - SYS_MODULE
resources: resources:
requests: requests:
cpu: 100m cpu: 100m
memory: 256Mi memory: 256Mi
volumeMounts: limits:
cpu: 2000m
memory: 1Gi
volumeMounts:
- name: wg-easy-volume - name: wg-easy-volume
mountPath: /etc/wireguard mountPath: /etc/wireguard
restartPolicy: Always restartPolicy: Always
volumes: volumes:
- name: wg-easy-volume - name: wg-easy-volume
persistentVolumeClaim: persistentVolumeClaim:
claimName: wg-easy-pvc claimName: wg-easy-pvc
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
@@ -95,14 +98,14 @@ spec:
app: wg-easy app: wg-easy
loadBalancerIP: 192.168.20.203 loadBalancerIP: 192.168.20.203
ports: ports:
- name: wg-port - name: wg-port
port: 51820 port: 51820
targetPort: 51820 targetPort: 51820
protocol: UDP protocol: UDP
- name: web-port - name: web-port
port: 51821 port: 51821
targetPort: 51821 targetPort: 51821
protocol: TCP protocol: TCP
--- ---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
@@ -112,13 +115,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: vpn.haven - host: vpn.haven
http: http:
paths: paths:
- path: / - path: /
pathType: Prefix pathType: Prefix
backend: backend:
service: service:
name: wg-easy-svc name: wg-easy-svc
port: port:
number: 51821 number: 51821

24
secrets/adguard.yaml Normal file
View File

@@ -0,0 +1,24 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: adguardhome-password, namespace: dns }
spec:
refreshInterval: 1h
target:
name: adguardhome-password
deletionPolicy: Retain
template:
type: Opaque
data:
username: "{{ .username }}"
password: "{{ .password }}"
data:
- secretKey: username
remoteRef:
{ key: 5bc7e63f-18bb-482c-bc3e-740e03b26334, property: username }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: password
remoteRef:
{ key: 5bc7e63f-18bb-482c-bc3e-740e03b26334, property: password }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }

36
secrets/cloudreve.yaml Normal file
View File

@@ -0,0 +1,36 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: cloudreve, namespace: cloud }
spec:
refreshInterval: 1h
target:
name: cloudreve-secret
deletionPolicy: Retain
template:
type: Opaque
data:
DB_USER: "{{ .DB_USER }}"
DB_PASSWORD: "{{ .DB_PASSWORD }}"
DB_NAME: "{{ .DB_NAME }}"
REDIS_PASSWORD: "{{ .REDIS_PASSWORD }}"
data:
- secretKey: DB_USER
remoteRef:
{ key: 8c25cac9-e9e8-4970-bdf4-31f9aee19276, property: username }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: DB_PASSWORD
remoteRef:
{ key: 8c25cac9-e9e8-4970-bdf4-31f9aee19276, property: password }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: DB_NAME
remoteRef:
{ key: 8c25cac9-e9e8-4970-bdf4-31f9aee19276, property: DB_NAME }
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: REDIS_PASSWORD
remoteRef:
{ key: 8c25cac9-e9e8-4970-bdf4-31f9aee19276, property: REDIS_PASSWORD }
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

21
secrets/gitea-runner.yaml Normal file
View File

@@ -0,0 +1,21 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: gitea-runner, namespace: dev }
spec:
refreshInterval: 1h
target:
name: gitea-runner-token
deletionPolicy: Retain
template:
type: Opaque
data:
REGISTRATION_TOKEN: "{{ .REGISTRATION_TOKEN }}"
data:
- secretKey: REGISTRATION_TOKEN
remoteRef:
{
key: 4e286657-b5de-4354-be2e-d1649b0fd527,
property: REGISTRATION_TOKEN,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

27
secrets/openwebui.yaml Normal file
View File

@@ -0,0 +1,27 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: openwebui, namespace: default }
spec:
refreshInterval: 1h
target:
name: openwebui-secret
deletionPolicy: Retain
template:
type: Opaque
data:
DATABASE_URL: "postgresql://{{ .username }}:{{ .password }}@postgresql.haven:5432/{{ .dbname }}"
data:
- secretKey: username
remoteRef:
{ key: e80ff314-7445-4b61-b5c5-69285ea72586, property: username }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: password
remoteRef:
{ key: e80ff314-7445-4b61-b5c5-69285ea72586, property: password }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: dbname
remoteRef: { key: e80ff314-7445-4b61-b5c5-69285ea72586, property: dbname }
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

39
secrets/paperless.yaml Normal file
View File

@@ -0,0 +1,39 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: paperless, namespace: default }
spec:
refreshInterval: 1h
target:
name: paperless-secret
deletionPolicy: Retain
template:
type: Opaque
data:
PAPERLESS_DBNAME: "{{ .PAPERLESS_DBNAME }}"
PAPERLESS_DBUSER: "{{ .PAPERLESS_DBUSER }}"
PAPERLESS_DBPASSWORD: "{{ .PAPERLESS_DBPASSWORD }}"
data:
- secretKey: PAPERLESS_DBNAME
remoteRef:
{
key: 05426e55-fe04-4c16-8697-8a258928257a,
property: PAPERLESS_DBNAME,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: PAPERLESS_DBUSER
remoteRef:
{
key: 05426e55-fe04-4c16-8697-8a258928257a,
property: PAPERLESS_DBUSER,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: PAPERLESS_DBPASSWORD
remoteRef:
{
key: 05426e55-fe04-4c16-8697-8a258928257a,
property: PAPERLESS_DBPASSWORD,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

48
secrets/radarr.yaml Normal file
View File

@@ -0,0 +1,48 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: radarr, namespace: media }
spec:
refreshInterval: 1h
target:
name: radarr-secret
deletionPolicy: Retain
template:
type: Opaque
data:
Radarr__Postgres__User: "{{ .Radarr__Postgres__User }}"
Radarr__Postgres__Password: "{{ .Radarr__Postgres__Password }}"
Radarr__Postgres__Host: "{{ .Radarr__Postgres__Host }}"
Radarr__Postgres__MainDb: "{{ .Radarr__Postgres__MainDb }}"
data:
- secretKey: Radarr__Postgres__User
remoteRef:
{
key: ab723b65-3ec8-469c-b01d-67a6e3049023,
property: username,
}
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: Radarr__Postgres__Password
remoteRef:
{
key: ab723b65-3ec8-469c-b01d-67a6e3049023,
property: password,
}
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: Radarr__Postgres__Host
remoteRef:
{
key: ab723b65-3ec8-469c-b01d-67a6e3049023,
property: Radarr__Postgres__Host,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: Radarr__Postgres__MainDb
remoteRef:
{
key: ab723b65-3ec8-469c-b01d-67a6e3049023,
property: Radarr__Postgres__MainDb,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

27
secrets/recommender.yaml Normal file
View File

@@ -0,0 +1,27 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: recommender, namespace: media }
spec:
refreshInterval: 1h
target:
name: recommender-secrets
deletionPolicy: Retain
template:
type: Opaque
data:
OPENAI_API_KEY: "{{ .OPENAI_API_KEY }}"
DATABASE_URL: "{{ .DATABASE_URL }}"
data:
- secretKey: OPENAI_API_KEY
remoteRef:
{
key: 5079ef6f-3d1d-4522-b22c-6dd5f1c19acd,
property: OPENAI_API_KEY,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: DATABASE_URL
remoteRef:
{ key: 5079ef6f-3d1d-4522-b22c-6dd5f1c19acd, property: DATABASE_URL }
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

30
secrets/slink.yaml Normal file
View File

@@ -0,0 +1,30 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: slink, namespace: cloud }
spec:
refreshInterval: 1h
target:
name: slink-secret
deletionPolicy: Retain
template:
type: Opaque
data:
ADMIN_USERNAME: "{{ .ADMIN_USERNAME }}"
ADMIN_PASSWORD: "{{ .ADMIN_PASSWORD }}"
ADMIN_EMAIL: "{{ .ADMIN_EMAIL }}"
data:
- secretKey: ADMIN_USERNAME
remoteRef:
{ key: 79f97033-6bc3-40cd-a28c-6060b8bd3a63, property: username }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: ADMIN_PASSWORD
remoteRef:
{ key: 79f97033-6bc3-40cd-a28c-6060b8bd3a63, property: password }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: ADMIN_EMAIL
remoteRef:
{ key: 79f97033-6bc3-40cd-a28c-6060b8bd3a63, property: ADMIN_EMAIL }
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }

42
secrets/sonarr.yaml Normal file
View File

@@ -0,0 +1,42 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: sonarr, namespace: media }
spec:
refreshInterval: 1h
target:
name: sonarr-secret
deletionPolicy: Retain
template:
type: Opaque
data:
Sonarr__Postgres__User: "{{ .Sonarr__Postgres__User }}"
Sonarr__Postgres__Password: "{{ .Sonarr__Postgres__Password }}"
Sonarr__Postgres__Host: "{{ .Sonarr__Postgres__Host }}"
Sonarr__Postgres__MainDb: "{{ .Sonarr__Postgres__MainDb }}"
data:
- secretKey: Sonarr__Postgres__User
remoteRef:
{ key: 2c5b6d27-971f-4876-b10d-db400dfde7b2, property: username }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: Sonarr__Postgres__Password
remoteRef:
{ key: 2c5b6d27-971f-4876-b10d-db400dfde7b2, property: password }
sourceRef:
{ storeRef: { name: bitwarden-login, kind: ClusterSecretStore } }
- secretKey: Sonarr__Postgres__Host
remoteRef:
{
key: 2c5b6d27-971f-4876-b10d-db400dfde7b2,
property: Sonarr__Postgres__Host,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }
- secretKey: Sonarr__Postgres__MainDb
remoteRef:
{
key: 2c5b6d27-971f-4876-b10d-db400dfde7b2,
property: Sonarr__Postgres__MainDb,
}
sourceRef:
{ storeRef: { name: bitwarden-fields, kind: ClusterSecretStore } }