> ## Documentation Index
> Fetch the complete documentation index at: https://enterprise-docs.crewai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Internal Container Registry Configuration

> Optional Docker registry v2 deployment for container image storage and distribution. Particularly useful for air-gapped environments or when building and deploying custom crew images.

<Warning>
  The internal registry is **not recommended** as a primary
  registry. It's recommended to use an external container registry (AWS ECR,
  Azure ACR, Google Artifact Registry, Harbor, etc.) for production deployments.
</Warning>

<ParamField path="internalRegistry.enabled" type="boolean" default="false">
  Enable or disable the internal container registry deployment.

  **Use Cases:**

  * Air-gapped deployments without external registry access
  * Development/testing environments
  * Pull-through cache for external registries
  * Storing custom crew container images
</ParamField>

<ParamField path="internalRegistry.replicaCount" type="integer" default="1">
  Number of registry replicas to deploy.

  **High Availability:** For production-like environments, deploy 2+ replicas with shared storage (S3 backend).
</ParamField>

### `internalRegistry.image.*`

Registry container image configuration.

<ParamField path="internalRegistry.image.host" type="string" default="">
  Container registry hosting the registry image.

  **Default:** `""` (empty) - Automatically uses `global.imageRegistry` value

  **Fallback Behavior:**

  When `internalRegistry.image.host` is empty or not set, the chart uses `global.imageRegistry` via the `crewai-platform.internalRegistryImageRegistry` template helper.

  **When imageNamePrefixOverride is Set:**

  The image name is automatically simplified:

  * Original: `proxy/crewai/dockerhub/library/registry`
  * With `imageNamePrefixOverride: "crewai/"` becomes: `crewai/registry`

  See [global.imageNamePrefixOverride](/reference/chart-values/global#param-global-image-name-prefix-override) for details.

  **Example:**

  ```yaml theme={null}
  global:
    imageRegistry: "registry.company.com"

  internalRegistry:
    enabled: true
    image:
      host: "" # Automatically uses registry.company.com
      name: "proxy/crewai/dockerhub/library/registry"
      tag: "2"
  ```
</ParamField>

<ParamField path="internalRegistry.image.name" type="string" default="proxy/crewai/dockerhub/library/registry">
  Registry container image name.

  **Default:** `"proxy/crewai/dockerhub/library/registry"` - Matches Replicated proxy path structure

  **Path Transformation:**

  When `global.imageNamePrefixOverride` is set, only the final component (`registry`) is used with the override prefix.
</ParamField>

<ParamField path="internalRegistry.image.tag" type="string" default="2">
  Registry image version tag.
</ParamField>

<ParamField path="internalRegistry.image.pullPolicy" type="string" default="IfNotPresent">
  Image pull policy for registry container.
</ParamField>

<ParamField path="internalRegistry.image.pullSecret" type="string" default="">
  Image pull secret for registry image. If empty, uses the global `image.pullSecret`.
</ParamField>

<ParamField path="internalRegistry.storage.type" type="string" default="s3">
  Backend storage type for registry images.

  **Valid Values:**

  * `"s3"` - Use S3-compatible object storage (recommended)
  * `"filesystem"` - Use persistent volume storage

  **Recommendation:** Use `"s3"` for production-like deployments to enable multiple registry replicas and better reliability.
</ParamField>

### `internalRegistry.storage.s3.*`

S3 backend configuration (when `storage.type: "s3"`).

<ParamField path="internalRegistry.storage.s3.bucket" type="string" default="">
  S3 bucket name for storing registry images.

  **Example:** `"crewai-registry-images"`

  **Required:** When using S3 storage
</ParamField>

<ParamField path="internalRegistry.storage.s3.endpoint" type="string" default="">
  S3 endpoint URL. Leave empty for AWS S3, or specify for S3-compatible services.

  **Examples:**

  * MinIO: `"http://crewai-minio:9000"`
  * Wasabi: `"https://s3.wasabisys.com"`
  * DigitalOcean Spaces: `"https://nyc3.digitaloceanspaces.com"`
</ParamField>

<ParamField path="internalRegistry.storage.s3.pathStyle" type="boolean" default="true">
  Enable path-style S3 URLs (`endpoint/bucket/key` vs `bucket.endpoint/key`).

  **Values:**

  * `true` - Required for MinIO and most S3-compatible services
  * `false` - AWS S3 virtual-hosted style
</ParamField>

<ParamField path="internalRegistry.storage.s3.encrypt" type="boolean" default="false">
  Enable server-side encryption for stored objects.

  **Production Recommendation:** Enable for compliance and security.
</ParamField>

<ParamField path="internalRegistry.storage.s3.secure" type="boolean" default="true">
  Use HTTPS for S3 endpoint connections.

  **Values:**

  * `true` - HTTPS (recommended)
  * `false` - HTTP (only for internal/development MinIO)
</ParamField>

<ParamField path="internalRegistry.storage.s3.rootdirectory" type="string" default="/docker/registry/v2">
  Root directory prefix for all registry blobs in the S3 bucket.
</ParamField>

### `internalRegistry.persistence.*`

Filesystem storage configuration (when `storage.type: "filesystem"`).

<ParamField path="internalRegistry.persistence.enabled" type="boolean" default="true">
  Enable persistent volume for filesystem storage.
</ParamField>

<ParamField path="internalRegistry.persistence.size" type="string" default="10Gi">
  Size of persistent volume.

  **Sizing Guidelines:**

  * Consider container image sizes (typically 500MB - 2GB per image)
  * Account for multiple image versions
  * Add buffer for growth

  **Example Calculation:**

  * 50 different images × 1GB each = 50Gi
  * 5 versions per image = 250Gi
  * Add 50% buffer = 375Gi
</ParamField>

<ParamField path="internalRegistry.persistence.storageClassName" type="string" default="">
  StorageClass for registry volume.
</ParamField>

<ParamField path="internalRegistry.persistence.reclaimPolicy" type="string" default="keep">
  Volume reclaim policy.
</ParamField>

### `internalRegistry.service.*`

Service configuration for the registry.

<ParamField path="internalRegistry.service.type" type="string" default="ClusterIP">
  Kubernetes service type.

  **Valid Values:**

  * `"ClusterIP"` - Internal cluster access only (default)
  * `"NodePort"` - Expose on node ports
  * `"LoadBalancer"` - Expose via cloud load balancer
</ParamField>

<ParamField path="internalRegistry.service.port" type="integer" default="5000">
  Service port for registry API.
</ParamField>

<ParamField path="internalRegistry.service.nodePort" type="string" default="">
  Specific NodePort to use (when `type: NodePort`).
</ParamField>

### `internalRegistry.ingress.*`

Ingress configuration for external registry access.

<ParamField path="internalRegistry.ingress.enabled" type="boolean" default="false">
  Enable ingress for the registry.

  **Recommendation:** Enable for external access, especially in air-gapped scenarios where clients need to push images.
</ParamField>

<ParamField path="internalRegistry.ingress.className" type="string" default="">
  Ingress class name (`nginx`, `alb`, etc.).
</ParamField>

<ParamField path="internalRegistry.ingress.annotations" type="object" default="{}">
  Ingress annotations.

  **Important for Registry:**

  ```yaml theme={null}
  internalRegistry:
    ingress:
      annotations:
        nginx.ingress.kubernetes.io/proxy-body-size: "0" # Disable body size limit
        nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
  ```
</ParamField>

<ParamField path="internalRegistry.ingress.host" type="string" default="">
  Hostname for registry ingress.

  **Example:** `"registry.company.com"`
</ParamField>

<ParamField path="internalRegistry.ingress.path" type="string" default="/">
  Ingress path prefix.
</ParamField>

<ParamField path="internalRegistry.ingress.pathType" type="string" default="Prefix">
  Path matching type (`Prefix`, `Exact`, `ImplementationSpecific`).
</ParamField>

<ParamField path="internalRegistry.ingress.tls" type="array" default="[]">
  TLS configuration for ingress.

  **Example:**

  ```yaml theme={null}
  internalRegistry:
    ingress:
      tls:
        - secretName: registry-tls
          hosts:
            - registry.company.com
  ```
</ParamField>

### `internalRegistry.auth.*`

Authentication configuration for the registry.

<ParamField path="internalRegistry.auth.enabled" type="boolean" default="false">
  Enable HTTP Basic Auth for registry access.

  **Production Recommendation:** Always enable authentication for registries with external access.
</ParamField>

<ParamField path="internalRegistry.auth.htpasswd" type="string" default="">
  Htpasswd-formatted credential string.

  **Generate htpasswd:**

  ```bash theme={null}
  htpasswd -Bbn username password
  ```

  **Example Output:**

  ```text theme={null}
  admin:$2y$05$T4qhOlL.l4eJkELzvnqbNuPxjGqkj6lA9Y12345
  ```
</ParamField>

### `internalRegistry.tls.*`

TLS configuration for registry connections.

<ParamField path="internalRegistry.tls.enabled" type="boolean" default="false">
  Enable TLS for registry connections.
</ParamField>

<ParamField path="internalRegistry.tls.secretName" type="string" default="">
  Name of Kubernetes secret containing TLS certificate and key.

  **Secret Format:**

  ```yaml theme={null}
  apiVersion: v1
  kind: Secret
  type: kubernetes.io/tls
  data:
    tls.crt: <base64-cert>
    tls.key: <base64-key>
  ```
</ParamField>

### `internalRegistry.proxy.*`

Pull-through cache configuration.

<ParamField path="internalRegistry.proxy.enabled" type="boolean" default="false">
  Enable pull-through proxy/cache functionality.

  **Use Case:** Cache images from remote registries to reduce external bandwidth and improve pull performance.
</ParamField>

<ParamField path="internalRegistry.proxy.remoteurl" type="string" default="">
  Remote registry URL to proxy.

  **Examples:**

  * `"https://registry-1.docker.io"`
  * `"https://ghcr.io"`
  * `"https://quay.io"`
</ParamField>

<ParamField path="internalRegistry.proxy.username" type="string" default="">
  Username for remote registry authentication.
</ParamField>

<ParamField path="internalRegistry.proxy.password" type="string" default="">
  Password for remote registry authentication.
</ParamField>

### `internalRegistry.healthcheck.*`

Health check configuration for registry pods.

<ParamField path="internalRegistry.healthcheck.enabled" type="boolean" default="true">
  Enable liveness and readiness probes.
</ParamField>

<ParamField path="internalRegistry.healthcheck.initialDelaySeconds" type="integer" default="30">
  Seconds to wait before first probe.
</ParamField>

<ParamField path="internalRegistry.healthcheck.periodSeconds" type="integer" default="10">
  Seconds between health checks.
</ParamField>

<ParamField path="internalRegistry.healthcheck.timeoutSeconds" type="integer" default="5">
  Probe timeout.
</ParamField>

<ParamField path="internalRegistry.healthcheck.successThreshold" type="integer" default="1">
  Consecutive successes required.
</ParamField>

<ParamField path="internalRegistry.healthcheck.failureThreshold" type="integer" default="3">
  Consecutive failures before restart.
</ParamField>

### `internalRegistry.resources.*`

Resource limits and requests for registry container.

<ParamField path="internalRegistry.resources.limits.cpu" type="string" default="1">
  CPU limit for registry pod.

  **Sizing Guidelines:** Increase for high-throughput environments.
</ParamField>

<ParamField path="internalRegistry.resources.limits.memory" type="string" default="1Gi">
  Memory limit for registry pod.
</ParamField>

<ParamField path="internalRegistry.resources.requests.cpu" type="string" default="100m">
  Guaranteed CPU allocation for registry pod.

  **Tuning:** Conservative for registry with S3 backend.
</ParamField>

<ParamField path="internalRegistry.resources.requests.memory" type="string" default="128Mi">
  Guaranteed memory allocation for registry pod.
</ParamField>

<ParamField path="internalRegistry.nodeSelector" type="object" default="{}">
  Node selector for registry pod placement.

  **Example:**

  ```yaml theme={null}
  internalRegistry:
    nodeSelector:
      node-role.kubernetes.io/worker: "true"
  ```

  **Use Cases:**

  * Ensure registry runs on nodes with specific capabilities
  * Separate registry workload from application workload
</ParamField>

***
