Migrate all app deployments from Terraform to Argo CD

Move gitea, github-runner, neuron, cloudflared, ollama, verdaccio,
devpi, registry, and registry-ui deployments+services to apps/*.yaml
so Argo CD manages the app layer. Terraform retains namespaces, PVCs,
ConfigMaps, Secrets, and Ingresses.

New Secrets in Terraform:
- kubernetes_secret.github_runner_secret (ci/github-runner-secret)
- kubernetes_secret.cloudflared_secret (neuron/cloudflared-secret)

Hardcoded service names in ingress.tf and neuron.tf to remove
dependency on removed kubernetes_service resources.
This commit is contained in:
Will Anderson
2026-03-23 08:15:17 -05:00
parent b2b04c231c
commit afe01d2ad9
13 changed files with 588 additions and 885 deletions
+7 -214
View File
@@ -81,157 +81,15 @@ resource "kubernetes_secret" "neuron_secrets" {
}
}
resource "kubernetes_deployment" "neuron" {
# Deployment + Service + cloudflared managed by Argo CD — see servers/legion/apps/neuron.yaml
resource "kubernetes_secret" "cloudflared_secret" {
metadata {
name = "neuron"
namespace = kubernetes_namespace.neuron.metadata[0].name
labels = {
app = "neuron"
}
}
spec {
replicas = 1
strategy {
type = "Recreate" # SQLite cannot handle concurrent writers
}
selector {
match_labels = {
app = "neuron"
}
}
template {
metadata {
labels = {
app = "neuron"
}
}
spec {
container {
name = "neuron"
image = "registry.nook.family/neural-platform/neuron:latest"
image_pull_policy = "Always"
command = [
"bash", "-c",
"mkdir -p /root/.neuron && ln -sf /data/neuron.db /root/.neuron/neuron.db && python -m synapse platform serve --mcp-host 0.0.0.0 --mcp-port 8001 --webhook-port 3847"
]
port {
name = "mcp"
container_port = 8001
}
port {
name = "webhook"
container_port = 3847
}
env_from {
config_map_ref {
name = kubernetes_config_map.neuron_config.metadata[0].name
}
}
env_from {
secret_ref {
name = kubernetes_secret.neuron_secrets.metadata[0].name
}
}
volume_mount {
name = "data"
mount_path = "/data"
}
volume_mount {
name = "app-config"
mount_path = "/app/config/default.yaml"
sub_path = "default.yaml"
}
resources {
requests = {
memory = "256Mi"
cpu = "100m"
}
limits = {
memory = "1Gi"
cpu = "500m"
}
}
liveness_probe {
http_get {
path = "/health"
port = "mcp"
}
initial_delay_seconds = 10
period_seconds = 30
}
readiness_probe {
http_get {
path = "/health"
port = "mcp"
}
initial_delay_seconds = 5
period_seconds = 10
}
}
volume {
name = "data"
persistent_volume_claim {
claim_name = kubernetes_persistent_volume_claim.neuron_data.metadata[0].name
}
}
volume {
name = "app-config"
config_map {
name = kubernetes_config_map.neuron_config.metadata[0].name
items {
key = "default.yaml"
path = "default.yaml"
}
}
}
}
}
}
depends_on = [kubernetes_persistent_volume_claim.neuron_data]
}
resource "kubernetes_service" "neuron" {
metadata {
name = "neuron"
name = "cloudflared-secret"
namespace = kubernetes_namespace.neuron.metadata[0].name
}
spec {
selector = {
app = "neuron"
}
port {
name = "mcp"
port = 8001
target_port = 8001
}
port {
name = "webhook"
port = 3847
target_port = 3847
}
type = "ClusterIP"
data = {
TUNNEL_TOKEN = var.cloudflared_tunnel_token
}
}
@@ -262,7 +120,7 @@ resource "kubernetes_ingress_v1" "neuron" {
path_type = "Prefix"
backend {
service {
name = kubernetes_service.neuron.metadata[0].name
name = "neuron"
port {
number = 8001
}
@@ -276,68 +134,3 @@ resource "kubernetes_ingress_v1" "neuron" {
depends_on = [helm_release.cert_manager]
}
# cloudflared — Cloudflare tunnel for external access to Axon webhooks
# Routes: axon.neuralplatform.ai → neuron:3847
# webhooks.neuralplatform.ai → neuron:3847
resource "kubernetes_deployment" "cloudflared" {
metadata {
name = "cloudflared"
namespace = kubernetes_namespace.neuron.metadata[0].name
labels = {
app = "cloudflared"
}
}
spec {
replicas = 1
selector {
match_labels = {
app = "cloudflared"
}
}
template {
metadata {
labels = {
app = "cloudflared"
}
}
spec {
container {
name = "cloudflared"
image = "cloudflare/cloudflared:latest"
args = ["tunnel", "--no-autoupdate", "run"]
env {
name = "TUNNEL_TOKEN"
value = var.cloudflared_tunnel_token
}
resources {
requests = {
memory = "64Mi"
cpu = "50m"
}
limits = {
memory = "128Mi"
cpu = "200m"
}
}
liveness_probe {
http_get {
path = "/ready"
port = 20241
}
initial_delay_seconds = 10
period_seconds = 30
}
}
}
}
}
depends_on = [kubernetes_deployment.neuron]
}