New cluster, proper namespaces, PostgreSQL migration
This commit is contained in:
parent
24931c2c7f
commit
245a51ecfd
|
@ -3,6 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
|
namespace: atuin
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
@ -18,12 +19,10 @@ spec:
|
||||||
- server
|
- server
|
||||||
- start
|
- start
|
||||||
env:
|
env:
|
||||||
- name: RUST_LOG
|
|
||||||
value: debug,atuin_server=debug
|
|
||||||
- name: ATUIN_DB_URI
|
- name: ATUIN_DB_URI
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: hippo-pguser-atuin
|
name: postgres-atuin
|
||||||
key: uri
|
key: uri
|
||||||
optional: false
|
optional: false
|
||||||
- name: ATUIN_HOST
|
- name: ATUIN_HOST
|
||||||
|
@ -31,8 +30,8 @@ spec:
|
||||||
- name: ATUIN_PORT
|
- name: ATUIN_PORT
|
||||||
value: "8888"
|
value: "8888"
|
||||||
- name: ATUIN_OPEN_REGISTRATION
|
- name: ATUIN_OPEN_REGISTRATION
|
||||||
value: "true"
|
value: "false"
|
||||||
image: ghcr.io/atuinsh/atuin:v18.0.0
|
image: ghcr.io/atuinsh/atuin:v18.2.0
|
||||||
name: atuin
|
name: atuin
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8888
|
- containerPort: 8888
|
||||||
|
@ -62,6 +61,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
|
namespace: atuin
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: atuin
|
app: atuin
|
||||||
|
@ -74,15 +74,14 @@ apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
|
namespace: atuin
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluster-issuer: "le-issuer"
|
||||||
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
|
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- atuin.gmem.ca
|
- atuin.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
rules:
|
||||||
- host: atuin.gmem.ca
|
- host: atuin.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -13,24 +13,21 @@ global:
|
||||||
name: authentik-secrets
|
name: authentik-secrets
|
||||||
key: secret-key
|
key: secret-key
|
||||||
- name: AUTHENTIK_POSTGRESQL__HOST
|
- name: AUTHENTIK_POSTGRESQL__HOST
|
||||||
valueFrom:
|
value: 192.168.50.236
|
||||||
secretKeyRef:
|
|
||||||
name: hippo-pguser-authentik
|
|
||||||
key: host
|
|
||||||
- name: AUTHENTIK_POSTGRESQL__PASSWORD
|
- name: AUTHENTIK_POSTGRESQL__PASSWORD
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: hippo-pguser-authentik
|
name: postgres-authentik
|
||||||
key: password
|
key: password
|
||||||
- name: AUTHENTIK_POSTGRESQL__USER
|
- name: AUTHENTIK_POSTGRESQL__USER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: hippo-pguser-authentik
|
name: postgres-authentik
|
||||||
key: user
|
key: user
|
||||||
- name: AUTHENTIK_POSTGRESQL__PORT
|
- name: AUTHENTIK_POSTGRESQL__PORT
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: hippo-pguser-authentik
|
name: postgres-authentik
|
||||||
key: port
|
key: port
|
||||||
|
|
||||||
server:
|
server:
|
||||||
|
@ -44,6 +41,5 @@ server:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- authentik.gmem.ca
|
- authentik.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
redis:
|
redis:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.cloudflare-exporter = {
|
kubernetes.helm.releases.cloudflare-exporter = {
|
||||||
namespace = "default";
|
namespace = "cloudflare";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://lablabs.github.io/cloudflare-exporter";
|
repo = "https://lablabs.github.io/cloudflare-exporter";
|
||||||
chart = "cloudflare-exporter";
|
chart = "cloudflare-exporter";
|
||||||
|
|
|
@ -3,11 +3,13 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared
|
name: cloudflared
|
||||||
|
namespace: cloudflare
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: cloudflared
|
app: cloudflared
|
||||||
replicas: 3
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
|
@ -15,7 +17,7 @@ spec:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: cloudflared
|
- name: cloudflared
|
||||||
image: cloudflare/cloudflared:2024.2.1
|
image: cloudflare/cloudflared:2024.4.1
|
||||||
args:
|
args:
|
||||||
- tunnel
|
- tunnel
|
||||||
- --config
|
- --config
|
||||||
|
@ -55,6 +57,8 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared-metrics
|
name: cloudflared-metrics
|
||||||
|
namespace: cloudflare
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: cloudflared
|
app: cloudflared
|
||||||
|
@ -67,6 +71,7 @@ apiVersion: monitoring.coreos.com/v1
|
||||||
kind: PodMonitor
|
kind: PodMonitor
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared
|
name: cloudflared
|
||||||
|
namespace: cloudflare
|
||||||
labels:
|
labels:
|
||||||
release: prometheus
|
release: prometheus
|
||||||
spec:
|
spec:
|
||||||
|
@ -76,3 +81,35 @@ spec:
|
||||||
podMetricsEndpoints:
|
podMetricsEndpoints:
|
||||||
- port: metrics
|
- port: metrics
|
||||||
interval: 30s
|
interval: 30s
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: cloudflared
|
||||||
|
namespace: cloudflare
|
||||||
|
data:
|
||||||
|
config.yaml: |
|
||||||
|
tunnel: new-homelab
|
||||||
|
credentials-file: /etc/cloudflared/creds/credentials.json
|
||||||
|
metrics: 0.0.0.0:2000
|
||||||
|
no-autoupdate: true
|
||||||
|
ingress:
|
||||||
|
- hostname: photos.gmem.ca
|
||||||
|
service: http://immich-server.immich.svc.cluster.local:3001
|
||||||
|
- hostname: pw.gmem.ca
|
||||||
|
service: http://vaultwarden.vaultwarden.svc.cluster.local:80
|
||||||
|
- hostname: authentik.gmem.ca
|
||||||
|
service: http://authentik-server.authentik.svc.cluster.local:80
|
||||||
|
- hostname: nitter.gmem.ca
|
||||||
|
service: http://nitter.nitter.svc.cluster.local:8081
|
||||||
|
- hostname: git.gmem.ca
|
||||||
|
service: http://192.168.50.229
|
||||||
|
- hostname: proxmox.gmem.ca
|
||||||
|
service: http://proxmox.endpoints.svc.cluster.local:8006
|
||||||
|
- hostname: tokyo.gmem.ca
|
||||||
|
service: http://tokyo.endpoints.svc.cluster.local:8000
|
||||||
|
- hostname: ibiza.gmem.ca
|
||||||
|
service: http://ibiza.endpoints.svc.cluster.local:8000
|
||||||
|
- hostname: chat.gmem.ca
|
||||||
|
service: tcp://192.168.50.45:443
|
||||||
|
- service: http_status:404
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let
|
let
|
||||||
endpoints = {
|
endpoints = {
|
||||||
"proxmox" = {
|
"proxmox" = {
|
||||||
location = "100.100.75.80";
|
location = "192.168.50.3";
|
||||||
host = "proxmox.gmem.ca";
|
host = "proxmox.gmem.ca";
|
||||||
port = 8006;
|
port = 8006;
|
||||||
protocol = "HTTPS";
|
protocol = "HTTPS";
|
||||||
|
@ -28,6 +28,7 @@ let
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services =
|
kubernetes.resources.services =
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
|
metadata.namespace = "endpoints";
|
||||||
spec = {
|
spec = {
|
||||||
ports.${name} = {
|
ports.${name} = {
|
||||||
port = endpoint.port;
|
port = endpoint.port;
|
||||||
|
@ -38,6 +39,7 @@ in {
|
||||||
endpoints;
|
endpoints;
|
||||||
kubernetes.resources.endpoints =
|
kubernetes.resources.endpoints =
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
|
metadata.namespace = "endpoints";
|
||||||
subsets = [
|
subsets = [
|
||||||
{
|
{
|
||||||
addresses = [{ip = endpoint.location;}];
|
addresses = [{ip = endpoint.location;}];
|
||||||
|
@ -56,9 +58,10 @@ in {
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = name;
|
name = name;
|
||||||
|
namespace = "endpoints";
|
||||||
annotations = {
|
annotations = {
|
||||||
"nginx.ingress.kubernetes.io/proxy-body-size" = "10g";
|
"nginx.ingress.kubernetes.io/proxy-body-size" = "10g";
|
||||||
"cert-manager.io/issuer" = "le-issuer";
|
"cert-manager.io/cluser-issuer" = "le-issuer";
|
||||||
"nginx.ingress.kubernetes.io/backend-protocol" = endpoint.protocol;
|
"nginx.ingress.kubernetes.io/backend-protocol" = endpoint.protocol;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -66,7 +69,6 @@ in {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = [endpoint.host];
|
hosts = [endpoint.host];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
|
@ -1,103 +0,0 @@
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: freshrss
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: freshrss
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: freshrss
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: freshrss
|
|
||||||
image: freshrss/freshrss:1.22.1-arm
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "256Mi"
|
|
||||||
cpu: "500m"
|
|
||||||
ports:
|
|
||||||
- containerPort: 80
|
|
||||||
env:
|
|
||||||
- name: CRON_MIN
|
|
||||||
value: 1,31
|
|
||||||
envFrom:
|
|
||||||
- configMapRef:
|
|
||||||
name: freshrss-config
|
|
||||||
- secretRef:
|
|
||||||
name: freshrss-secrets
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /var/www/FreshRSS/data
|
|
||||||
- name: extension-data
|
|
||||||
mountPath: /var/www/FreshRSS/data/extensions
|
|
||||||
volumes:
|
|
||||||
- name: data
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: freshrss-data
|
|
||||||
- name: extension-data
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: freshrss-extension-data
|
|
||||||
---
|
|
||||||
kind: PersistentVolumeClaim
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: freshrss-data
|
|
||||||
spec:
|
|
||||||
accessModes:
|
|
||||||
- ReadWriteOnce
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 1Gi
|
|
||||||
storageClassName: nfs-client
|
|
||||||
---
|
|
||||||
kind: PersistentVolumeClaim
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: freshrss-extension-data
|
|
||||||
spec:
|
|
||||||
accessModes:
|
|
||||||
- ReadWriteOnce
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 1Gi
|
|
||||||
storageClassName: nfs-client
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: freshrss
|
|
||||||
spec:
|
|
||||||
type: ClusterIP
|
|
||||||
selector:
|
|
||||||
app: freshrss
|
|
||||||
ports:
|
|
||||||
- port: 80
|
|
||||||
targetPort: 80
|
|
||||||
---
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
name: freshrss
|
|
||||||
annotations:
|
|
||||||
cert-manager.io/issuer: "le-issuer"
|
|
||||||
namespace: default
|
|
||||||
spec:
|
|
||||||
tls:
|
|
||||||
- hosts:
|
|
||||||
- freshrss.gmem.ca
|
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
|
||||||
- host: freshrss.gmem.ca
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- path: /
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: freshrss
|
|
||||||
port:
|
|
||||||
number: 80
|
|
|
@ -72,13 +72,11 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: homebridge
|
name: homebridge
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluster-issuer: "le-issuer"
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- hb.gmem.ca
|
- hb.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
rules:
|
||||||
- host: hb.gmem.ca
|
- host: hb.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
description = "Plex";
|
description = "Plex";
|
||||||
widget = {
|
widget = {
|
||||||
type = "plex";
|
type = "plex";
|
||||||
url = "http://vancouver:32400";
|
url = "http://192.168.50.229:32400";
|
||||||
key = "{{HOMEPAGE_VAR_PLEX_KEY}}";
|
key = "{{HOMEPAGE_VAR_PLEX_KEY}}";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -142,16 +142,10 @@
|
||||||
{
|
{
|
||||||
Reading = [
|
Reading = [
|
||||||
{
|
{
|
||||||
FreshRSS = {
|
miniflux = {
|
||||||
icon = "freshrss.png";
|
icon = "miniflux.png";
|
||||||
href = "https://freshrss.gmem.ca";
|
href = "https://rss.gmem.ca";
|
||||||
description = "FreshRSS RSS Reader";
|
description = "Miniflux RSS Reader";
|
||||||
widget = {
|
|
||||||
type = "freshrss";
|
|
||||||
url = "https://freshrss.gmem.ca";
|
|
||||||
username = "arch";
|
|
||||||
password = "{{HOMEPAGE_VAR_FRESHRSS_PASSWORD}}";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -309,6 +303,7 @@
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
kubernetes.helm.releases.homepage = {
|
kubernetes.helm.releases.homepage = {
|
||||||
|
namespace = "homepage";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://jameswynn.github.io/helm-charts";
|
repo = "https://jameswynn.github.io/helm-charts";
|
||||||
chart = "homepage";
|
chart = "homepage";
|
||||||
|
@ -350,7 +345,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.deployments.homepage = {
|
kubernetes.resources.deployments.homepage = {
|
||||||
metadata.namespace = "default";
|
metadata.namespace = "homepage";
|
||||||
|
|
||||||
spec.template = {
|
spec.template = {
|
||||||
metadata.annotations."gmem.ca/homepage-config-hash" = builtins.hashString "md5" (builtins.toJSON homepage-config);
|
metadata.annotations."gmem.ca/homepage-config-hash" = builtins.hashString "md5" (builtins.toJSON homepage-config);
|
||||||
|
|
|
@ -2,7 +2,6 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: hue
|
name: hue
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -14,7 +13,7 @@ spec:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: hue
|
- name: hue
|
||||||
image: icr.gmem.ca/hue
|
image: git.gmem.ca/arch/hue
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "32Mi"
|
memory: "32Mi"
|
||||||
|
@ -54,13 +53,11 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: hue
|
name: hue
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluser-issuer: "le-issuer"
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- hue.gmem.ca
|
- hue.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
rules:
|
||||||
- host: hue.gmem.ca
|
- host: hue.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -5,34 +5,37 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.immich = {
|
kubernetes.helm.releases.immich = {
|
||||||
|
namespace = "immich";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://immich-app.github.io/immich-charts";
|
repo = "https://immich-app.github.io/immich-charts";
|
||||||
chart = "immich";
|
chart = "immich";
|
||||||
version = "0.4.0";
|
version = "0.6.0";
|
||||||
sha256 = "qekwsAke6NBwhlbt7nIkuwTSIydcWOq/kETooYb64oY=";
|
sha256 = "p9fgqRMxRJ2rMBZZfMKuAIjp/N1/KgKCKLDhoXO0O6c=";
|
||||||
};
|
};
|
||||||
# arbitrary attrset passed as values to the helm release
|
# arbitrary attrset passed as values to the helm release
|
||||||
values = {
|
values = {
|
||||||
image.tag = "v1.98.2";
|
image.tag = "v1.102.3";
|
||||||
machine-learning.enabled = false;
|
machine-learning.enabled = false;
|
||||||
immich.persistence.library.existingClaim = "immich";
|
immich.persistence.library.existingClaim = "immich";
|
||||||
redis.enabled = true;
|
redis = {
|
||||||
|
enabled = true;
|
||||||
|
};
|
||||||
env = {
|
env = {
|
||||||
PGSSLMODE = "no-verify";
|
PGSSLMODE = "no-verify";
|
||||||
DB_URL.valueFrom.secretKeyRef = {
|
DB_PASSWORD.valueFrom.secretKeyRef = {
|
||||||
name = "hippo-pguser-immich";
|
name = "postgres-immich";
|
||||||
key = "uri";
|
key = "password";
|
||||||
};
|
};
|
||||||
|
DB_HOSTNAME.value = "192.168.50.236";
|
||||||
};
|
};
|
||||||
server.ingress.main = {
|
server.ingress.main = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/issuer" = "le-issuer";
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["photos.gmem.ca"];
|
hosts = ["photos.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -46,7 +49,10 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.persistentVolumeClaims.immich = {
|
kubernetes.resources.persistentVolumeClaims.immich = {
|
||||||
metadata.name = "immich";
|
metadata = {
|
||||||
|
name = "immich";
|
||||||
|
namespace = "immich";
|
||||||
|
};
|
||||||
spec = {
|
spec = {
|
||||||
accessModes = ["ReadWriteOnce"];
|
accessModes = ["ReadWriteOnce"];
|
||||||
resources.requests.storage = "50Gi";
|
resources.requests.storage = "50Gi";
|
||||||
|
|
|
@ -4,16 +4,19 @@ let
|
||||||
gamjaImage = "git.gmem.ca/arch/gamja:latest";
|
gamjaImage = "git.gmem.ca/arch/gamja:latest";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services.soju = {
|
kubernetes.resources.services.soju = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
spec = {
|
spec = {
|
||||||
type = "NodePort";
|
type = "NodePort";
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.tls = {
|
ports.tls = {
|
||||||
port = 6697;
|
port = 6697;
|
||||||
targetPort = 6697;
|
targetPort = 6697;
|
||||||
|
nodePort = 6697;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.soju-ws = {
|
kubernetes.resources.services.soju-ws = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.ws = {
|
ports.ws = {
|
||||||
|
@ -23,6 +26,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.gamja = {
|
kubernetes.resources.services.gamja = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = "gamja";
|
selector.app = "gamja";
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -31,55 +35,57 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.soju.spec = {
|
kubernetes.resources.deployments.soju = {
|
||||||
selector.matchLabels.app = appName;
|
metadata.namespace = "irc";
|
||||||
template = {
|
spec = {
|
||||||
metadata.labels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
spec = {
|
template = {
|
||||||
volumes = {
|
metadata.labels.app = appName;
|
||||||
config.configMap.name = "soju";
|
spec = {
|
||||||
ssl.secret.secretName = "gmem-ca-wildcard";
|
volumes = {
|
||||||
};
|
config.configMap.name = "soju";
|
||||||
containers = {
|
ssl.secret.secretName = "irc-gmem-ca";
|
||||||
soju = {
|
};
|
||||||
image = sojuImage;
|
containers = {
|
||||||
imagePullPolicy = "Always";
|
soju = {
|
||||||
volumeMounts = [
|
image = sojuImage;
|
||||||
{
|
imagePullPolicy = "Always";
|
||||||
name = "config";
|
volumeMounts = [
|
||||||
mountPath = "/etc/soju/config";
|
{
|
||||||
subPath = "config";
|
name = "config";
|
||||||
}
|
mountPath = "/etc/soju/config";
|
||||||
{
|
subPath = "config";
|
||||||
name = "ssl";
|
}
|
||||||
mountPath = "/ssl";
|
{
|
||||||
}
|
name = "ssl";
|
||||||
];
|
mountPath = "/ssl";
|
||||||
ports.tls.containerPort = 6697;
|
}
|
||||||
ports.ws.containerPort = 80;
|
];
|
||||||
|
ports.tls.containerPort = 6697;
|
||||||
|
ports.ws.containerPort = 80;
|
||||||
|
|
||||||
env.PGHOST.valueFrom.secretKeyRef = {
|
env.PGHOST.value = "192.168.50.236";
|
||||||
name = "hippo-pguser-soju";
|
env.PGPASSWORD.valueFrom.secretKeyRef = {
|
||||||
key = "host";
|
name = "postgres-soju";
|
||||||
};
|
key = "password";
|
||||||
env.PGPASSWORD.valueFrom.secretKeyRef = {
|
};
|
||||||
name = "hippo-pguser-soju";
|
|
||||||
key = "password";
|
|
||||||
};
|
|
||||||
env.PGUSER.valueFrom.secretKeyRef = {
|
env.PGUSER.valueFrom.secretKeyRef = {
|
||||||
name = "hippo-pguser-soju";
|
name = "postgres-soju";
|
||||||
key = "user";
|
key = "user";
|
||||||
};
|
};
|
||||||
env.PGDATABASE.valueFrom.secretKeyRef = {
|
env.PGDATABASE.valueFrom.secretKeyRef = {
|
||||||
name = "hippo-pguser-soju";
|
name = "postgres-soju";
|
||||||
key = "dbname";
|
key = "dbname";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.gamja.spec = {
|
kubernetes.resources.deployments.gamja = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
|
spec = {
|
||||||
selector.matchLabels.app = "gamja";
|
selector.matchLabels.app = "gamja";
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = "gamja";
|
metadata.labels.app = "gamja";
|
||||||
|
@ -93,17 +99,20 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.ingresses.irc = {
|
kubernetes.resources.ingresses.irc = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
metadata.annotations = {
|
metadata.annotations = {
|
||||||
"cert-manager.io/issuer" = "le-issuer";
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
|
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "3600";
|
||||||
|
"nginx.ingress.kubernetes.io/proxy-send-timeout" = "3600";
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["irc.gmem.ca"];
|
hosts = ["irc.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
@ -132,7 +141,9 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.configMaps.soju.data.config = ''
|
kubernetes.resources.configMaps.soju = {
|
||||||
|
metadata.namespace = "irc";
|
||||||
|
data.config = ''
|
||||||
listen ircs://
|
listen ircs://
|
||||||
listen unix+admin:///app/admin
|
listen unix+admin:///app/admin
|
||||||
listen ws+insecure://
|
listen ws+insecure://
|
||||||
|
@ -142,4 +153,5 @@ in {
|
||||||
message-store db
|
message-store db
|
||||||
tls /ssl/tls.crt /ssl/tls.key
|
tls /ssl/tls.crt /ssl/tls.key
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
apiVersion: cert-manager.io/v1
|
apiVersion: cert-manager.io/v1
|
||||||
kind: Issuer
|
kind: ClusterIssuer
|
||||||
metadata:
|
metadata:
|
||||||
name: le-issuer
|
name: le-issuer
|
||||||
spec:
|
spec:
|
||||||
|
@ -29,7 +29,7 @@ metadata:
|
||||||
spec:
|
spec:
|
||||||
secretName: gmem-ca-wildcard
|
secretName: gmem-ca-wildcard
|
||||||
issuerRef:
|
issuerRef:
|
||||||
kind: Issuer
|
kind: ClusterIssuer
|
||||||
name: le-issuer
|
name: le-issuer
|
||||||
commonName: "*.gmem.ca"
|
commonName: "*.gmem.ca"
|
||||||
dnsNames:
|
dnsNames:
|
||||||
|
|
|
@ -15,15 +15,16 @@
|
||||||
(import ./immich.nix)
|
(import ./immich.nix)
|
||||||
(import ./endpoints.nix)
|
(import ./endpoints.nix)
|
||||||
(import ./homepage.nix)
|
(import ./homepage.nix)
|
||||||
# (import ./pterodactyl.nix)
|
|
||||||
(import ./cloudflare-exporter.nix)
|
(import ./cloudflare-exporter.nix)
|
||||||
(import ./piped.nix)
|
(import ./piped.nix)
|
||||||
(import ./conduit.nix)
|
# (import ./conduit.nix)
|
||||||
(import ./irc.nix)
|
(import ./irc.nix)
|
||||||
(import ./netboot.nix)
|
# (import ./netboot.nix)
|
||||||
(import ./nitter.nix)
|
(import ./nitter.nix)
|
||||||
(import ./changedetection.nix)
|
# (import ./changedetection.nix)
|
||||||
(import ./nextdns-exporter.nix)
|
(import ./nextdns-exporter.nix)
|
||||||
(import ./nitter-bot.nix)
|
(import ./nitter-bot.nix)
|
||||||
|
(import ./miniflux.nix)
|
||||||
|
# (import ./snikket.nix)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
103
homelab/miniflux.nix
Normal file
103
homelab/miniflux.nix
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
let
|
||||||
|
appName = "miniflux";
|
||||||
|
appImage = "docker.io/miniflux/miniflux";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
kubenix,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
kubernetes.resources.deployments.miniflux = {
|
||||||
|
metadata.namespace = "miniflux";
|
||||||
|
spec = {
|
||||||
|
selector.matchLabels.app = appName;
|
||||||
|
template = {
|
||||||
|
metadata.labels.app = appName;
|
||||||
|
spec = {
|
||||||
|
containers = {
|
||||||
|
miniflux = {
|
||||||
|
image = appImage;
|
||||||
|
envFrom = [{secretRef.name = "miniflux";}
|
||||||
|
{configMapRef.name = "miniflux";}];
|
||||||
|
resources = {
|
||||||
|
requests = {
|
||||||
|
cpu = "1m";
|
||||||
|
memory = "256Mi";
|
||||||
|
};
|
||||||
|
limits = {
|
||||||
|
cpu = "1";
|
||||||
|
memory = "512Mi";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ports.http.containerPort = 8080;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.services.miniflux = {
|
||||||
|
metadata.namespace = "miniflux";
|
||||||
|
metadata.labels.app = appName;
|
||||||
|
spec = {
|
||||||
|
selector.app = appName;
|
||||||
|
ports.http = {
|
||||||
|
port = 8080;
|
||||||
|
targetPort = 8080;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
kubernetes.resources.ingresses.miniflux = {
|
||||||
|
metadata.namespace = "miniflux";
|
||||||
|
metadata.annotations = {
|
||||||
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
|
};
|
||||||
|
spec = {
|
||||||
|
tls = [
|
||||||
|
{
|
||||||
|
hosts = ["rss.gmem.ca"];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
host = "rss.gmem.ca";
|
||||||
|
http.paths = [
|
||||||
|
{
|
||||||
|
path = "/";
|
||||||
|
pathType = "Prefix";
|
||||||
|
backend.service = {
|
||||||
|
name = "miniflux";
|
||||||
|
port.number = 8080;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.miniflux = {
|
||||||
|
metadata.namespace = "miniflux";
|
||||||
|
spec = {
|
||||||
|
selector.matchLabels.app = appName;
|
||||||
|
endpoints = [
|
||||||
|
{
|
||||||
|
port = "http";
|
||||||
|
interval = "60s";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
kubernetes.resources.configMaps.miniflux = {
|
||||||
|
metadata.namespace = "miniflux";
|
||||||
|
data = {
|
||||||
|
CLEANUP_ARCHIVE_UNREAD_DAYS = "60";
|
||||||
|
METRICS_COLLECTOR = "1";
|
||||||
|
METRICS_ALLOWED_NETWORKS = "0.0.0.0/0";
|
||||||
|
BASE_URL = "https://rss.gmem.ca/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ let
|
||||||
nextdns-exporterImage = "ghcr.io/raylas/nextdns-exporter:0.5.3";
|
nextdns-exporterImage = "ghcr.io/raylas/nextdns-exporter:0.5.3";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.nextdns-exporter = {
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.nextdns-exporter = {
|
||||||
|
metadata.namespace = "prometheus";
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
|
@ -20,6 +21,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.services.nextdns-exporter-metrics = {
|
kubernetes.resources.services.nextdns-exporter-metrics = {
|
||||||
|
metadata.namespace = "prometheus";
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
|
@ -34,24 +36,27 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.deployments.nextdns-exporter.spec = {
|
kubernetes.resources.deployments.nextdns-exporter = {
|
||||||
selector.matchLabels.app = appName;
|
metadata.namespace = "prometheus";
|
||||||
template = {
|
spec = {
|
||||||
metadata.labels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
spec = {
|
template = {
|
||||||
containers = {
|
metadata.labels.app = appName;
|
||||||
nextdns-exporter = {
|
spec = {
|
||||||
image = nextdns-exporterImage;
|
containers = {
|
||||||
imagePullPolicy = "Always";
|
nextdns-exporter = {
|
||||||
ports.metrics.containerPort = 9948;
|
image = nextdns-exporterImage;
|
||||||
envFrom = [{secretRef.name = "nextdns-exporter";}];
|
imagePullPolicy = "Always";
|
||||||
};
|
ports.metrics.containerPort = 9948;
|
||||||
nextdns-ts-exporter = {
|
envFrom = [{secretRef.name = "nextdns-exporter";}];
|
||||||
image = nextdns-exporterImage;
|
};
|
||||||
imagePullPolicy = "Always";
|
nextdns-ts-exporter = {
|
||||||
ports.metrics.containerPort = 9949;
|
image = nextdns-exporterImage;
|
||||||
env.METRICS_PORT.value = "9949";
|
imagePullPolicy = "Always";
|
||||||
envFrom = [{secretRef.name = "nextdns-ts-exporter";}];
|
ports.metrics.containerPort = 9949;
|
||||||
|
env.METRICS_PORT.value = "9949";
|
||||||
|
envFrom = [{secretRef.name = "nextdns-ts-exporter";}];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
nfs:
|
nfs:
|
||||||
server: vancouver
|
server: 192.168.50.229
|
||||||
path: /Primary/k3scluster
|
path: /tank/k3scluster
|
||||||
storageClass:
|
storageClass:
|
||||||
defaultClass: true
|
defaultClass: true
|
||||||
archiveOnDelete: false
|
archiveOnDelete: false
|
||||||
onDelete: delete
|
onDelete: delete
|
||||||
|
|
||||||
|
|
|
@ -9,24 +9,32 @@
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://kubernetes.github.io/ingress-nginx";
|
repo = "https://kubernetes.github.io/ingress-nginx";
|
||||||
chart = "ingress-nginx";
|
chart = "ingress-nginx";
|
||||||
version = "4.9.1";
|
version = "4.10.1";
|
||||||
sha256 = "sha256-EJjNTC7nQUbGnS0xgF/eWyKs3vBpRPbbZmwl/pd9/44=";
|
sha256 = "BHRoXG5EtJdCGkzy52brAtEcMEZP+WkNtfBf+cwpNbs=";
|
||||||
};
|
};
|
||||||
values = {
|
values = {
|
||||||
controller = {
|
controller = {
|
||||||
kind = "DaemonSet";
|
kind = "DaemonSet";
|
||||||
metrics = {
|
metrics = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
|
serviceMonitor.enabled = true;
|
||||||
additionalLabels.release = "prometheus";
|
additionalLabels.release = "prometheus";
|
||||||
};
|
};
|
||||||
podAnnotations = {
|
podAnnotations = {
|
||||||
"prometheus.io/scrape" = "true";
|
"prometheus.io/scrape" = "true";
|
||||||
"prometheus.io/port" = "10254";
|
"prometheus.io/port" = "10254";
|
||||||
};
|
};
|
||||||
|
tolerations = [
|
||||||
|
{
|
||||||
|
key = "node-role.kubernetes.io/control-plane";
|
||||||
|
effect = "NoSchedule";
|
||||||
|
}
|
||||||
|
];
|
||||||
ingressClassResource.default = true;
|
ingressClassResource.default = true;
|
||||||
publishService.enabled = true;
|
publishService.enabled = true;
|
||||||
service.externalTrafficPolicy = "Local";
|
service.externalTrafficPolicy = "Local";
|
||||||
hostNetwork = true;
|
hostNetwork = true;
|
||||||
|
extraArgs.default-ssl-certificate = "cert-manager/gmem-ca-wildcard";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,13 +2,15 @@ let
|
||||||
appName = "nitter-bot";
|
appName = "nitter-bot";
|
||||||
appImage = "git.gmem.ca/arch/nitter-bot:latest";
|
appImage = "git.gmem.ca/arch/nitter-bot:latest";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
config,
|
config,
|
||||||
kubenix,
|
kubenix,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.resources.statefulSets.nitter-bot.spec = {
|
kubernetes.resources.statefulSets.nitter-bot = {
|
||||||
|
metadata.namespace = "nitter";
|
||||||
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
serviceName = appName;
|
serviceName = appName;
|
||||||
template = {
|
template = {
|
||||||
|
@ -17,7 +19,8 @@ in
|
||||||
containers = {
|
containers = {
|
||||||
nitter-bot = {
|
nitter-bot = {
|
||||||
image = appImage;
|
image = appImage;
|
||||||
envFrom = [{secretRef.name = "nitter-bot";}];
|
envFrom = [{secretRef.name = "nitter-bot";}
|
||||||
|
{configMapRef.name = "nitter-bot";}];
|
||||||
resources = {
|
resources = {
|
||||||
requests = {
|
requests = {
|
||||||
cpu = "1m";
|
cpu = "1m";
|
||||||
|
@ -33,4 +36,13 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
|
kubernetes.resources.configMaps.nitter-bot = {
|
||||||
|
metadata.namespace = "nitter";
|
||||||
|
data = {
|
||||||
|
NITTER_URL = "http://nitter:8080";
|
||||||
|
NITTER_EXTERNAL_URL = "https://nitter.gmem.ca";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ in
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.resources.services.nitter = {
|
kubernetes.resources.services.nitter = {
|
||||||
|
metadata.namespace = "nitter";
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -21,7 +22,9 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.nitter.spec = {
|
kubernetes.resources.deployments.nitter = {
|
||||||
|
metadata.namespace = "nitter";
|
||||||
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
|
@ -68,8 +71,10 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
kubernetes.helm.releases.nitter-redis = {
|
kubernetes.helm.releases.nitter-redis = {
|
||||||
|
namespace = "nitter";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://charts.bitnami.com/bitnami";
|
repo = "https://charts.bitnami.com/bitnami";
|
||||||
chart = "redis";
|
chart = "redis";
|
||||||
|
@ -84,15 +89,15 @@ in
|
||||||
kubernetes.resources.ingresses.nitter = {
|
kubernetes.resources.ingresses.nitter = {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = appName;
|
name = appName;
|
||||||
|
namespace = "nitter";
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/issuer" = "le-issuer";
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["nitter.gmem.ca"];
|
hosts = ["nitter.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
|
@ -2,6 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
|
namespace: ntfy
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -35,6 +36,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
|
namespace: ntfy
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: ntfy
|
app: ntfy
|
||||||
|
@ -46,6 +48,7 @@ apiVersion: v1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
|
namespace: ntfy
|
||||||
data:
|
data:
|
||||||
server.yml: |
|
server.yml: |
|
||||||
# Template: https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
|
# Template: https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
|
||||||
|
@ -58,13 +61,12 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluster-issuer: "le-issuer"
|
||||||
namespace: default
|
namespace: ntfy
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- ntfy.gmem.ca
|
- ntfy.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
rules:
|
||||||
- host: ntfy.gmem.ca
|
- host: ntfy.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
let
|
let
|
||||||
appName = "overseerr";
|
appName = "jellyseerr";
|
||||||
appImage = "sctx/overseerr";
|
appImage = "git.gmem.ca/arch/jellyseerr:postgres";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services.overseerr = {
|
kubernetes.resources.services.jellyseerr = {
|
||||||
|
metadata.namespace = "jellyseerr";
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -11,62 +12,57 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.statefulSets.overseerr.spec = {
|
kubernetes.resources.deployments.jellyseerr = {
|
||||||
selector.matchLabels.app = appName;
|
metadata.namespace = "jellyseerr";
|
||||||
serviceName = appName;
|
spec = {
|
||||||
template = {
|
selector.matchLabels.app = appName;
|
||||||
metadata.labels.app = appName;
|
template = {
|
||||||
spec = {
|
metadata.labels.app = appName;
|
||||||
volumes = {
|
spec = {
|
||||||
config.configMap.name = "overseerr";
|
volumes = {
|
||||||
};
|
config.configMap.name = "jellyseerr";
|
||||||
containers = {
|
};
|
||||||
overseerr = {
|
containers = {
|
||||||
image = appImage;
|
jellyseerr = {
|
||||||
volumeMounts = [
|
image = appImage;
|
||||||
{
|
envFrom = [{secretRef.name = "jellyseerr";}
|
||||||
name = "data";
|
{configMapRef.name = "jellyseerr";}];
|
||||||
mountPath = "/app/config";
|
volumeMounts = [
|
||||||
}
|
{
|
||||||
];
|
name = "config";
|
||||||
ports.metrics.containerPort = 5055;
|
mountPath = "/app/config/settings.json";
|
||||||
resources = {
|
subPath = "settings.json";
|
||||||
requests = {
|
}
|
||||||
cpu = "500m";
|
];
|
||||||
memory = "128Mi";
|
ports.http.containerPort = 5055;
|
||||||
};
|
resources = {
|
||||||
limits = {
|
requests = {
|
||||||
cpu = "1";
|
cpu = "500m";
|
||||||
memory = "512Mi";
|
memory = "128Mi";
|
||||||
|
};
|
||||||
|
limits = {
|
||||||
|
cpu = "1";
|
||||||
|
memory = "512Mi";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
volumeClaimTemplates = [
|
|
||||||
{
|
|
||||||
metadata.name = "data";
|
|
||||||
spec = {
|
|
||||||
storageClassName = "nfs-client";
|
|
||||||
accessModes = ["ReadWriteOnce"];
|
|
||||||
resources.requests.storage = "1Gi";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
kubernetes.resources.ingresses.overseerr = {
|
kubernetes.resources.ingresses.jellyseerr = {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = appName;
|
name = appName;
|
||||||
|
namespace = "jellyseerr";
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/issuer" = "le-issuer";
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["request-media.gmem.ca"];
|
hosts = ["request-media.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.piped = {
|
kubernetes.helm.releases.piped = {
|
||||||
namespace = "default";
|
namespace = "piped";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://helm.piped.video";
|
repo = "https://helm.piped.video";
|
||||||
chart = "piped";
|
chart = "piped";
|
||||||
|
@ -25,13 +25,12 @@
|
||||||
password = "password";
|
password = "password";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
fontend.env.BACKEND_HOSTNAME = "pipedapi.gmem.ca";
|
frontend.env.BACKEND_HOSTNAME = "pipedapi.gmem.ca";
|
||||||
ingress = {
|
ingress = {
|
||||||
main = {
|
main = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["piped.gmem.ca"];
|
hosts = ["piped.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -45,7 +44,6 @@
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["pipedapi.gmem.ca"];
|
hosts = ["pipedapi.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -58,8 +56,7 @@
|
||||||
ytproxy = {
|
ytproxy = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["ytproxy.gmem.ca"];
|
hosts = ["pipedproxy.gmem.ca"];
|
||||||
secretName = "gmem-ca-wildcard";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -73,27 +70,30 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.cronJobs.piped-refresh.spec = {
|
kubernetes.resources.cronJobs.piped-refresh = {
|
||||||
|
metadata.namespace = "piped";
|
||||||
|
spec = {
|
||||||
schedule = "*/10 * * * *";
|
schedule = "*/10 * * * *";
|
||||||
jobTemplate.spec.template.spec = {
|
jobTemplate.spec.template.spec = {
|
||||||
restartPolicy = "Never";
|
restartPolicy = "Never";
|
||||||
containers.refresh-subscriptions = {
|
containers.refresh-subscriptions = {
|
||||||
image = "alpine:3.15";
|
image = "debian:bookworm-slim";
|
||||||
envFrom = [{secretRef.name = "hippo-pguser-piped";}];
|
envFrom = [{secretRef.name = "postgres-piped";}];
|
||||||
command = [
|
command = [
|
||||||
"/bin/ash"
|
"/bin/bash"
|
||||||
"-c"
|
"-c"
|
||||||
''
|
''
|
||||||
apk --no-cache add postgresql-client curl &&
|
apt update && apt install -y postgresql-client curl
|
||||||
export PGPASSWORD=$password &&
|
export PGPASSWORD=$password &&
|
||||||
export subs=$(psql -U piped -h hippo-primary.default.svc -qtAX -c 'select id from public.pubsub;') &&
|
export subs=$(psql -U piped -h 192.168.50.236 -qtAX -c 'select id from public.pubsub;') &&
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
echo "refreshing $line"
|
echo "refreshing $line"
|
||||||
curl -k -S -s -o /dev/null "https://pipedapi.gmem.ca/channel/$line"
|
curl -k -o /dev/null "http://piped-backend:8080/channel/$line"
|
||||||
done < <(printf '%s' "$subs")
|
done < <(printf '%s' "$subs")
|
||||||
''
|
''
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ spec:
|
||||||
name: init-sql
|
name: init-sql
|
||||||
instances:
|
instances:
|
||||||
- name: instance1
|
- name: instance1
|
||||||
replicas: 3
|
replicas: 1
|
||||||
dataVolumeClaimSpec:
|
dataVolumeClaimSpec:
|
||||||
accessModes:
|
accessModes:
|
||||||
- "ReadWriteOnce"
|
- "ReadWriteOnce"
|
||||||
|
|
|
@ -14,6 +14,13 @@ prometheus:
|
||||||
password:
|
password:
|
||||||
name: prometheus-remote-basic-auth
|
name: prometheus-remote-basic-auth
|
||||||
key: password
|
key: password
|
||||||
|
additionalScrapeConfigs:
|
||||||
|
- job_name: postgresql
|
||||||
|
scrape_interval: 15s
|
||||||
|
scrape_timeout: 10s
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- 192.168.50.236:9187
|
||||||
grafana:
|
grafana:
|
||||||
enabled: false
|
enabled: false
|
||||||
alertmanager:
|
alertmanager:
|
||||||
|
|
|
@ -53,7 +53,7 @@ data:
|
||||||
grpc_listen_port: 0
|
grpc_listen_port: 0
|
||||||
|
|
||||||
clients:
|
clients:
|
||||||
- url: http://monitoring:3030/loki/api/v1/push
|
- url: http://100.126.232.130:3030/loki/api/v1/push
|
||||||
|
|
||||||
positions:
|
positions:
|
||||||
filename: /tmp/positions.yaml
|
filename: /tmp/positions.yaml
|
||||||
|
@ -127,7 +127,7 @@ metadata:
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: promtail-serviceaccount
|
name: promtail-serviceaccount
|
||||||
namespace: default
|
namespace: promtail
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
name: promtail-clusterrole
|
name: promtail-clusterrole
|
||||||
|
|
149
homelab/snikket.nix
Normal file
149
homelab/snikket.nix
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
let
|
||||||
|
appName = "snikket";
|
||||||
|
snikketImage = "git.gmem.ca/arch/snikket-server:latest";
|
||||||
|
snikketPortalImage = "snikket/snikket-web-portal:stable";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
kubenix,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
kubernetes.resources.services.snikket = {
|
||||||
|
metadata.namespace = "snikket";
|
||||||
|
spec = {
|
||||||
|
selector.app = appName;
|
||||||
|
ports.http = {
|
||||||
|
port = 5280;
|
||||||
|
targetPort = 5280;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.services.snikket-xmpp = {
|
||||||
|
metadata.namespace = "snikket";
|
||||||
|
spec = {
|
||||||
|
type = "NodePort";
|
||||||
|
selector.app = appName;
|
||||||
|
ports.http = {
|
||||||
|
port = 5222;
|
||||||
|
targetPort = 5222;
|
||||||
|
nodePort = 5222;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.services.snikket-web-portal = {
|
||||||
|
metadata.namespace = "snikket";
|
||||||
|
spec = {
|
||||||
|
selector.app = appName + "-web-portal";
|
||||||
|
ports.http = {
|
||||||
|
port = 5765;
|
||||||
|
targetPort = 5765;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.deployments.snikket = {
|
||||||
|
metadata.namespace = "snikket";
|
||||||
|
spec = {
|
||||||
|
selector.matchLabels.app = appName;
|
||||||
|
template = {
|
||||||
|
metadata.labels.app = appName;
|
||||||
|
spec = {
|
||||||
|
containers = {
|
||||||
|
snikket = {
|
||||||
|
image = snikketImage;
|
||||||
|
env.SNIKKET_TWEAK_TURNSERVER.value = "0";
|
||||||
|
env.SNIKKET_TWEAK_INTERNAL_HTTP_INTERFACE.value = "0.0.0.0";
|
||||||
|
envFrom = [{configMapRef.name = "snikket";}];
|
||||||
|
imagePullPolicy = "Always";
|
||||||
|
volumeMounts = [
|
||||||
|
{
|
||||||
|
name = "certs";
|
||||||
|
mountPath = "/etc/prosody/certs/chat.gmem.ca.crt";
|
||||||
|
subPath = "tls.crt";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "certs";
|
||||||
|
mountPath = "/etc/prosody/certs/chat.gmem.ca.key";
|
||||||
|
subPath = "tls.key";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
ports.http.containerPort = 5280;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
volumes = {
|
||||||
|
certs.secret.secretName = "chat-gmem-ca";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.deployments.snikket-web-portal = {
|
||||||
|
metadata.namespace = "snikket";
|
||||||
|
spec = {
|
||||||
|
selector.matchLabels.app = appName + "-web-portal";
|
||||||
|
template = {
|
||||||
|
metadata.labels.app = appName + "-web-portal";
|
||||||
|
spec = {
|
||||||
|
containers = {
|
||||||
|
snikket = {
|
||||||
|
image = snikketPortalImage;
|
||||||
|
env.SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE.value = "0.0.0.0";
|
||||||
|
env.SNIKKET_WEB_PROSODY_ENDPOINT.value = "http://snikket:5280";
|
||||||
|
imagePullPolicy = "Always";
|
||||||
|
ports.http.containerPort = 5765;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.ingresses.snikket = {
|
||||||
|
metadata = {
|
||||||
|
name = appName;
|
||||||
|
namespace = "snikket";
|
||||||
|
annotations = {
|
||||||
|
"cert-manager.io/cluster-issuer" = "le-issuer";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
spec = {
|
||||||
|
tls = [
|
||||||
|
{
|
||||||
|
hosts = ["chat.gmem.ca"];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
host = "chat.gmem.ca";
|
||||||
|
http.paths = [
|
||||||
|
{
|
||||||
|
path = "/";
|
||||||
|
pathType = "Prefix";
|
||||||
|
backend.service = {
|
||||||
|
name = appName + "-web-portal";
|
||||||
|
port.name = "http";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]
|
||||||
|
++ lib.lists.forEach [
|
||||||
|
# Routes we want to hit Prosody's backend
|
||||||
|
"/admin_api"
|
||||||
|
"/invites_api"
|
||||||
|
"/invites_bootstrap"
|
||||||
|
"/upload"
|
||||||
|
"/http-bind"
|
||||||
|
"/xmpp-websocket"
|
||||||
|
"/.well-known/host-meta"
|
||||||
|
"/.well-known/host-meta.json"
|
||||||
|
] (path: {
|
||||||
|
path = path;
|
||||||
|
pathType = "Prefix";
|
||||||
|
backend.service = {
|
||||||
|
name = appName;
|
||||||
|
port.name = "http";
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,108 +1,50 @@
|
||||||
let
|
let
|
||||||
appName = "tclip";
|
appName = "tclip";
|
||||||
litestreamImage = "litestream/litestream:sha-749bc0d";
|
|
||||||
tclipImage = "git.gmem.ca/arch/tclip:arm";
|
tclipImage = "git.gmem.ca/arch/tclip:arm";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.tclip = {
|
kubernetes.resources.statefulSets.tclip = {
|
||||||
|
metadata.namespace = "tclip";
|
||||||
spec = {
|
spec = {
|
||||||
|
serviceName = appName;
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
endpoints = [
|
template = {
|
||||||
{
|
metadata.labels.app = appName;
|
||||||
port = "metrics";
|
spec = {
|
||||||
interval = "30s";
|
containers = {
|
||||||
}
|
tclip = {
|
||||||
];
|
image = tclipImage;
|
||||||
};
|
imagePullPolicy = "Always";
|
||||||
};
|
env = [
|
||||||
kubernetes.resources.services.tclip = {
|
{
|
||||||
metadata.labels.app = appName;
|
name = "DATA_DIR";
|
||||||
spec = {
|
value = "/state";
|
||||||
selector.app = appName;
|
}
|
||||||
ports.metrics = {
|
{
|
||||||
port = 9090;
|
name = "USE_FUNNEL";
|
||||||
targetPort = 9090;
|
value = "true";
|
||||||
};
|
}
|
||||||
};
|
];
|
||||||
};
|
envFrom = [{secretRef.name = "tclip";}];
|
||||||
kubernetes.resources.statefulSets.tclip.spec = {
|
volumeMounts = [
|
||||||
selector.matchLabels.app = appName;
|
{
|
||||||
serviceName = appName;
|
name = "state";
|
||||||
template = {
|
mountPath = "/state";
|
||||||
metadata.labels.app = appName;
|
}
|
||||||
spec = {
|
];
|
||||||
volumes = {
|
|
||||||
litestream.configMap.name = "tclip-litestream";
|
|
||||||
config.configMap.name = "tclip";
|
|
||||||
};
|
|
||||||
initContainers.init-litestream = {
|
|
||||||
image = litestreamImage;
|
|
||||||
args = ["restore" "-if-db-not-exists" "-if-replica-exists" "-v" "/data/data.db"];
|
|
||||||
volumeMounts = [
|
|
||||||
{
|
|
||||||
name = "data";
|
|
||||||
mountPath = "/data";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "litestream";
|
|
||||||
mountPath = "/etc/litestream.yml";
|
|
||||||
subPath = "tclip.yml";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
envFrom = [{secretRef.name = "tclip-litestream-s3";}];
|
|
||||||
};
|
|
||||||
containers = {
|
|
||||||
tclip = {
|
|
||||||
image = tclipImage;
|
|
||||||
imagePullPolicy = "Always";
|
|
||||||
volumeMounts = [
|
|
||||||
{
|
|
||||||
name = "data";
|
|
||||||
mountPath = "/data";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
env = [
|
|
||||||
{
|
|
||||||
name = "DATA_DIR";
|
|
||||||
value = "/data";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "USE_FUNNEL";
|
|
||||||
value = "true";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
litestream = {
|
|
||||||
image = litestreamImage;
|
|
||||||
args = ["replicate"];
|
|
||||||
volumeMounts = [
|
|
||||||
{
|
|
||||||
name = "data";
|
|
||||||
mountPath = "/data";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "litestream";
|
|
||||||
mountPath = "/etc/litestream.yml";
|
|
||||||
subPath = "tclip.yml";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
envFrom = [{secretRef.name = "tclip-litestream-s3";}];
|
|
||||||
ports.metrics = {
|
|
||||||
containerPort = 9090;
|
|
||||||
name = "metrics";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
volumeClaimTemplates = [
|
||||||
|
{
|
||||||
|
metadata.name = "state";
|
||||||
|
spec = {
|
||||||
|
storageClassName = "nfs-client";
|
||||||
|
accessModes = ["ReadWriteOnce"];
|
||||||
|
resources.requests.storage = "512Mi";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
volumeClaimTemplates = [
|
|
||||||
{
|
|
||||||
metadata.name = "data";
|
|
||||||
spec = {
|
|
||||||
storageClassName = "nfs-client";
|
|
||||||
accessModes = ["ReadWriteOnce"];
|
|
||||||
resources.requests.storage = "1Gi";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
|
namespace: it-tools
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -26,6 +27,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
|
namespace: it-tools
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: it-tools
|
app: it-tools
|
||||||
|
@ -37,15 +39,14 @@ apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
|
namespace: it-tools
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluster-issuer: "le-issuer"
|
||||||
nginx.ingress.kubernetes.io/proxy-body-size: 100m
|
nginx.ingress.kubernetes.io/proxy-body-size: 100m
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- tools.gmem.ca
|
- tools.gmem.ca
|
||||||
secretName: gmem-ca-wildcard
|
|
||||||
rules:
|
rules:
|
||||||
- host: tools.gmem.ca
|
- host: tools.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -1,90 +1,46 @@
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: StatefulSet
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
spec:
|
spec:
|
||||||
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: vaultwarden
|
app: vaultwarden
|
||||||
serviceName: vaultwarden
|
|
||||||
replicas: 1
|
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: vaultwarden
|
app: vaultwarden
|
||||||
spec:
|
spec:
|
||||||
volumes:
|
volumes:
|
||||||
- name: litestream
|
|
||||||
configMap:
|
|
||||||
name: vaultwarden-litestream
|
|
||||||
- name: config
|
- name: config
|
||||||
configMap:
|
configMap:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
initContainers:
|
- name: data
|
||||||
- name: init-litestream
|
emptyDir: {}
|
||||||
image: litestream/litestream:0.3.11
|
containers:
|
||||||
args: ['restore', '-if-db-not-exists', '-if-replica-exists', '-v', '/data/db.sqlite3']
|
- name: vaultwarden
|
||||||
volumeMounts:
|
image: docker.io/vaultwarden/server:testing
|
||||||
- name: data
|
imagePullPolicy: Always
|
||||||
mountPath: /data
|
resources:
|
||||||
- name: litestream
|
limits:
|
||||||
mountPath: /etc/litestream.yml
|
memory: "128Mi"
|
||||||
subPath: vaultwarden.yml
|
cpu: "500m"
|
||||||
|
requests:
|
||||||
|
memory: "64Mi"
|
||||||
|
cpu: "100m"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: vaultwarden-litestream-s3
|
name: vaultwarden
|
||||||
containers:
|
ports:
|
||||||
- name: vaultwarden
|
- containerPort: 80
|
||||||
image: docker.io/vaultwarden/server:testing
|
name: web
|
||||||
imagePullPolicy: Always
|
volumeMounts:
|
||||||
resources:
|
- name: data
|
||||||
limits:
|
mountPath: /data
|
||||||
memory: "128Mi"
|
- name: config
|
||||||
cpu: "500m"
|
mountPath: /data/config.json
|
||||||
requests:
|
subPath: vaultwarden.json
|
||||||
memory: "64Mi"
|
|
||||||
cpu: "100m"
|
|
||||||
ports:
|
|
||||||
- containerPort: 80
|
|
||||||
name: web
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /data
|
|
||||||
- name: config
|
|
||||||
mountPath: /data/config.json
|
|
||||||
subPath: vaultwarden.json
|
|
||||||
- name: litestream
|
|
||||||
image: litestream/litestream:0.3.11
|
|
||||||
args: ['replicate']
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /data
|
|
||||||
- name: litestream
|
|
||||||
mountPath: /etc/litestream.yml
|
|
||||||
subPath: vaultwarden.yml
|
|
||||||
envFrom:
|
|
||||||
- secretRef:
|
|
||||||
name: vaultwarden-litestream-s3
|
|
||||||
ports:
|
|
||||||
- name: metrics
|
|
||||||
containerPort: 9090
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "128Mi"
|
|
||||||
cpu: "300m"
|
|
||||||
requests:
|
|
||||||
memory: "64Mi"
|
|
||||||
cpu: "100m"
|
|
||||||
|
|
||||||
volumeClaimTemplates:
|
|
||||||
- metadata:
|
|
||||||
name: data
|
|
||||||
spec:
|
|
||||||
storageClassName: nfs-client
|
|
||||||
accessModes: [ "ReadWriteOnce" ]
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 1Gi
|
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
|
@ -99,31 +55,13 @@ spec:
|
||||||
- port: 80
|
- port: 80
|
||||||
targetPort: 80
|
targetPort: 80
|
||||||
name: web
|
name: web
|
||||||
- port: 9090
|
|
||||||
targetPort: 9090
|
|
||||||
name: metrics
|
|
||||||
---
|
|
||||||
apiVersion: monitoring.coreos.com/v1
|
|
||||||
kind: ServiceMonitor
|
|
||||||
metadata:
|
|
||||||
name: vaultwarden
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: vaultwarden
|
|
||||||
endpoints:
|
|
||||||
- port: metrics
|
|
||||||
interval: 30s
|
|
||||||
---
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/issuer: "le-issuer"
|
cert-manager.io/cluser-issuer: "le-issuer"
|
||||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
|
||||||
more_set_headers "X-Forwarded-For $http_x_forwarded_for";
|
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
|
|
|
@ -3,6 +3,7 @@ let
|
||||||
appImage = "git.gmem.ca/arch/vrchat-prometheus-adapter:arm";
|
appImage = "git.gmem.ca/arch/vrchat-prometheus-adapter:arm";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.vrchat-prometheus-adapter = {
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.vrchat-prometheus-adapter = {
|
||||||
|
metadata.namespace = "vrchat";
|
||||||
spec = {
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
endpoints = [
|
endpoints = [
|
||||||
|
@ -14,6 +15,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.vrchat-prometheus-adapter = {
|
kubernetes.resources.services.vrchat-prometheus-adapter = {
|
||||||
|
metadata.namespace = "vrchat";
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
|
@ -23,35 +25,38 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.vrchat-prometheus-adapter.spec = {
|
kubernetes.resources.deployments.vrchat-prometheus-adapter = {
|
||||||
selector.matchLabels.app = appName;
|
metadata.namespace = "vrchat";
|
||||||
template = {
|
spec = {
|
||||||
metadata.labels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
spec = {
|
template = {
|
||||||
volumes = {
|
metadata.labels.app = appName;
|
||||||
config.configMap.name = "vrchat-prometheus-adapter";
|
spec = {
|
||||||
};
|
volumes = {
|
||||||
containers = {
|
config.configMap.name = "vrchat-prometheus-adapter";
|
||||||
vrchat-prometheus-adapter = {
|
};
|
||||||
image = appImage;
|
containers = {
|
||||||
imagePullPolicy = "Always";
|
vrchat-prometheus-adapter = {
|
||||||
volumeMounts = [
|
image = appImage;
|
||||||
{
|
imagePullPolicy = "Always";
|
||||||
name = "config";
|
volumeMounts = [
|
||||||
mountPath = "/config.toml";
|
{
|
||||||
subPath = "config.toml";
|
name = "config";
|
||||||
}
|
mountPath = "/config.toml";
|
||||||
];
|
subPath = "config.toml";
|
||||||
envFrom = [{secretRef.name = "vrchat-prometheus-adapter";}];
|
}
|
||||||
ports.metrics.containerPort = 6534;
|
];
|
||||||
resources = {
|
envFrom = [{secretRef.name = "vrchat-prometheus-adapter";}];
|
||||||
requests = {
|
ports.metrics.containerPort = 6534;
|
||||||
cpu = "50m";
|
resources = {
|
||||||
memory = "32Mi";
|
requests = {
|
||||||
};
|
cpu = "50m";
|
||||||
limits = {
|
memory = "32Mi";
|
||||||
cpu = "500m";
|
};
|
||||||
memory = "256Mi";
|
limits = {
|
||||||
|
cpu = "500m";
|
||||||
|
memory = "256Mi";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue