intial import
Some checks failed
Talos Platform Deploy / deploy (push) Failing after 8s

This commit is contained in:
root 2026-11-08 02:25:56 +01:00
commit e316ea92f8
5 changed files with 155 additions and 0 deletions

23
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,23 @@
name: Talos Platform Deploy
on:
push:
branches: [ "main" ]
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
container: catthehacker/ubuntu:act-latest
steps:
- uses: actions/checkout@v4
- name: Prepare Kubernetes Access (Talos)
run: |
echo "${{ secrets.KUBECONFIG_TALOS }}" > ./talos_kubeconfig
chmod 600 ./talos_kubeconfig
- name: Terraform Deploy
run: |
terraform init
terraform apply -auto-approve

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.terraform/
talos_kubeconfig
*.tfstate*

104
main.tf Normal file
View file

@ -0,0 +1,104 @@
# talos-platform – gemeinsame Cluster-Dienste für Produktion (Talos)
# Hier liegt alles, was ALLE Apps brauchen. Apps (boday_tf, ...) bringen nur ihr eigenes Chart mit.
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.26"
}
helm = {
source = "hashicorp/helm"
version = "~> 2.12"
}
}
backend "consul" {
address = "consul:8500"
path = "terraform/states/talos_platform"
}
}
variable "kubeconfig_path" {
type = string
default = "./talos_kubeconfig"
}
# Version des Traefik-Helm-Charts (traefik/traefik). Bewusst pinnen, damit Updates geplant passieren.
variable "traefik_chart_version" {
type = string
}
provider "kubernetes" {
config_path = var.kubeconfig_path
}
provider "helm" {
kubernetes {
config_path = var.kubeconfig_path
}
}
# Feste IP für Traefik aus dem MetalLB-Pool. Auf diese IP zeigt das OPNsense-Portforwarding (80/443).
variable "traefik_lb_ip" {
type = string
}
# Kein hostPort mehr -> der Talos-Standard (PSA "baseline") reicht
resource "kubernetes_namespace" "traefik" {
metadata {
name = "traefik"
}
}
# Traefik hinter einem MetalLB-LoadBalancer: VIP wandert bei Node-Ausfall auf den anderen Node
resource "helm_release" "traefik" {
name = "traefik"
repository = "https://traefik.github.io/charts"
chart = "traefik"
version = var.traefik_chart_version
namespace = kubernetes_namespace.traefik.metadata[0].name
values = [yamlencode({
deployment = { replicas = 2 }
# Je ein Pod pro Node
topologySpreadConstraints = [{
maxSkew = 1
topologyKey = "kubernetes.io/hostname"
whenUnsatisfiable = "DoNotSchedule"
labelSelector = {
matchLabels = {
"app.kubernetes.io/name" = "traefik"
"app.kubernetes.io/instance" = "traefik-traefik"
}
}
}]
service = {
type = "LoadBalancer"
annotations = {
"metallb.io/loadBalancerIPs" = var.traefik_lb_ip
}
spec = {
# Echte Client-IP bleibt erhalten (Django-Logs, CrowdSec)
externalTrafficPolicy = "Local"
}
}
ingressClass = {
enabled = true
isDefaultClass = true
name = "traefik"
}
providers = {
kubernetesIngress = { enabled = true }
kubernetesCRD = { enabled = true }
}
})]
}
output "traefik_lb_ip" {
value = var.traefik_lb_ip
}

22
talos/registry-patch.yaml Normal file
View file

@ -0,0 +1,22 @@
# Talos Machine-Config-Patch: Images aus registry.local (Forgejo-Registry hinter nginx, self-signed) ziehen
#
# Anwenden (pro Node, kein Reboot nötig):
# talosctl patch machineconfig --nodes 172.25.64.74 --patch @talos/registry-patch.yaml
#
# <REGISTRY_IP> = IP des nginx vor der Forgejo-Registry
# <CA_BASE64> = base64 -w0 nginx_ssl/nginx.crt
machine:
network:
extraHostEntries:
- ip: <REGISTRY_IP>
aliases:
- registry.local
registries:
mirrors:
registry.local:
endpoints:
- https://registry.local
config:
registry.local:
tls:
ca: <CA_BASE64>

3
terraform.tfvars Normal file
View file

@ -0,0 +1,3 @@
kubeconfig_path = "./talos_kubeconfig"
traefik_chart_version = "CHANGE_ME" # aktuelle Version: helm search repo traefik/traefik
traefik_lb_ip = "172.25.64.CHANGE" # freie IP aus deinem MetalLB-IPAddressPool