# Local Docker Registry — push images locally, no DockerHub resource "kubernetes_namespace" "registry" { metadata { name = "registry" labels = { managed-by = "terraform" tier = "infrastructure" } } } resource "kubernetes_persistent_volume_claim" "registry_data" { metadata { name = "registry-data" namespace = kubernetes_namespace.registry.metadata[0].name } spec { access_modes = ["ReadWriteOnce"] resources { requests = { storage = "50Gi" } } } } resource "kubernetes_deployment" "registry" { metadata { name = "registry" namespace = kubernetes_namespace.registry.metadata[0].name labels = { app = "registry" } } spec { replicas = 1 selector { match_labels = { app = "registry" } } template { metadata { labels = { app = "registry" } } spec { container { name = "registry" image = "registry:2" port { container_port = 5000 } volume_mount { name = "data" mount_path = "/var/lib/registry" } resources { requests = { memory = "64Mi" cpu = "50m" } limits = { memory = "256Mi" cpu = "200m" } } } volume { name = "data" persistent_volume_claim { claim_name = kubernetes_persistent_volume_claim.registry_data.metadata[0].name } } } } } } resource "kubernetes_service" "registry" { metadata { name = "registry" namespace = kubernetes_namespace.registry.metadata[0].name } spec { selector = { app = "registry" } port { port = 5000 target_port = 5000 } type = "ClusterIP" } } # Docker Registry UI — browse images and tags visually resource "kubernetes_deployment" "registry_ui" { metadata { name = "registry-ui" namespace = kubernetes_namespace.registry.metadata[0].name labels = { app = "registry-ui" } } spec { replicas = 1 selector { match_labels = { app = "registry-ui" } } template { metadata { labels = { app = "registry-ui" } } spec { container { name = "registry-ui" image = "joxit/docker-registry-ui:latest" port { container_port = 80 } env { name = "REGISTRY_TITLE" value = "Nook Registry" } env { name = "NGINX_PROXY_PASS_URL" value = "http://registry:5000" } env { name = "SINGLE_REGISTRY" value = "true" } env { name = "SHOW_CONTENT_DIGEST" value = "true" } env { name = "DELETE_IMAGES" value = "true" } resources { requests = { memory = "32Mi" cpu = "20m" } limits = { memory = "64Mi" cpu = "100m" } } } } } } } resource "kubernetes_service" "registry_ui" { metadata { name = "registry-ui" namespace = kubernetes_namespace.registry.metadata[0].name } spec { selector = { app = "registry-ui" } port { port = 80 target_port = 80 } type = "ClusterIP" } }