mrkeyoor.com_
Sun 06 Sept 07:54 UTC
Self-Hostedevaluationupdated 06 Sept 2026

harbor review

Harbor is a self-hosted registry for container images and other OCI artifacts. It adds user access, project policies, replication, vulnerability scanning, audit logs, retention, and a web interface around the registry that build systems and clusters already know how to use.

Verdict

Our Harbor run installed 697 packages in 88 seconds and built in 8 seconds, but 136 of 388 Go tests failed after 511 seconds. Harbor is worth the operating cost when a platform team needs registry access policy, scanning, replication, and audit records in one place, provided it reproduces and explains those failures in its own environment. Choose Distribution or Zot for a smaller registry, and test v2.15.2 upgrades plus garbage collection on copied data before production.

We ran it

Lab card: what happened when we ran harborScreenshot of harbor (goharbor.io)
Install✓ · 88s697 packages
Build✓ · 8s
Tests✗ · 511s252 passed · 136 failed of 388 (go test)
Repo3258 files~323,721 lines of source · 19.4 MB · 11 CI workflows · tests dir

Answers from our run

Does harbor build from source?

Dependencies installed in 88 seconds (697 packages), and the build succeeded in 8 seconds. We cloned commit 3a88243 into a clean Debian container with 3 CPUs and no project-specific setup.

Do harbor's tests pass?

Not all of them: 252 of 388 passed and 136 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use harbor?

Small teams that only need authenticated push and pull: Harbor's portal, core service, job service, database, cache, scanner, and policy layer create more operations than a basic Distribution or Zot registry.

What are the alternatives to harbor?

Distribution, Zot, Project Quay. Our Harbor run installed 697 packages in 88 seconds and built in 8 seconds, but 136 of 388 Go tests failed after 511 seconds.

Setup2/5Build passed, but 136 of 388 tests failed after a 697-package install
Docs4/5Install, TLS, identity, storage, scanning, and HA are documented
Community5/529,317 stars and active September 2026 issue and pull request work
Maturity4/5v2.15.2 is established, though our broad Go suite failed heavily

Who it’s for

Platform teams running a private registry for several developers, clusters, or business units.
Organizations that need project-level access control, OIDC or LDAP login, robot accounts, and audit records.
Operators who want replication, retention rules, vulnerability scanning, and deployment policy beside stored artifacts.
Kubernetes teams able to supply external database, cache, ingress, and shared storage for high availability.

Who it’s NOT for

Small teams that only need authenticated push and pull: Harbor's portal, core service, job service, database, cache, scanner, and policy layer create more operations than a basic Distribution or Zot registry.
Operators who need the checked-out Go suite to pass in a clean generic builder: our run ended with 136 failures out of 388 tests.
Organizations that cannot schedule a database backup and maintenance window for v2.15.2: that release upgrades the bundled PostgreSQL database from 15 to 18 during startup.
Teams planning to switch an established local-user installation to OIDC later: Harbor allows that change only while admin is the sole local database user.
Registries that mirror identical artifacts across projects and cannot stage garbage collection first: open issue 23803 reports live images being orphaned after shared blobs are selected for deletion.

Setup reality

Our commit 3a88243 sandbox installed 697 Go packages in 88 seconds and built the project in 8 seconds. Tests failed after 511 seconds: 252 passed and 136 failed out of 388. The final log lines named failures in the security, subject, and v2auth middleware packages, then ended with FAIL; they did not show a cause.

Running Harbor needs more than the source build. The supported paths use a release installer with Docker Compose or the separate Helm chart. You must set a reachable hostname, TLS certificates, administrator and database secrets, storage, and any proxy settings. Trivy scanning is optional, while OIDC and LDAP bring their own provider configuration and credentials.

High availability needs an ingress, external PostgreSQL, an external Redis-compatible cache, and shared volumes or object storage. Release v2.15.2 upgrades its bundled PostgreSQL from 15 to 18 on startup, so backup, downtime, and possible reindexing belong in the upgrade plan. The README also warns that main may be unstable and directs operators to release binaries.

Harbor v2.15.2 adds policy to OCI artifact storage

Harbor v2.15.2 sits between OCI clients and stored artifacts, adding controls that a bare registry leaves to other systems. Projects divide repositories and permissions. OIDC, LDAP, or the local database handles people, while robot accounts serve automation. Replication policies move artifacts between registries, Trivy can scan them, and retention plus garbage collection manage storage. The portal and REST API expose the same administrative surface to humans and platform code.

Release installers are easier than building the 3,258-file checkout

Harbor v2.15.2 is distributed through online and offline installer archives for Docker Compose, with Kubernetes deployments handled by the separate Helm chart. The online package downloads service images, while the offline package carries them for disconnected hosts. This distinction matters because the README warns that main may be unstable and tells operators to use releases. Building a Git checkout is a contributor path, not the shortest route to a supported registry.

