Setting Up a Private Helm Chart Repository with Automation and ACL

Releases stall when packages are pulled from uncontrolled sources and access is granted manually. We set up a private Helm repository turnkey: isolated package storage, publication automation, and per-team access control. Service deployments go faster, and external failures stop derailing releases.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1359
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Private Helm repository: where it breaks and what it puts at risk

A DIY chart storage lasts until the second release. While one engineer publishes packages from a local copy, everything looks operational, but with a second team index.yaml stops being the source of truth: some packages never make it to the index, and some are overwritten.

Then versions diverge. In a Helm repository, nothing prevents overwriting an already published number, so the same tag across different teams means different builds, and --version in the pipeline pulls whatever was placed last. Diagnostics take hours: the manifests in the cluster do not match the chart sources.

Another bottleneck is distributing packages to teams without separation of permissions. A DIY storage usually gives everyone both read and write access: a substituted chart goes to the cluster, and the logs cannot reconstruct who published it and when. Revoking access after a contractor change turns into manual work.

The bottleneck in deployment is not the build, but manual publication and the lack of integrity guarantees. We break down how this is closed: automatic publication from the pipeline, separate read and write permissions, immutable versions, and a publication log.

Implementation effect: release speed and deployment resilience

While chart publication relies on manual actions, a release is a set of agreements: who built the package, from which branch, and with which values.

After publication is moved into a managed environment, a release becomes a single operation: a change passes review, the package version is incremented, and the chart goes to a private registry under an account with limited permissions.

Deployment time shrinks from hours of coordination to tens of minutes: build, verification, and publication run as one chain, and deployment to an environment is selecting a ready chart version rather than rebuilding on site.

The more services there are, the more noticeable the difference: five releases a day no longer require five manual passes.

Environment reproducibility stops being a wish: an environment is described by a pair of "chart version plus values file," and the test environment differs from production only in values, not in the set of objects.

Rollback becomes switching to the previous package version—without manual rebuilding or manifest reconciliation.

Package version control closes a separate class of failures: overwriting an already published version is prohibited by registry policy, read and publish permissions are separated, and the log shows who published a specific chart and when.

A common cause of incidents goes away—"the wrong version is deployed in the environment" and "I built locally but didn't upload it to the registry."

Overall, the effect accumulates: releases stop being an event that someone runs manually and become a predictable procedure with the same result in any environment.

Comparison of modes: proxy cache, isolated repository, hybrid

Chart storage modes differ in where the client and build pipeline get the package from, who is responsible for updating the version, and how dependent the repository is on the external network.

A package proxy cache is convenient at the start, an isolated repository is for a closed environment, and a hybrid covers both tasks but requires configuration discipline. Helm remains the client in all variants—only the index source and caching rules change.

Mode When it fits Limitations
Proxy cache The environment allows outbound traffic and a broad set of public charts is needed No own versions: if the external source disappears, the charts disappear too; access rules are set by the serving party
Isolated repository Closed environment, only verified builds are stored Each chart is added by your own efforts, the index grows—automation of deployment and cleanup of old versions is needed
Hybrid Both public dependencies and private charts with different permissions are needed Two sources in the client configuration, index desynchronization complicates debugging

The choice is usually dictated by network policy and the access model.

If outbound requests are allowed and speed of first deployment matters, a proxy cache is chosen; if the environment is closed and build reproducibility is needed, the limitations of a private storage are accepted deliberately and compensated for by deployment automation.

A hybrid is chosen when public dependencies are needed by many teams, while internal charts live by their own rules: a single entry point removes the difference in policies between sources.

Implementation order: from audit to handover to operations

We start with an audit of the current deployment: we look at where charts come from, who publishes them and how, where build credentials are stored, and which distribution points are actually used in the clusters.

Based on the results—a target package storage scheme and a transition plan in which releases do not stop for even one day.

  1. Publication inventory—a complete list of charts and dependencies, sources, rights holders, unused artifacts.
  2. Scheme design—a single private Helm repository or separation by domains and teams, a model of roles and access levels.
  3. Environment preparation—transport encryption, separate artifact storage, index backups, integration with corporate login.
  4. Chart publication setup—build credentials with write-only permission, automatic packaging and upload by tag, integrity verification before deployment.
  5. Permissions and lifecycle—read and write roles, token expiration, retention policy, prohibition of overwriting an already released version.
  6. Verification on real releases—run in the test environment, rollback to the previous version, checksum reconciliation, parallel builds.
  7. Handover to operations—regulations, documentation, team training, notifications about access errors and volume growth.

After handover, your engineers have a working configuration, scheme, and instructions—the registry evolves without our involvement.

Deliverables: configurations, schemes, and access regulations

Everything we build remains in your environment and continues to live without our involvement.

A private Helm repository is not just a running server: without schemes, policies, and regulations, it quickly turns into a dump of charts where no one remembers who uploaded a version and why.

