Host a Private Helm Repository on OVHcloud Object Storage

What You'll Learn
  • Create an OVHcloud Object Storage container
  • Package Helm charts
  • Upload them using the S3-compatible API
  • Use the repo privately with Helm
Prerequisites
  • OVHcloud account with Public Cloud enabled
  • A project with Object Storage activated
  • helm, awscli, and optionally s3cmd installed
  • Your Object Storage S3 credentials
Create an Object Storage Container
  • Go to your OVHcloud Control Panel
  • Navigate to: Public Cloud → Object Storage
  • Click Create Container
    • Name: helm-repo
    • Region: (e.g., GRA, BHS, etc.)
    • Type: Private or Public (we’ll go with private here)
Get Your S3-Compatible Credentials
  • In the OVHcloud panel: Users & Roles → OpenStack User
  • Generate an OpenStack user with S3 credentials
  • Save the:
    • Access Key
    • Secret Key
    • Endpoint (e.g., s3.gra.io.cloud.ovh.net)
Configure AWS CLI
aws configure --profile ovh-helm
  • Access Key: (paste yours)
  • Secret Key: (paste yours)
  • Region: gra
  • Output format: json

Set the endpoint manually in each command using --endpoint-url.

Create and Package a Helm Chart
helm create my-app
helm package my-app

This creates my-app-0.1.0.tgz

Generate index.yaml
helm repo index . --url https://s3.gra.io.cloud.ovh.net/helm-repo

This will generate index.yaml compatible with Helm.

Upload to OVHcloud Object Storage
aws s3 cp my-app-0.1.0.tgz s3://helm-repo/ --profile ovh-helm --endpoint-url https://s3.gra.io.cloud.ovh.net
aws s3 cp index.yaml s3://helm-repo/ --profile ovh-helm --endpoint-url https://s3.gra.io.cloud.ovh.net

To list contents:

aws s3 ls s3://helm-repo/ --profile ovh-helm --endpoint-url https://s3.gra.io.cloud.ovh.net
Access the Repo Privately

Helm can’t use S3 directly yet, so we use tools like:

Option A: Use ChartMuseum (self-hosted)

You can proxy your OVH storage with ChartMuseum running in Kubernetes or locally.

Option B: Use s3 with helm-s3 plugin

Install:

helm plugin install https://github.com/hypnoglow/helm-s3.git

Configure:

export AWS_ACCESS_KEY_ID=your_key
export AWS_SECRET_ACCESS_KEY=your_secret
export AWS_REGION=gra
export HELM_S3_ENDPOINT=https://s3.gra.io.cloud.ovh.net

Add the repo:

helm repo add ovh-s3-repo s3://helm-repo
helm repo update

Install:

helm install myapp ovh-s3-repo/my-app
Automate with GitHub Actions

Optionally, automate chart packaging and upload with a GitHub workflow:

name: Upload Helm Chart

on:
  push:
    paths:
      - 'charts/**'

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Helm
        uses: azure/setup-helm@v3

      - name: Package Chart
        run: |
          helm package charts/my-app
          helm repo index . --url https://s3.gra.io.cloud.ovh.net/helm-repo

      - name: Upload to OVH S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 cp my-app-*.tgz s3://helm-repo/ --endpoint-url https://s3.gra.io.cloud.ovh.net
          aws s3 cp index.yaml s3://helm-repo/ --endpoint-url https://s3.gra.io.cloud.ovh.net