The runtime still needs deliberate configuration. harbor.yml requires a reachable hostname, and production deployments need HTTPS certificates because Harbor ships without them. Administrators must replace the initial admin and database passwords, choose local or external storage, and preserve the installer directory for later reconfiguration. Trivy is opt-in on the Compose installer. Private networks may also need proxy allowances for its vulnerability database downloads.

What happened when we ran it

Our fresh Debian sandbox installed 697 Go packages in 88 seconds for commit 3a88243, using golang:1.24-bookworm with 3 CPUs and 8 GB of RAM. The project lives under ./src/, and its build succeeded in 8 seconds. That proves the checked-out source could resolve its Go dependencies and compile in the stated unprivileged container without secrets. It does not prove that the release installer or a running registry works.

The test command failed with exit code 1 after 511 seconds. Go test recorded 252 passes and 136 failures out of 388. The supplied tail showed successful middleware packages beside failures in server/middleware/security, server/middleware/subject, and server/middleware/v2auth, followed by the overall FAIL. Those lines do not identify a missing service, assertion, or environmental cause, so assigning one would be guesswork.

Our checkout scan counted 3,258 files, about 323,721 lines of source, and 19.4 MB before installed dependencies. It found 11 CI workflow files and a tests directory, but no Dockerfile.

OIDC and scanning add policy with sharp configuration edges

OIDC has one especially important sequencing rule. Harbor allows a switch from local database authentication to OIDC only when no local user other than admin exists. Docker and Helm CLIs cannot follow the browser redirect, so each OIDC user receives a CLI secret. Generating a new secret invalidates the old one. Teams should settle identity architecture before onboarding users and treat CLI secrets as registry credentials, not as disposable portal preferences.

The v2.15.2 database upgrade needs a maintenance plan

Release v2.15.2 automatically upgrades the bundled PostgreSQL database from 15 to 18 when its container starts. The release notes call for a backup and warn that startup can take longer according to database size. They also describe reindexing for deployments with non-ASCII data if collation changes leave indexes stale. An image registry is often on the critical path for deployments, so this upgrade deserves a tested rollback and an announced window.

High availability shifts more work to the operator. Harbor's Helm guidance expects a highly available ingress, PostgreSQL, Redis-compatible service, and storage shared across replicas. Shared volumes or object storage hold artifacts and job output. Those pieces are normal in a platform stack, though Harbor does not operate their availability for you. A team without database and storage recovery drills will gain registry features while creating a new failure domain.

Two open v2.15.2 reports deserve reproduction before rollout

Open issue 23803 reports that Harbor v2.15.2 garbage collection can mark shared blobs for deletion after one copy of an identical artifact is untagged in another project. The report includes a dry-run reproduction and says surviving images become unpullable after deletion. Issue 23862 separately reports missing page-size limits on two retention history endpoints. Both are reports awaiting resolution, so reproduce the relevant path on copied data instead of treating either report as a universal result.

The project is plainly active. GitHub recorded the last push on 2026-09-06, with current issue and pull request updates on the preceding days. The repository had 29,317 stars and 872 combined open issues and pull requests when fetched, while v2.15.2 was published on 2026-07-02. The large queue needs triage by area and release, but the push and discussion dates rule out calling Harbor dormant.

Distribution and Zot cost less attention when policy is external

A 697-package source install is a clue to Harbor's breadth, even before its runtime services arrive. Distribution is the best alternative when another layer already provides authentication and scanning. Zot is a more focused OCI-native registry for teams that do not need Harbor's full management surface. Project Quay is the closer comparison when identity, access controls, replication, a web interface, and vulnerability analysis still belong inside the registry product.

Harbor earns a trial only after its 388-test result is explained

Our 388-test Go run left 136 failures, so the source checkout does not earn a production recommendation from this sandbox alone. Harbor still fits a staffed platform team that needs one place for artifacts, access rules, scans, replication, and audit history. Use a signed release, reproduce the failing areas, stage the PostgreSQL 18 upgrade, and dry-run garbage collection against a restored copy. A small team needing private push and pull should choose the smaller registry and keep the operational budget.

Alternatives

ProjectWhat it isPick it when
DistributionThe OCI registry implementation that Harbor itself builds on.pick this instead when you need a simple private registry and will supply authentication, policy, and scanning elsewhere.
Zot gh↗A vendor-neutral OCI registry focused on the image and distribution specifications.pick this instead when an OCI-native registry with a smaller conceptual surface matters more than Harbor's management suite.
Project QuayAn open-source image registry with identity integrations, access controls, replication, and Clair scanning.pick this instead when Quay's operator, Clair integration, or storage model already fits your platform.

What people are saying

  1. [velocity-scout] goharbor/harbor

Sources

  1. Harbor repository and README
  2. Harbor v2.15.2 release notes
  3. Harbor installation prerequisites
  4. Harbor YML configuration guide
  5. Harbor high-availability deployment guide
  6. Harbor OIDC authentication guide
  7. Garbage collection shared-blob issue 23803
  8. Retention endpoint page-size issue 23862

More self-hosted reviews

go2rtc · rook · openfga · matomo · signoz · SmartTube · the whole board →