Therefore, the deliverables include both configurations and a description of how they are connected to each other.

  • Repository configurations: chart index storage, separation by projects and teams, artifact retention and cleanup parameters.
  • Interaction schemes: the chart path from local development through the build pipeline to the cluster, with verification points at each step.
  • Chart access policies: roles for read, publish, and delete, binding to corporate groups, service token lifetime.
  • Publication regulations: semantic versioning, mandatory values validation scheme, review procedure before entering the shared repository.
  • Signing and integrity verification: provenance files by which the cluster accepts only charts from a trusted source.
  • Lifecycle rules: how many versions to keep per tag, what goes to archive, how to roll back to the previous release with one command.
  • Documentation: diagrams, on-call instructions, repository recovery procedure, and transfer of rights when the responsible person changes.

We hand this over together with a deployed and verified repository, not as an archive of settings "for reading." Already at the handover stage, your engineers publish charts independently according to the written regulations—we only verify the result.

Case study: how deployment of 40 services stopped requiring manual edits

Before implementing the private repository, the charts of forty services lived in the same repository as the application code.

Every release began with manual editing of values files: an engineer copied a block from a neighboring service, changed names, the image registry address, and tags, and then asked a colleague to visually reread the list of changes.

What it was before

Deploying the entire environment took about 3 hours and depended on one person who knew the order of services and remembered which charts were connected to each other.

In 8 out of 10 releases, manual edits remained, and configuration discrepancies between environments caused 6–9 incidents per quarter. Rollback to the previous version took 40–50 minutes: the required chart archive was searched for in pipeline logs and in chat.

What it became after

We deployed a private Helm Repository with per-team ACLs: publication happens only from the pipeline by tag, charts are signed, and the lifecycle policy keeps the latest builds for each major version and cleans up the rest—while rollback to the previous release remains possible.

Environment deployment was reduced to 12 minutes, manual edits became exceptions and undergo review like regular code.

Over two quarters after the transition, configuration discrepancies caused zero incidents, and deployment recovery time dropped from 40–50 minutes to 2 minutes.

What to do if a public proxy cache is already deployed

Yes, the proxy cache does not need to be shut down all at once: it continues to serve public charts while migration to private storage is underway.

The key principle is to separate read and write: clients read from two sources for a while, but publish only to the environment with access permissions. This way, current deployments do not stop, and new releases immediately get per-team separation.

Technically, the transition relies on the order of sources in the client settings: the private repository is declared first and overrides same-name packages from the cache, while the rest is pulled from the public one. Rollback is changing the order back, and the build line continues to work.

Option When it fits Limitations
Parallel environment with mirroring There is time for gradual migration Need control over version discrepancies between cache and mirror
Switching by individual packages Many packages, independent releases Takes longer, a registry of owners is needed
One-time switch with a window Few dependencies, one team Requires freezing deployments during the transition

We build the transition plan starting from inventory: we collect a list of actually used charts and their sources, bring up the private environment, mirror dependencies, then switch reading, and only after that disable the public proxy cache. Each step is reversible, so the migration happens without stopping deployments.

Questions about limits, cache, and access permissions

We usually discuss storage, cache, and permissions before the start: they determine the deployment scheme and package delivery behavior during a failure. Below are the questions most often raised by the customer's team.

What limits the storage, and when should it be cleaned up?

Packages are immutable, so volume grows monotonically: each build adds a version. We set the boundary not by disk space but by retention policy—how many versions per tag remain available for rollback, and the rest goes to archive.

For object storage, we check separately: some providers do not free space immediately after deletion.

How should permissions be separated between teams?

We grant access by "team—repository" pairs, not with shared credentials. Publication and reading are different roles: most engineers only pull charts; their build pipeline uploads them.

Tokens are tied to a service account and have a limited lifetime—changing contractors or an employee leaving does not leave open keys.

What happens if the registry is unavailable?

Deployment of already built releases should not depend on the network. A local cache in the cluster and a mirror in a second environment provide a reserve: deployment runs from a copy, not from the primary storage.

We test the "primary storage is down" scenario separately—whether the mirror serves the required versions and how quickly the client switches.

Let's discuss the task: what is needed for an estimate and implementation plan

So that the implementation estimate is based on facts rather than assumptions, we need to align on your environment: where the registry is located, who publishes charts, and what access rules are already in effect.

Describe the task in free form—we will come back with an estimate and work plan where each stage is tied to a verifiable result.

What we clarify before starting:

  • Where the registry is located: your own environment, cloud, or hybrid; whether a mirror registry is needed for sites without external network access.
  • How charts enter the registry: from the build pipeline, manually, or from external sources—this determines publication automation and the versioning scheme.
  • Who reads and how: teams, service accounts, separate spaces for products; whether separate entry points are needed.
  • What access rules to set up: separation by projects, read-only and publish roles, a log of who uploaded what.
  • Retention policy: how many chart versions to keep, on what basis to clean up, whether immutable releases are needed for rollback.
  • Integrity requirements: chart signing, provenance verification, dependency scanning before publication.
  • Integrations: which deployment environment we connect to, what is already used—proxy, secret storage, monitoring.

If there is no answer for some items yet, that is also useful. We will advise which decisions need to be made before work begins and what can safely move to the second stage, and we will come back with an estimate, stage breakdown, and timelines.