Compare commits
126 Commits
8f0d73946f
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 44246cc4c1 | |||
|
28e5bf90b5
|
|||
| 7f65b1baef | |||
|
4fab22f7f1
|
|||
|
5796307f10
|
|||
|
e3858b302e
|
|||
| b3a093d67d | |||
| c82138d4fe | |||
|
0d8af53572
|
|||
|
79751e2e7f
|
|||
|
28ceaa11be
|
|||
| 18eb6ac82f | |||
|
01fbbcef02
|
|||
| dbf5e02807 | |||
|
379b2d9a2a
|
|||
| 9248d4c35a | |||
|
2f5c7b4c07
|
|||
| 74b24988be | |||
|
2dd4502409
|
|||
| 774cab3173 | |||
|
abeaf0c881
|
|||
| 7e57724ef8 | |||
|
1040199d45
|
|||
| caae6992ee | |||
|
5fcedff675
|
|||
| 88f65aeb67 | |||
|
49f29523c4
|
|||
| c75c56d28e | |||
|
29fa53acc1
|
|||
| 3e48ae6c4d | |||
|
2b4dbac471
|
|||
| ac95705df1 | |||
|
0ae3340140
|
|||
| 2427a823f4 | |||
|
127fdd54cf
|
|||
| 8df1305679 | |||
|
76f9c2e25c
|
|||
| 678e9381bd | |||
|
3966901b75
|
|||
| 8543e4b41f | |||
|
7a85ea4c23
|
|||
| 4eda2129f1 | |||
|
cdc4c39728
|
|||
| e46107ad02 | |||
|
0121927f26
|
|||
| eef0b13ab0 | |||
|
8c30536293
|
|||
| 841bd52da9 | |||
|
51e03a6e08
|
|||
| 6a0074676d | |||
|
dbf1380515
|
|||
| 2504e99cc8 | |||
| c50417c3da | |||
|
50b4f42a6e
|
|||
|
cd32ebd7c9
|
|||
| 3e655ae613 | |||
|
5bd1cdc714
|
|||
| 06e85aac5c | |||
|
dca946aadd
|
|||
| 0627c8d8d5 | |||
|
010eeaf903
|
|||
| 623d9a088e | |||
|
4da51ca17a
|
|||
| f8b3b81e83 | |||
|
30a8e59e35
|
|||
| 5172c5c265 | |||
|
0f638ce01a
|
|||
| 2f495c5cc5 | |||
|
29dab2f81e
|
|||
| c03fb7ffdc | |||
|
9fb678612a
|
|||
| 5ee7466152 | |||
|
452674709a
|
|||
|
99ec607e6d
|
|||
| 96424b124c | |||
|
96937cd358
|
|||
|
373823e565
|
|||
|
d36dd7735f
|
|||
|
1a0aeb0e64
|
|||
|
e6e63b5b2c
|
|||
|
0fcb071122
|
|||
|
e0f4fc71af
|
|||
|
e747bbe519
|
|||
| 067c3cbc59 | |||
| 27fcdd6bac | |||
|
67a7c32675
|
|||
|
c352c07f7b
|
|||
|
3397d80865
|
|||
|
39548b9b31
|
|||
|
9b75b8d4bf
|
|||
|
8d29dd8bd1
|
|||
| 4090830d95 | |||
|
21790a5a41
|
|||
|
4ab5ecdd6f
|
|||
|
c11f7897d7
|
|||
|
8839dd6eb1
|
|||
|
cc57178974
|
|||
| 3d95158244 | |||
|
141f05c6ae
|
|||
|
3651f23c72
|
|||
|
b4cbbd97a6
|
|||
| ede26d9c1d | |||
|
cc14ef66ed
|
|||
|
35b3f6cc42
|
|||
|
033a3b95ad
|
|||
|
f90060e366
|
|||
| 1f074a7087 | |||
|
c6cf3b7d84
|
|||
|
e611c68342
|
|||
|
d828d88078
|
|||
|
8fa00efc16
|
|||
|
fbe2274182
|
|||
|
bf4985040a
|
|||
|
ce3a367ec9
|
|||
|
6006e75db9
|
|||
| db590d1d2c | |||
|
7b6f92646f
|
|||
|
6bbd9748a2
|
|||
|
b22ff17c1d
|
|||
|
96900bea0c
|
|||
|
0f84c335de
|
|||
|
5e1b5dc007
|
|||
| f0f1b45c93 | |||
| 46c4e7b50f | |||
|
dbba05d7b6
|
|||
|
db9aa7c99d
|
@@ -0,0 +1,37 @@
|
|||||||
|
# Main Infrastructure: weyma-talos
|
||||||
|
|
||||||
|
**Production Kubernetes infrastructure with disaster recovery capabilities**
|
||||||
|
|
||||||
|
This repository contains the foundational infrastructure for my Kubernetes homelab, designed with reliability and rapid recovery as core principles.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
My infrastructure follows a layered "black start" approach - essential services run outside the Kubernetes cluster to enable cluster bootstrapping and recovery from total failures.
|
||||||
|
|
||||||
|
### Black Start Layer
|
||||||
|
Static services (Docker Compose on TrueNAS/Proxmox) that provide cluster dependencies:
|
||||||
|
- Image cache for faster deployments and offline capability
|
||||||
|
- Talos discovery server for node bootstrapping
|
||||||
|
- HashiCorp Vault for secrets management (external to cluster)
|
||||||
|
- Future: Self-hosted Sidero Omni server (migrating from SaaS)
|
||||||
|
|
||||||
|
### System Apps Layer
|
||||||
|
Applications running within Kubernetes that provide core cluster functionality, managed via ArgoCD with GitOps principles.
|
||||||
|
|
||||||
|
## Repository Structure
|
||||||
|
|
||||||
|
- **`black-start/`** - Docker Compose services for cluster dependencies
|
||||||
|
- **`config-patches/`** - Talos Linux configuration patches for cluster and individual machines
|
||||||
|
- **`omni/`** - Sidero Omni [cluster template](https://docs.siderolabs.com/omni/reference/cluster-templates)
|
||||||
|
- **`system-apps/`** - System applications (ArgoCD projects) - monitoring, ingress, certificates, storage
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
**OS:** Talos Linux | **Orchestration:** Kubernetes | **GitOps:** ArgoCD | **Secrets:** Vault | **Storage:** Rook-Ceph
|
||||||
|
|
||||||
|
## Recovery Process
|
||||||
|
|
||||||
|
The "black start" architecture enables ~15-20 minute automated recovery from complete infrastructure failure:
|
||||||
|
1. Start black-start services → 2. Bootstrap Talos → 3. Deploy system apps → 4. Deploy core apps
|
||||||
|
|
||||||
|
For application deployments, see [core-apps](https://git.dubyatp.xyz/core-apps).
|
||||||
@@ -2,7 +2,7 @@ version: "3.8"
|
|||||||
services:
|
services:
|
||||||
discovery:
|
discovery:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
image: ghcr.io/siderolabs/discovery-service:v1.0.13
|
image: ghcr.io/siderolabs/discovery-service:v1.0.17
|
||||||
ports:
|
ports:
|
||||||
- 10.105.6.215:3000:3000
|
- 10.105.6.215:3000:3000
|
||||||
- 10.105.6.215:3001:3001
|
- 10.105.6.215:3001:3001
|
||||||
@@ -5,7 +5,7 @@ services:
|
|||||||
command: tunnel run weyma-vault
|
command: tunnel run weyma-vault
|
||||||
env_file: ".env"
|
env_file: ".env"
|
||||||
vault:
|
vault:
|
||||||
image: hashicorp/vault:1.21
|
image: hashicorp/vault:2.0
|
||||||
env_file: ".env.vault"
|
env_file: ".env.vault"
|
||||||
environment:
|
environment:
|
||||||
VAULT_ADDR: "https://weyma-vault.infra.dubyatp.xyz:8200"
|
VAULT_ADDR: "https://weyma-vault.infra.dubyatp.xyz:8200"
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ patches:
|
|||||||
bind-address: 0.0.0.0
|
bind-address: 0.0.0.0
|
||||||
proxy:
|
proxy:
|
||||||
extraArgs:
|
extraArgs:
|
||||||
|
proxy-mode: ipvs
|
||||||
metrics-bind-address: 0.0.0.0:10249
|
metrics-bind-address: 0.0.0.0:10249
|
||||||
scheduler:
|
scheduler:
|
||||||
extraArgs:
|
extraArgs:
|
||||||
|
|||||||
+3
-4
@@ -15,10 +15,9 @@
|
|||||||
],
|
],
|
||||||
"packageRules": [
|
"packageRules": [
|
||||||
{
|
{
|
||||||
"description": "Automerge patch updates",
|
"description": "Consolidate patch and minor updates to one PR",
|
||||||
"matchUpdateTypes": ["patch"],
|
"matchUpdateTypes": ["minor", "patch"],
|
||||||
"matchCurrentVersion": "!/^0/",
|
"groupName": "all-minor-patch-updates"
|
||||||
"automerge": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Rook Ceph - auto-update minor and patch versions only",
|
"description": "Rook Ceph - auto-update minor and patch versions only",
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: argo-cd
|
- name: argo-cd
|
||||||
version: 9.4.1
|
version: 9.5.4
|
||||||
repository: https://argoproj.github.io/argo-helm
|
repository: https://argoproj.github.io/argo-helm
|
||||||
@@ -131,6 +131,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: admin.password
|
- secretKey: admin.password
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd
|
key: argo-cd
|
||||||
@@ -138,6 +139,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: admin.passwordMtime
|
- secretKey: admin.passwordMtime
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd
|
key: argo-cd
|
||||||
@@ -145,6 +147,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: dex.authentik.clientSecret
|
- secretKey: dex.authentik.clientSecret
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd
|
key: argo-cd
|
||||||
@@ -152,6 +155,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- apiVersion: external-secrets.io/v1
|
- apiVersion: external-secrets.io/v1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
@@ -175,6 +179,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: type
|
- secretKey: type
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -182,6 +187,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: url
|
- secretKey: url
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -189,6 +195,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- apiVersion: external-secrets.io/v1
|
- apiVersion: external-secrets.io/v1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
@@ -212,6 +219,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: type
|
- secretKey: type
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -219,6 +227,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: url
|
- secretKey: url
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -226,6 +235,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- apiVersion: external-secrets.io/v1
|
- apiVersion: external-secrets.io/v1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
@@ -249,6 +259,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: type
|
- secretKey: type
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -256,6 +267,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: url
|
- secretKey: url
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -263,6 +275,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- apiVersion: external-secrets.io/v1
|
- apiVersion: external-secrets.io/v1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
@@ -286,6 +299,7 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: type
|
- secretKey: type
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
@@ -293,10 +307,12 @@ argo-cd:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
- secretKey: url
|
- secretKey: url
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: argo-cd-git
|
key: argo-cd-git
|
||||||
property: url.db-operators
|
property: url.db-operators
|
||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: cert-manager
|
- name: cert-manager
|
||||||
version: v1.19.3
|
version: v1.20.2
|
||||||
repository: https://charts.jetstack.io
|
repository: https://charts.jetstack.io
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: external-secrets
|
- name: external-secrets
|
||||||
version: 1.3.2
|
version: 2.3.0
|
||||||
repository: https://charts.external-secrets.io
|
repository: https://charts.external-secrets.io
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: kite
|
- name: kite
|
||||||
version: 0.7.8
|
version: 0.10.0
|
||||||
repository: https://zxh326.github.io/kite
|
repository: https://zxh326.github.io/kite
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: kubernetes-replicator
|
- name: kubernetes-replicator
|
||||||
version: 2.12.2
|
version: 2.12.3
|
||||||
repository: https://helm.mittwald.de
|
repository: https://helm.mittwald.de
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: kube-prometheus-stack
|
- name: kube-prometheus-stack
|
||||||
version: 81.5.0
|
version: 83.7.0
|
||||||
repository: https://prometheus-community.github.io/helm-charts
|
repository: https://prometheus-community.github.io/helm-charts
|
||||||
@@ -17,5 +17,6 @@ spec:
|
|||||||
conversionStrategy: Default
|
conversionStrategy: Default
|
||||||
decodingStrategy: None
|
decodingStrategy: None
|
||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
|
nullBytePolicy: Ignore
|
||||||
key: monitoring
|
key: monitoring
|
||||||
property: discord_webhook
|
property: discord_webhook
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: rook-ceph
|
- name: rook-ceph
|
||||||
version: v1.19.1
|
version: v1.19.4
|
||||||
repository: https://charts.rook.io/release
|
repository: https://charts.rook.io/release
|
||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: traefik
|
- name: traefik
|
||||||
version: 39.0.0
|
version: 39.0.8
|
||||||
repository: https://traefik.github.io/charts
|
repository: https://traefik.github.io/charts
|
||||||
@@ -37,7 +37,7 @@ traefik:
|
|||||||
kind: DaemonSet
|
kind: DaemonSet
|
||||||
additionalContainers:
|
additionalContainers:
|
||||||
- name: cloudflared
|
- name: cloudflared
|
||||||
image: cloudflare/cloudflared:2026.1.2
|
image: cloudflare/cloudflared:2026.3.0
|
||||||
command:
|
command:
|
||||||
- cloudflared
|
- cloudflared
|
||||||
- tunnel
|
- tunnel
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ appVersion: "1.0"
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: velero
|
- name: velero
|
||||||
version: 11.3.2
|
version: 12.0.0
|
||||||
repository: https://vmware-tanzu.github.io/helm-charts
|
repository: https://vmware-tanzu.github.io/helm-charts
|
||||||
@@ -59,7 +59,7 @@ velero:
|
|||||||
insecureSkipTLSVerify: "true"
|
insecureSkipTLSVerify: "true"
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: velero-plugin-for-aws
|
- name: velero-plugin-for-aws
|
||||||
image: velero/velero-plugin-for-aws:v1.13.2
|
image: velero/velero-plugin-for-aws:v1.14.0
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- mountPath: /target
|
- mountPath: /target
|
||||||
|
|||||||
Reference in New Issue
Block a user