9 changed files with 78 additions and 256 deletions
+32 -6
View File
@@ -1,12 +1,22 @@
# Initial setup
```sh
# Create namespace
# Setup Instructions
## Pre-installation
1. Create namespaces with
```bash
kubectl apply -f bootstrap/namespaces.yaml
```
# Install ArgoCD
2. Apply Vaultwarden deployment app
```bash
kubectl apply -f apps/default/vaultwarden.yaml
```
3. Configure required secrets in `secrets/` directory, each mapping to an entity in Vaultwarden.
## ArgoCD Installation
```sh
kubectl apply -k bootstrap/argocd-install
# Apply root app
kubectl apply -f bootstrap/root-app.yaml
```
@@ -17,3 +27,19 @@ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.pas
```
2. Access ArgoCD and login with `admin` / password from above.
## External Secrets Operator preparation
Create this Secret manually. `BW_HOST` must have no trailing slash.
```bash
kubectl -n infra create secret generic bitwarden-cli \
--from-literal=BW_HOST='[VAULTWARDEN_URL]' \
--from-literal=BW_USERNAME='[VAULTWARDEN_EMAIL]' \
--from-literal=BW_PASSWORD='[VAULTWARDEN_PASSWORD]'
```
## Apply order
1. `kubectl apply -f secrets/`
2. `kubectl apply -f apps/metalldb-system/`
3. `kubectl apply -f apps/infra/`
-132
View File
@@ -1,132 +0,0 @@
---
# 1) Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: qbittorrent
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: qbittorrent
template:
metadata:
labels:
app: qbittorrent
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
containers:
- name: qbittorrent
image: lscr.io/linuxserver/qbittorrent:5.0.4
imagePullPolicy: Always
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1000m
memory: 512Mi
ports:
- containerPort: 4300
name: webui-port
- containerPort: 6881
name: qbit-tcp
protocol: TCP
- containerPort: 6881
name: qbit-udp
protocol: UDP
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
- name: TZ
value: "Etc/UTC"
- name: WEBUI_PORT
value: "4300"
- name: TORRENTING_PORT
value: "6881"
volumeMounts:
- name: qbittorrent-config
mountPath: /config
- name: nas-storage
mountPath: /nas
volumes:
- name: qbittorrent-config
persistentVolumeClaim:
claimName: qbittorrent-config
- name: nas-storage
nfs:
server: 192.168.15.99
path: /export/Storage
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: qbittorrent-config
namespace: default
annotations:
nfs.io/storage-path: "qbittorrent-config"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# 2) Service
apiVersion: v1
kind: Service
metadata:
name: qbittorrent
namespace: default
spec:
type: NodePort
selector:
app: qbittorrent
ports:
- port: 4300
targetPort: webui-port
name: webui
- port: 6881
targetPort: qbit-tcp
name: torrent-tcp
protocol: TCP
- port: 6881
targetPort: qbit-udp
name: torrent-udp
protocol: UDP
---
# 4) Ingress (Traefik)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: qbittorrent
namespace: default
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
ingressClassName: nginx
rules:
- host: qbittorrent.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: qbittorrent
port:
number: 4300
+11
View File
@@ -0,0 +1,11 @@
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: external-secrets
namespace: kube-system
spec:
repo: https://charts.external-secrets.io
chart: external-secrets
version: 2.7.0
targetNamespace: external-secrets
createNamespace: true
+10
View File
@@ -0,0 +1,10 @@
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: metallb
namespace: kube-system
spec:
repo: https://metallb.github.io/metallb
chart: metallb
version: 0.15.2
targetNamespace: metallb-system
@@ -0,0 +1,23 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
accounts.api: apiKey
accounts.api.enabled: "true"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-rbac-cm
app.kubernetes.io/part-of: argocd
data:
policy.csv: |
g, api, role:readonly
@@ -9,3 +9,4 @@ resources:
patches:
- path: server-insecure-patch.yaml
- path: argocd-api-user.yaml
-48
View File
@@ -1,48 +0,0 @@
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
View File
@@ -1,27 +0,0 @@
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 } }
-42
View File
@@ -1,42 +0,0 @@
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 } }