Skip to main content
Version: 0.11

Registry access

This guide explains how to pull TokenTimer Enterprise container images and the Helm chart from the private TokenTimer registry at harbor.tokentimer.ch.

What you receive from TokenTimer​

When your enterprise license is issued you also receive a one-time credentials file (.creds.txt) containing:

FieldExamplePurpose
Robot usernamerobot$tokentimer-enterprise+customer-acme-001Identity for docker login and helm registry login
Robot tokena long opaque stringPassword for the robot account
Expiry date2027-04-09Matches the validity of your license
Registry URLharbor.tokentimer.chEndpoint to authenticate against
Projecttokentimer-enterprisePath prefix for all enterprise artifacts

The token grants pull-only access scoped to the tokentimer-enterprise project. It cannot push, mutate, or list any other project. The token is displayed once at issuance and is never recoverable from Harbor afterwards; store it in a secret manager (1Password, Vault, AWS Secrets Manager).

The same credentials let you pull three kinds of artifact from Harbor:

ArtifactPathUsed by
Container imagesharbor.tokentimer.ch/tokentimer-enterprise/tokentimer-enterprise-{api,worker,dashboard}Docker, containerd, Kubernetes nodes
Helm chart (OCI)oci://harbor.tokentimer.ch/tokentimer-enterprise/charts/tokentimer-enterprisehelm pull and helm install
Delivery tarball (OCI generic)harbor.tokentimer.ch/tokentimer-enterprise/bundles/tokentimer-enterpriseoras pull (Compose file, env template, Helm values, docs)

Network requirements​

  • Outbound HTTPS to harbor.tokentimer.ch:443 from every node that will run TokenTimer Enterprise pods, plus the workstation running helm pull.
  • The TLS certificate is issued by Let's Encrypt; no custom CA bundle is required.

1. Pull the Helm chart​

The chart is published as an OCI artifact. Use Helm 3.14 or newer.

helm registry login harbor.tokentimer.ch \
-u 'robot$tokentimer-enterprise+customer-acme-001' \
-p '<robot-token>'

helm pull oci://harbor.tokentimer.ch/tokentimer-enterprise/charts/tokentimer-enterprise \
--version 0.8.2

This downloads tokentimer-enterprise-0.8.2.tgz to the working directory. The chart bundles the core subchart, so no separate tokentimer-core install is required. Inspect the full values schema (enterprise keys plus tokentimer: subchart defaults) with:

helm show values ./tokentimer-enterprise-0.8.2.tgz

On an existing release: helm get values tokentimer -n tokentimer -a.

1b. Pull the delivery tarball (for upgrades)​

Your initial license delivery already contains tokentimer-enterprise-<version>.tar.gz (Compose file, env template, Helm value examples and defaults, and documentation). It does not ship the Helm chart tarball; pull the chart separately (section 1) when you need helm show values or an air-gapped install artifact. For ongoing upgrades you can re-pull the bundle from Harbor using ORAS and the same robot credentials:

oras login harbor.tokentimer.ch \
-u 'robot$tokentimer-enterprise+customer-acme-001' \
-p '<robot-token>'

oras pull harbor.tokentimer.ch/tokentimer-enterprise/bundles/tokentimer-enterprise:0.2.0
tar -xzf tokentimer-enterprise-0.2.0.tar.gz -C /opt/tokentimer

The artifact mediaType is application/vnd.tokentimer.bundle.v1+tar+gzip. The latest tag always points at the most recent published version.

2. Create the image pull Secret​

The chart references an imagePullSecret named tokentimer-enterprise-registry. Create it in the namespace where you intend to install:

kubectl create namespace tokentimer
kubectl create secret docker-registry tokentimer-enterprise-registry \
--docker-server=harbor.tokentimer.ch \
--docker-username='robot$tokentimer-enterprise+customer-acme-001' \
--docker-password='<robot-token>' \
-n tokentimer

If you prefer a GitOps-friendly workflow, generate the manifest with --dry-run=client -o yaml and store the result alongside your other secrets (SOPS, Sealed Secrets, External Secrets Operator).

3. Install the chart​

The chart's default values already point at harbor.tokentimer.ch and at the secret created above. A minimal install looks like:

helm install tokentimer ./tokentimer-enterprise-0.8.2.tgz \
-n tokentimer --create-namespace \
-f my-values.yaml \
--set license.create=true \
--set-file license.content=./license.key

Use the example value files under helm/examples/ in the delivery as a starting point.

4. Verifying pulls​

kubectl -n tokentimer get pods
kubectl -n tokentimer describe pod <pod-name> | grep -E 'Image|Events'
kubectl -n tokentimer get events --sort-by=.lastTimestamp

A successful pull shows Successfully pulled image "harbor.tokentimer.ch/... in the events. If you see ImagePullBackOff or ErrImagePull, see the troubleshooting section below.

5. Rotating credentials at renewal​

When you renew your license, TokenTimer issues a new robot account; the old one is left in place until it expires naturally so there is no service gap.

Update the Kubernetes Secret in place:

kubectl create secret docker-registry tokentimer-enterprise-registry \
--docker-server=harbor.tokentimer.ch \
--docker-username='robot$tokentimer-enterprise+customer-acme-001' \
--docker-password='<new-token>' \
-n tokentimer \
--dry-run=client -o yaml | kubectl apply -f -

Pods only re-authenticate to the registry on the next image pull. To force a fresh pull (e.g. for a chart upgrade), simply run helm upgrade or restart the deployments.

If your license is revoked or terminated, ask TokenTimer to delete the robot account; once deleted, no further pulls succeed.

6. Troubleshooting​

unauthorized: authentication required​

  • Ensure you used the full robot username including the robot$ prefix and the project namespace, e.g. robot$tokentimer-enterprise+customer-acme-001.
  • Confirm the token has not expired (check the Expiry date field on your delivery file).
  • Test interactively with docker login harbor.tokentimer.ch -u <robot> -p <token>.

denied: requested access to the resource is denied​

The robot is project-scoped. You can only pull from harbor.tokentimer.ch/tokentimer-enterprise/.... Pulling from any other path is denied by design.

ImagePullBackOff​

kubectl -n tokentimer describe pod <pod>

Common causes:

  • Pull secret missing in the namespace, or named differently. The chart expects tokentimer-enterprise-registry. Override with --set tokentimer.global.imagePullSecrets[0].name=<your-secret-name>.
  • Pull secret created in the wrong namespace. The Secret must live in the same namespace as the workload.

TLS / certificate errors​

If your cluster sits behind a TLS-intercepting corporate proxy, add the proxy CA to each node's container runtime trust store. TokenTimer images are served with a public Let's Encrypt certificate and require no custom CA otherwise.

helm pull returns 404​

Verify the chart version exists:

curl -sSf -u 'robot$tokentimer-enterprise+customer-acme-001:<token>' \
https://harbor.tokentimer.ch/api/v2.0/projects/tokentimer-enterprise/repositories/charts%2Ftokentimer-enterprise/artifacts \
| jq '.[].tags'

Reference​

  • Architecture overview: Architecture
  • Helm chart values reference: helm/values.yaml in the chart
  • Example value files: helm/examples/ in the delivery tarball