# Release notes for Self-Hosted Deployment on-premises

> Learn about new features, improvements, and changes in each release of Self-Hosted Deployment On-Premises

## Version 0.15.0 — July 10, 2026

You must use vpctl 0.12.0 or later to deploy this release. Upgrade vpctl before you pull and deploy the release.

### New features

#### Unity Licensing Server on-premises

The Unity Licensing Server is now deployed on-premises and is reachable at `/licensing` under your application domain. It runs as a stateful service backed by a 10 GiB persistent volume and authenticates against the in-cluster Keycloak. No manifest configuration is required.

The volume must be on block storage, because the embedded database doesn't support NFS-class storage. It provisions on your cluster's default storage class, or on `configuration.kubernetes.storage.defaultStorageClass` when set. If you later need to move it to a different storage class, no data backup is required: remove the licensing server and its volume, redeploy the release, then request and import a new license bundle. For more information about managing the licensing server, refer to [Licensing](/cloud/virtual-private-cloud/admin/licensing.md).

On new deployments, the `unity-licensing-server` Keycloak client is created automatically with the ID-token mapper the licensing server requires, and `vpctl secret generate` auto-generates the matching `unity-licensing-server` Kubernetes Secret without operator input.

**Action required for existing deployments:** the Keycloak client isn't added on upgrade, because the `unity` realm already exists and Keycloak skips the realm import. To add the Keycloak client:

1. Use [upc-cli](/cloud/virtual-private-cloud/admin/upc-cli.md) to generate the client import file. The command requires `kubectl` access to the cluster:

```sh
python3 upc-cli.py --fqdn <your-domain> --no-auth keycloak generate-client-json --output unity-licensing-server-client.json
```

1. In the Keycloak Admin console, select the **unity** realm.
2. Go to **Clients** > **Import client**.
3. Browse to `unity-licensing-server-client.json`.
4. Select **Save**.

#### Identity synchronization and entitlements tracking

The platform now deploys scheduled jobs that:

* Periodically pull new and updated users, projects, organizations, role mappings, and group roles from your identity provider into Asset Manager.
* Take a daily entitlements snapshot.

No manifest configuration is required.

#### Single-stack IPv6 support

You can now deploy on an IPv6-only Kubernetes cluster. Set `configuration.networking.ipFamily: ipv6` in your manifest:

```yaml
configuration:
  networking:
    ipFamily: ipv6
```

This requires vpctl 0.12.0 or later and Kubernetes 1.29 or later.

Deployments that omit the field keep the IPv4 defaults.

If you provision reference AWS infrastructure from the `baseline-example` Terraform included in the release package, set `enable_ipv6_only = true` to provision an IPv6-only EKS cluster with the required VPC, subnet, and DNS64/NAT64 configuration.

#### Restricted Pod Security Admission compliance

All Asset Manager workloads now render a security context that complies with the Kubernetes Restricted Pod Security Admission profile:

* A non-root user.
* No privilege escalation.
* All Linux capabilities dropped.
* Using the `RuntimeDefault` seccomp profile.

This means you can deploy the platform into namespaces that enforce the `restricted` profile.

UVCS now runs as a non-root user.

Istio CNI, ztunnel, and the host-metrics node exporter remain privileged by design and need their own namespace exemptions if you enable enforcement.

### Improvements

* **Pipeline automation upgraded to v0.0.72.** This version adds a new secret: run `vpctl secret generate` (press Enter to auto-generate the value) and redeploy. The automation database migration runs automatically on deploy, so you need to snapshot your automation PostgreSQL database first. Leave the generated value unchanged on future upgrades.
* **Configurable in-cluster DNS service name.** The new `configuration.kubernetes.dnsService` manifest field (default `kube-dns`) overrides the in-cluster DNS service name that the Loki log-collection gateway resolves against. If the `loki-gateway` pod crash-loops with the error `host not found in resolver`, set the field to your Kubernetes distribution's CoreDNS service, for example `rke2-coredns-rke2-coredns` on RKE2. EKS, AKS, and k3s deployments keep the default.
* **Multiple deployments in one AWS account.** The `baseline-example` Terraform now supports running several deployments in the same AWS account without ECR or IAM name collisions. Use a distinct `project_name` for each project within a region, and IAM role names are now region-qualified so the same project can also deploy across regions. ECR repositories are namespaced for each project through the new `ecr_repository_prefix` variable, which defaults to `project_name`; set your manifest's `configuration.kubernetes.docker.namespace` to the same value.

### Fixed issues

* **Sign-on flows and OIDC discovery use your public domain.** Fixed sign-on flows redirecting to an unreachable `http://keycloak` URL, and in-cluster services discovering unreachable Keycloak OIDC endpoints. The bundled Keycloak 26 ignores the deprecated hostname options the chart previously set, so OIDC URLs were built from the request host instead of your public domain. The chart now pins the public frontend URL; in-cluster requests keep resolving internally.
* **Project creation works.** Fixed project creation failing with a 404 error. The bundled Traefik routes were missing the create-project endpoint, so creating a new project failed. This didn't impact management of existing projects.
* **Traefik installs without middleware conflicts.** Fixed a Traefik installation failure (`Middleware ... already exists`) caused by duplicate data-streaming route definitions. The deprecated data-streaming `tiles` path (`.../instances/tiles/{tileId}`) is removed; instead, use the `groups` path (`.../instances/groups/{groupId}`), which returns the same backend response.
* **3D Data Streaming workflows use the correct image.** The 3DDS storage-tool step previously had no container image configured, so the workflow failed at runtime.
* **Configuration changes restart UVCS and the licensing server.** The Unity Version Control (UVCS) and Unity Licensing Server pods now restart automatically when their configuration changes on upgrade. Previously, a configuration change was applied but the running pod kept serving the old configuration until you restarted it manually.
* **Asset storage uses the in-cluster message broker.** The `asset-storage` service now connects to the in-cluster RabbitMQ broker for its service message queue.

## Version 0.14.0 — June 3, 2026

### New features

#### Deploy charts in parallel

`vpctl release deploy` can now deploy independent charts within the same deployment wave in parallel, which reduces total deployment time. Pass `--concurrency N` on the command line, or set a default value for your environment in the manifest:

```yaml
deployment:
  helm:
    concurrency: 4
```

The default value is `1`, which deploys charts sequentially. Existing behavior remains unchanged unless you enable parallel deployment. If you set a concurrency value greater than `1`, `vpctl` buffers each chart's output and displays it after that chart finishes. As a result, the output order differs from sequential deployments. At the end of each deployment wave and after the deployment completes, `vpctl` displays a summary of successful and failed deployments.

#### Select hardened images in the manifest

You can now select the container image variant in your manifest with the new `configuration.imageVariant` field. Set the value to `hardened` to receive the hardened image builds:

```yaml
configuration:
  imageVariant: hardened
```

Previously, release packaging automatically applied the hardened image suffix. You now select either the base or hardened images directly in the manifest, which lets you deploy both image variants from the same release.

**Action required:** If you use hardened images, set `configuration.imageVariant: hardened` in your manifest before you upgrade. Otherwise, the deployment uses the base images.

#### Deploy in single-node infrastructure mode

Use the new `configuration.infrastructure.singleNode` option to collapse the stateful infrastructure components Garage, PostgreSQL (Percona), MongoDB (Percona), Elasticsearch (ECK), and RabbitMQ to a single replica each. This option also disables PodDisruptionBudgets and removes hard anti-affinity:

```yaml
configuration:
  infrastructure:
    singleNode: true
```

Use this option for single-node or constrained clusters that you use for ephemeral testing and evaluation environments. Don't use it in production environments. Resource sizing, monitoring, backups, and component-specific overrides continue to work as before.

#### Configurable Traefik node ports

Kubernetes now assigns Traefik node ports for the `web` and `websecure` entry points by default instead of using the previously hardcoded `32080` port for `web`. Existing deployments keep their current node ports after you upgrade because Kubernetes doesn't reassign a node port when the chart no longer requests a specific value.

If your firewall or external load balancer requires a fixed port, set the new `configuration.networking.ingress.traefik.nodePorts` field. Each value must be within the `30000-32767` range:

```yaml
configuration:
  networking:
    ingress:
      traefik:
        nodePorts:
          web: 32080
```

This field requires `vpctl` 0.11.0 or later. Earlier versions reject the manifest during validation with the error `nodePorts: field not allowed`.

### Improvements

* **Keycloak supports upstream TLS termination.** If an upstream load balancer terminates TLS, such as an NLB with an ACM certificate, and `configuration.networking.ingress.traefik.tls.enabled` is set to `false`, Traefik now forwards the correct HTTPS headers on the secure entry point. Previously, the Keycloak admin console redirected users to an unreachable `http://` URL and rejected sign-ins.
* **Garage starts successfully on the first deployment.** On a new installation, Garage pods could remain in a not-ready state because their health probes checked a cluster-level endpoint that remained unavailable until the bootstrap job completed. At the same time, the bootstrap job waited for the pods to become ready, which created a deadlock. The health probes have been removed to resolve this issue.
* **Monitoring resources deploy only when Prometheus is enabled.** The `secret-manager` and `argo-workflows` charts previously created `ServiceMonitor` resources even when Prometheus was disabled. Deployments without the Prometheus Operator failed with the error `no matches for kind "ServiceMonitor"`. These resources are now gated on `configuration.monitoring.prometheus.enabled`.
* **Traefik installs correctly in custom namespaces.** Two issues that could prevent Traefik from installing have been fixed. The CORS-preflight middlewares on the public data-streaming routes now use distinct names, and the API path rewrite middleware now deploys to your installation namespace instead of a hardcoded namespace. As a result, installations in custom namespaces no longer fail because of namespace conflicts or duplicate middleware resources.
* **Automation app registration succeeds.** The `automation-manager` post-install job previously entered a crash loop with the error `mkdir /.docker: permission denied` because the non-root container didn't have a writable home directory for registry credentials. The job now authenticates successfully with your container registry. No action is required other than redeploying the release.
* **Updated UVCS server and stronger password validation.** Updated the [UVCS](/unity-version-control.md) server to version `11.0.16.10181`. UVCS user and administrator passwords must now contain at least 32 characters. If you provide or import your own passwords, `vpctl secret generate` rejects shorter passwords before deployment instead of allowing the deployment to fail later with an authorization error. Automatically generated passwords already meet this requirement.
* **Use one private CA for ingress TLS and client authentication.** The certificate generation helper script can now issue the Traefik ingress certificate from the same private CA that it uses for X.509 client certificates. This change makes it easier to configure a fully private CA deployment, such as an internal or government PKI.

## Version 0.13.0 — May 12, 2026

### New features

#### Garage object storage replaces RustFS

The on-premises deployment now uses Garage as the S3-compatible object store, replacing RustFS. Garage runs as a 3-node distributed cluster (`replicationFactor: 3`) in all sizing profiles by default, and it stores Argo workflow artifacts and Percona MongoDB scheduled backups in its `argo-artifacts` and `psmdb-backups` buckets.

Use the new `configuration.infrastructure.components.garage` manifest field to configure Garage. The available settings are `resources` (standard CPU and memory requests and limits), `metaStorage`, `dataStorage`, `replicas`, and `replicationFactor` (capped at 3).

**Requirements:**

* vpctl 0.10.0 or later.
* At least 3 schedulable nodes in the general workloads pool. MongoDB and RabbitMQ already require this minimum because they spread their three replicas across distinct nodes by using `podAntiAffinity`. Garage uses the same model.

For the upgrade procedure and data preservation paths, refer to the **Breaking change** section that follows.

#### Customer-supplied CA bundle for internally-signed TLS

A new `configuration.networking.trustedCaSecretName` manifest field lets you mount your CA chain into the Argo workflow containers, the StorageTool, and all `asset-manager-*` Pixyz workflow templates. Use it when your Asset Manager ingress presents a TLS certificate signed by a private CA, such as a DoD PKI or an internal corporate CA, instead of a publicly trusted CA.

Reference a pre-existing Kubernetes Secret that holds a PEM-encoded CA bundle under the single key `ca-bundle.crt`:

```yaml
configuration:
  networking:
    trustedCaSecretName: my-ca-bundle
```

The .NET workflow containers and the Pixyz workflow templates pick up the bundle when they start.

### Improvements

* **Larger default PostgreSQL storage.** This release increases default PostgreSQL data and pgBackRest backup persistent volume sizes by sizing profile: 50 GiB data and 100 GiB backup (`small`), 400 GiB data and 800 GiB backup (`medium`), 800 GiB data and 1600 GiB backup (`large`). For existing clusters, ensure your StorageClass has `allowVolumeExpansion: true` so that the Percona PostgreSQL operator can resize the PVCs online; otherwise, resize the PVCs manually after upgrading.
* **Automation step logs stream again.** The `automation-external-secrets` Secret now also includes `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, mirrored from `s3-api-storage-credentials`, which the AutomationService needs to stream Argo step logs from object storage. After upgrading, rerun `vpctl secret generate` and `vpctl secret deploy`, then run `kubectl -n asset-solutions rollout restart deployment/automation` so that the AutomationService picks up the new environment variables.

### Breaking change

#### RustFS replaced by Garage

This release removes the `configuration.infrastructure.components.rustfs` manifest field. The S3-compatible object store is now Garage and uses the new `configuration.infrastructure.components.garage` manifest field. You must use vpctl `0.10.0` or later to deploy this release.

**Customer-visible side effects**

* The `s3-api-storage-credentials` Kubernetes Secret keeps its name, but the field names changed: `RUSTFS_ACCESS_KEY` is now `GARAGE_ACCESS_KEY`, and `RUSTFS_SECRET_KEY` is now `GARAGE_SECRET_KEY`. The `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` aliases still mirror those values for the Percona MongoDB operator. After upgrading vpctl, rerun `vpctl secret generate` and `vpctl secret deploy` to pick up the new schema.
* A new `garage-rpc-secret` Kubernetes Secret (single field `rpcSecret`, 64-character hex) holds the Garage cluster RPC secret. The Garage chart consumes it through `existingRpcSecret`. vpctl creates this Secret automatically as part of `vpctl secret generate` — no extra action is required beyond the standard first-time deploy flow.
* Percona MongoDB scheduled backups now write to the Garage `psmdb-backups` bucket through `garage:3900`. There's no manifest-level change required.
* The `/rustfs` Traefik debug ingress route is removed. To reach the S3 API directly, use `kubectl port-forward svc/garage 3900:3900`.

##### Migration paths

Choose one of these paths before you run `vpctl release deploy`.

**Path A — wipe and redeploy (recommended for staging environments).** RustFS object data isn't preserved. Argo workflow artifacts are ephemeral, Percona MongoDB regenerates backups on the next scheduled run, and Asset Manager re-ingests content on demand.

Before you continue with the rest of the upgrade guide, drain the RustFS PVCs:

```sh
kubectl -n asset-solutions delete pvc -l app.kubernetes.io/name=rustfs
```

Then return to the upgrade guide and complete steps 4 (sync artifacts), 5 (regenerate and deploy secrets), and 6 (regenerate and deploy charts). When `vpctl release deploy` completes, Garage replaces RustFS in the same release, and the `garage-bucket-bootstrap` post-sync Job assigns the cluster layout, imports your `GARAGE_ACCESS_KEY` and `GARAGE_SECRET_KEY` into Garage, and creates the `argo-artifacts` and `psmdb-backups` buckets.

**Path B — preserve data with `mc mirror`.** Recommended if you want to keep existing PSMDB backup dumps. This release includes a helper script, `migrate-rustfs-to-garage.sh`, under `extracted-release/common/scripts/`.

Before you regenerate and deploy the new secrets (step 5 in the upgrade guide), run the backup phase from a workstation that can reach the cluster. At this point, the in-cluster `s3-api-storage-credentials` Secret still holds the old `RUSTFS_*` fields, so the script can mirror the `argo-artifacts` and `psmdb-backups` buckets from RustFS to a local directory:

```sh
export RUSTFS_ACCESS_KEY=$(kubectl -n asset-solutions get secret s3-api-storage-credentials -o jsonpath='{.data.RUSTFS_ACCESS_KEY}' | base64 -d)
export RUSTFS_SECRET_KEY=$(kubectl -n asset-solutions get secret s3-api-storage-credentials -o jsonpath='{.data.RUSTFS_SECRET_KEY}' | base64 -d)
NAMESPACE=asset-solutions BACKUP_DIR=./rustfs-backup ./extracted-release/common/scripts/migrate-rustfs-to-garage.sh backup
```

Return to the upgrade guide and complete steps 5 (regenerate and deploy secrets) and 6 (regenerate and deploy charts). After `vpctl release deploy` finishes and both the Garage StatefulSet and the `garage-bucket-bootstrap` Job are complete, restore the buckets to Garage:

```sh
export GARAGE_ACCESS_KEY=$(kubectl -n asset-solutions get secret s3-api-storage-credentials -o jsonpath='{.data.GARAGE_ACCESS_KEY}' | base64 -d)
export GARAGE_SECRET_KEY=$(kubectl -n asset-solutions get secret s3-api-storage-credentials -o jsonpath='{.data.GARAGE_SECRET_KEY}' | base64 -d)
NAMESPACE=asset-solutions BACKUP_DIR=./rustfs-backup ./extracted-release/common/scripts/migrate-rustfs-to-garage.sh restore
```

## Version 0.12.0 — April 30, 2026

### Improvements

#### Hardened [UVCS](/unity-version-control.md) container security

The `uvcs` (previously Plastic SCM) StatefulSet now runs as a non-root user (UID 1000) with a hardened security context. This disables privilege escalation, drops all Linux capabilities, and enforces the `RuntimeDefault` seccomp profile. This change lets you deploy in clusters that enforce strict Pod Security Standards or Kyverno policies that forbid `runAsUser: 0`.

**Action required before you upgrade existing deployments**

1. **Plan a maintenance window.** On the first `uvcs` pod restart after the upgrade, Kubernetes recursively changes ownership of the `uvcs` persistent volume (`/jet`) to GID 1000 through `fsGroupChangePolicy: OnRootMismatch`. For large repositories, this operation can take several minutes, during which the `uvcs` pod is unavailable.
2. **Validate that your CSI driver applies `fsGroup` correctly.**
3. **Verify the upgrade.** After the upgrade completes, confirm the new security context:
   * `kubectl exec uvcs-0 -c uvcs -- id` returns `uid=1000 gid=1000`.
   * `kubectl exec uvcs-0 -c uvcs -- ls -ld /jet` shows group `1000` and no permission errors.
   * `kubectl logs uvcs-0 -c uvcs` shows the entrypoint creating symlinks under `/opt/plasticscm5/server` without errors and `plasticd` binding `:8087`.

## Version 0.11.0 — April 24, 2026

### New features

#### Helm chart sourcing (preview)

The new `deployment.helmChartMode` manifest setting lets you choose how Helm charts are delivered:

* `local` (default): the process installs charts from the release package. This is the safest option for existing deployments and for air-gapped environments.
* `remote`: the process pulls charts from an OCI Helm registry at deployment time.

The `remote` mode and the matching `vpctl artifact sync charts` command are available as a preview in this release. Not all charts are published to the Unity OCI Helm registry yet, so a fully remote-only deployment isn't supported. For production deployments, continue to use the default `local` mode.

#### Default monitoring alerts

The Prometheus monitoring stack now ships with a curated set of cluster and workload alerting rules out of the box. You no longer need to assemble these rules manually before going to production.

#### Hardened container variant for the upc-job image

The `upc-job` image now ships in a hardened variant, which is built on a minimal base image with a reduced attack surface for stricter security baselines.

### Improvements

* **Higher default resource allocations**: MongoDB, mini-usf, and public-api now request more CPU and memory by default, which reduces the need for manual tuning to reach production-level performance.
* **Idempotent onboarding**: the `upc-onboarding` job is now safe to rerun. The job no longer fails or duplicates resources if you retrigger it after a partial deployment.
* **More resilient RabbitMQ scheduling**: RabbitMQ pods now schedule successfully on clusters that don't expose availability zone labels.
* **Reliable Keycloak tokens**: Keycloak-issued tokens now include the `sub` and `auth_time` claims required by downstream services. This fixes a regression introduced by Keycloak 26's stricter scope handling.
* **Mini-usf routing fixes**: legacy admin routes and the groups routes are now matched correctly, including the right middlewares and permissions for the global admin role.
* **Quieter object storage logs**: RustFS no longer floods the log volume at default verbosity. The default log level is now `error`, which prevents disk pressure on the log PVC.
* **Organization management connectivity**: the `organization-management` service now reads the correct RabbitMQ consumer queue setting and starts cleanly.

## Version 0.10.0 — March 20, 2026

### New features

#### Official Keycloak 26 image

The identity stack now runs the official Keycloak 26 image through the new keycloak-standalone chart, replacing the previous Bitnami-based Keycloak distribution. This change brings access to upstream Keycloak features and a faster security update cadence.

If you previously customized the Bitnami Keycloak chart, review your manifest before upgrading.

#### Automation app scheduling

A new `uc-scheduler-runner` image powers scheduled jobs for automation apps such as Asset Manager and Pixyz. Scheduling now runs as part of the deployment without additional manual setup.

### Improvements

* The fallback namespace used for automation resource isolation (`UCAUTOMATION_ResourceIsolationOptions__FallbackNamespace`) now follows the namespace defined in your manifest instead of being hardcoded. Multi-namespace deployments work without code changes.

## Version 0.9.0 — March 17, 2026

### New features

#### Automation app management

Automation apps such as Asset Manager and Pixyz are now automatically registered during deployment. A post-deployment job handles app registration, removing the need for manual setup.

## Version 0.8.0 — March 13, 2026

### New features

#### Log storage configuration

You can now control the persistent volume size for log storage independently from data storage for the object storage component. Sizing profile defaults range from 1 GiB (`small`) to 10 GiB (`large`), and you can override the value per component.

#### Transformation parallelism control

A new `configuration.transformations.parallelism` manifest field lets you set the maximum number of concurrent transformation workflows. The default value is 20.

### Improvements

* Deployment validation now enforces that the store encryption key is exactly 32 characters, catching misconfigured keys before they cause runtime errors.

### Breaking change

The `configuration.licensing` section, including FlexLM and `sdkLicenses` settings, has been removed. Built-in transformation workflows are now always enabled, and their concurrency is controlled through the new `configuration.transformations.parallelism` manifest field. Remove any licensing configuration from your manifest before upgrading.

## Version 0.7.0 — March 3, 2026

### New features

#### CLI version compatibility checks

The release package now declares the minimum required `vpctl` version. The `vpctl release generate` and `vpctl secret generate` commands check this requirement before running and block execution if the CLI version is too old. This prevents silent misconfigurations from manifest schema changes.

### Improvements

#### Object storage distributed mode

Object storage now runs in distributed mode by default, improving data durability and availability.

## Version 0.6.0 — February 23, 2026

### New features

#### Infrastructure sizing profiles

You can now control the CPU, memory, and storage allocations for the following infrastructure components directly from the manifest: MongoDB, PostgreSQL, RabbitMQ, object storage, and Elasticsearch.

Choose from three named sizing profiles: `small`, `medium`, or `large`. Alternatively, override the resources for individual components to match your workload.

#### Improved container image management

All infrastructure images, including Istio and Percona MongoDB backup images, are now sourced from your private container registry instead of public registries. This method improves reliability and security in air-gapped or restricted network environments.

### Breaking change

Support for the custom Pixyz scripts has been removed. If you previously used the `automation.customPixyzScript` manifest configuration, remove it from your manifest before upgrading.

## Version 0.5.0 — February 17, 2026

### New features

#### Centralized log collection

Log collection is now available through Loki and Alloy. Enable it in your manifest with the `monitoring.logCollection.enabled` option to aggregate logs from all services in your deployment.

### Improvements

#### Automated MongoDB backups

Percona MongoDB now automatically backs up data to RustFS S3-compatible storage, improving data durability without requiring manual backup configuration.

## Version 0.4.0 — February 12, 2026

### New features

#### Istio service mesh support

You can now enable Istio with ambient mode for service-to-service traffic management and observability. Configure Istio in your manifest under `configuration.networking.serviceMesh.istio`.

#### SDK license management

A new `sdkLicenses` setting in the manifest licensing section lets you specify how many Pixyz SDK licenses are available. This setting controls the maximum number of concurrent transformation workflows.

### Improvements

* Improved container image handling for workflow execution
* Improved object storage reliability with automated bucket creation during deployment

## Version 0.3.0 — January 28, 2026

### New features

#### Full application suite

This release adds the complete set of application services, including:

* **Asset Manager**: full asset management with storage, collaboration, and search
* **Automations and workflows**: pipeline automation with Argo Workflows
* **Identity and access management**: Keycloak for authentication and role-based access control
* **Notifications**: event notifications through Novu
* **Ingress**: Traefik as the ingress controller and load balancer

## Version 0.2.0 — December 8, 2025

### New features

#### Core infrastructure services

This release adds the foundational infrastructure layer, including:

* **Databases**: PostgreSQL (via PG Operator) and Elasticsearch for relational data and search
* **Caching**: Valkey for in-memory data storage
* **Messaging**: RabbitMQ for asynchronous communication
* **Asset services**: storage abstraction, collaboration, authoring, bulk operations, and catalog management

## Version 0.1.0 — November 28, 2025

### New features

First release of Self-Hosted Deployment On-Premises.
