harbor Documentation

An open source trusted cloud native registry project that stores, signs, and scans content.

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy harbor on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name harbor -p 5000:5000 --restart always goharbor/registry-photon:__version__
Configured Services & Ports
โš™๏ธ registry
image: goharbor/registry-photon:__version__
๐Ÿ”Œ Ports: 5000:5000
โš™๏ธ postgres
image: goharbor/harbor-db:__version__
๐Ÿ”Œ Ports: 5432:5432
โš™๏ธ redis
image: goharbor/valkey-photon:__version__
๐Ÿ”Œ Ports: 6379:6379
docker-compose.yml
yaml (docker-compose.yml)
version: '2'
services:
  registry:
    image: goharbor/registry-photon:__version__
    restart: always
    volumes:
      - /data/registry:/storage
      - ./common/config/registry/:/etc/registry/
      - /etc/core/ca/ca.crt:/etc/registry/root.crt
    ports:
      - 5000:5000
    command:
      ["serve", "/etc/registry/config.yml"]
  postgres:
    image: goharbor/harbor-db:__version__
    restart: always
    volumes:
      - /data/database:/var/lib/postgresql/data:z
    env_file:
      - ./common/config/db/env
    ports:
      - 5432:5432
  redis:
    image: goharbor/valkey-photon:__version__
    restart: always
    volumes:
      - /data/redis:/var/lib/redis
    ports:
      - 6379:6379

1. Project Overview & Quickstart (goharbor/harbor)

File: README.md

Harbor







Community Meeting
The Harbor Project holds bi-weekly community calls in two different timezones. To join the community calls or to watch previous meeting notes and recordings, please visit the meeting schedule.

Note: The main branch may be in an unstable or even broken state during development.
Please use releases instead of the main branch in order to get a stable set of binaries.

Harbor is an open source trusted cloud native registry project that stores, signs, and scans content. Harbor extends the open source Docker Distribution by adding the functionalities usually required by users such as security, identity and management. Having a registry closer to the build and run environment can improve the image transfer efficiency. Harbor supports replication of images between registries, and also offers advanced security features such as user management, access control and activity auditing.

Harbor is hosted by the Cloud Native Computing Foundation (CNCF). If you are an organization that wants to help shape the evolution of cloud native technologies, consider joining the CNCF. For details about who is involved and how Harbor plays a role, read the CNCF
announcement.

Features

  • Cloud native registry: With support for both container images and Helm charts, Harbor serves as registry for cloud native environments like container runtimes and orchestration platforms.
  • Role based access control: Users access different repositories through 'projects' and a user can have different permission for images or Helm charts under a project.
  • Policy based replication: Images and charts can be replicated (synchronized) between multiple registry instances based on policies with using filters (repository, tag and label). Harbor automatically retries a replication if it encounters any errors. This can be used to assist loadbalancing, achieve high availability, and facilitate multi-datacenter deployments in hybrid and multi-cloud scenarios.
  • Vulnerability Scanning: Harbor scans images regularly for vulnerabilities and has policy checks to prevent vulnerable images from being deployed.
  • LDAP/AD support: Harbor integrates with existing enterprise LDAP/AD for user authentication and management, and supports importing LDAP groups into Harbor that can then be given permissions to specific projects.
  • OIDC support: Harbor leverages OpenID Connect (OIDC) to verify the identity of users authenticated by an external authorization server or identity provider. Single sign-on can be enabled to log into the Harbor portal.
  • Image deletion & garbage collection: System administrators can run garbage collection jobs so that images (dangling manifests and unreferenced blobs) can be deleted and their space can be freed up periodically.
  • Graphical user portal: User can easily browse, search repositories and manage projects.
  • Auditing: All the operations to the repositories are tracked through logs.
  • RESTful API: RESTful APIs are provided to facilitate administrative operations, and are easy to use for integration with external systems. An embedded Swagger UI is available for exploring and testing the API.
  • Easy deployment: Harbor can be deployed via Docker compose as well Helm Chart, and a Harbor Operator was added recently as well.

Architecture

For learning the architecture design of Harbor, check the document Architecture Overview of Harbor.

API

  • Harbor RESTful API: The APIs for most administrative operations of Harbor and can be used to perform integrations with Harbor programmatically.

Install & Run

System requirements:

On a Linux host: docker 20.10.10-ce+ and docker-compose 1.18.0+.

Download binaries of Harbor release and follow Installation & Configuration Guide to install Harbor.

If you want to deploy Harbor on Kubernetes, please use the Harbor chart.

Refer to the documentation for more details on how to use Harbor.

Verifying Release Signatures

Starting with v2.15.0, Harbor release artifacts are cryptographically signed using Cosign to ensure authenticity and integrity.

Download the installers and signature bundles from the Harbor releases page.

Quick Verification

bash
# Install Cosign (v2.0+)
brew install sigstore/tap/cosign

# Verify signature
cosign verify-blob \
  --bundle harbor-offline-installer-v2.15.0.tgz.sigstore.json \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp '^https://github.com/goharbor/harbor/.github/workflows/publish_release.yml@refs/tags/v.*$' \
  harbor-offline-installer-v2.15.0.tgz

OCI Distribution Conformance Tests

Check the OCI distribution conformance tests report of Harbor.

Compatibility

The compatibility list document provides compatibility information for the Harbor components.

Community

Demos

  • Live Demo - A demo environment with the latest Harbor stable build installed. For additional information please refer to this page.
  • Video Demos - Demos for Harbor features and continuously updated.

Partners and Users

For a list of users, please refer to ADOPTERS.md.

Security

Security Audit

A third party security audit was performed by Cure53 in October 2019. You can see the full report here.

Reporting security vulnerabilities

If you've found a security related issue, a vulnerability, or a potential vulnerability in Harbor, do not file a public issue. Report it privately via GitHub private vulnerability reporting: open the
Security tab and click Report a vulnerability. The Harbor Security Team will acknowledge your report, and will follow up in the advisory
thread once we've identified the issue positively or negatively.

For further details please see our complete security release process.

License

Harbor is available under the Apache 2 license.

This project uses open source components which have additional licensing terms. The official docker images and licensing terms for these open source components can be found at the following locations:

Fossa Status


File: api/v2.0/README.md

References

This file lists all the files that are referring the swagger yaml file.

  • Makefile
    • java -jar swagger-codegen-cli.jar generate -i api/harbor/swagger.yaml -l python -o harborclient
  • README
    • Harbor RESTful API in API section
  • docs/configure_swagger.md
    • https://raw.githubusercontent.com/goharbor/harbor/master/api/harbor/swagger.yaml
  • make/photon/portal/Dockerfile
    • COPY ./api/v2.0/swagger.yaml /build_dir/swagger.yaml
  • tests/swaggerchecker.sh
    • HARBOR_SWAGGER_FILE="https://raw.githubusercontent.com/$TRAVIS_REPO_SLUG/$TRAVIS_COMMIT/api/harbor/swagger.yaml"
    • else HARBOR_SWAGGER_FILE="https://raw.githubusercontent.com/$TRAVIS_PULL_REQUEST_SLUG/$TRAVIS_PULL_REQUEST_SHA/api/harbor/swagger.yaml"

Notes: Base path is the code repository root dir.


File: contrib/grafana-dashboard/README.md

Grafana Dashboard

This dashboard can be used to visualize metrics from the Harbor Exporter.

The dashboard was created with Grafana v8 and may not work with older versions of Grafana.

Screenshot


File: contrib/README.md

The contrib directory contains documents, scripts, and other helpful things which are contributed by the community.


File: docs/img/README.md

Note: The harbor_logo.png is referenced by the Harbor helm charts which are already released, don't remove it


File: docs/README.md

Harbor Documentation

All Harbor documentation is presented on goharbor.io/docs.

To contribute to the documentation, please head over to the website repository.


File: src/jobservice/README.md

Job Service

Job service is designed to handle and process the asynchronous background jobs with an easy way. It is built on top of gocraft/work job queue framework with supporting

  • Fast and efficient.
  • Reliable - don't lose jobs even if your process crashes.
  • If a job fails, it will be retried a specified number of times.
  • Schedule jobs to happen in the future.
  • Enqueue unique jobs so that only one job with a given name/arguments exists in the queue at once.
  • Periodically enqueue jobs on a cron-like schedule.

and the following additional capabilities:

  • Rest API.
  • Execution context.
  • More job status: error,success,stopped,cancelled and scheduled.
  • More controllable actions: stop and cancel.
  • Enhanced periodical jobs.
  • Status web hook.

Use cases

With job service, you can:

  • Submit a Generic job which will be executed immediately if worker resource is available and can be only execute once.
  • Submit a Scheduled job which will be executed after a specified delay.
  • Submit a Periodic job which will be repeatedly executed with specified interval.
  • Submit job with unique flag to make sure no duplicated jobs are executing at the same time.
  • Stop a specified job.
  • Cancel a specified job.
  • Retry a specified job (This should be a failed job and match the retrying criteria).
  • Get stats of specified job (no list jobs function).
  • Get execution log of specified job (It depends on the logger implementation).
  • Check the health status of job service.(No authentication required, it can be used as health check endpoint)

Architecture

The overall architecture of the job service is shown in the below graph:

Components:

  • API Server: A go lightweight restful API server to serve the related restful requests.
  • Configuration Manager: Responsible for handing the configurations used in job services. Two sources supported: yaml file and env variables.
  • Bootstrap: Take the responsibilities to initialize related context and start API server and worker pool. The main start point of job service.
  • Controller: The core of job service. Responsible for coordinating the whole flow of job service.
  • Job Launcher : Launch the jobs except Periodic ones.
  • Scheduler: Schedules the Periodic jobs.
  • Logger: A flexible logger framework. It will catch and write the job execution logs to the configured backends.
  • Stats Manager: Maintains the status and stats of jobs as well as status hooks.
  • Data Backend: Define storage methods to store the additional info.
  • Pool Driver: A interface layer to broke the functions of upstream job queue framework to upper layers.
  • Persistent driver: So far, only support redis.

Currently, the worker (compute node) and controller (control plane) are packaged in one process. To achieve scalability and HA functionality, multiple nodes can be deployed under a LB layer.

As described in above graph, the controller and work pool which are located in different nodes can also talk to each other via a virtual channel - the backend persistent driver. That means the job enqueued by a controller may be selected by other worker pool which is located in another node.

Programming Model

To let the job service recognize the job, the implementation of job should follow the programming model.

Job Interface

A valid job must implement the job interface. For the details of each method defined in the job interface, you can refer the comments attached with the method.

go
// Interface defines the related injection and run entry methods.
type Interface interface {
	// Declare how many times the job can be retried if failed.
	//
	// Return:
	// uint: the failure count allowed. If it is set to 0, then default value 4 is used.
	MaxFails() uint

	// Max currency of the job. Unlike the WorkerPool concurrency, it controls the limit on the number jobs of that type
	// that can be active at one time by within a single redis instance.
	//
	// The default value is 0, which means "no limit on job concurrency".
	MaxCurrency() uint

	// Tell the worker worker if retry the failed job when the fails is
	// still less that the number declared by the method 'MaxFails'.
	//
	// Returns:
	//  true for retry and false for none-retry
	ShouldRetry() bool

	// Indicate whether the parameters of job are valid.
	//
	// Return:
	// error if parameters are not valid. NOTES: If no parameters needed, directly return nil.
	Validate(params Parameters) error

	// Run the business logic here.
	// The related arguments will be injected by the workerpool.
	//
	// ctx Context                   : Job execution context.
	// params map[string]any : parameters with key-pair style for the job execution.
	//
	// Returns:
	//  error if failed to run. NOTES: If job is stopped or cancelled, a specified error should be returned
	//
	Run(ctx Context, params Parameters) error
}

Just pay attention, your main logic should be written in the Run method.

Job Context

A job context will be provided when executed the Run logic. With this context, you can

  • Get a logger handle if you want to output the execution log to the log backends.
  • Retrieve the system context reference.
  • Get job operation signal if your job supports stop and cancel.
  • Get the checkin func to check in message.
  • Get properties by key
  • Specified to harbor, db connection and all the configurations can be retrieved by context.

Cancellable Job

To make the job cancellable, some special logic should be coded in the Run logic.

First, check the signal at certain execution points,

go
if cmd, ok := ctx.OPCommand(); ok {}

Then, check if it is a cancel signal,

go
if cmd == opm.CtlCommandCancel {}

finally, if it is, exit the logic and return the cancel error.

go
return errs.JobCancelledError()

Stoppable Job

To make the job stoppable, some special logic should be coded in the Run logic.

First, check the signal at certain execution points,

go
if cmd, ok := ctx.OPCommand(); ok {}

Then, check if it is a stop signal,

go
if cmd == opm.CtlCommandStop {}

finally, if it is, exit the logic and return the cancel error.

go
return errs.JobStoppedError()

Check In Message

If you want to report more concrete status info, just call the Checkin function in the job context like the below code piece shown:

go
ctx.Checkin("30%")

Job Implementation Sample

Here is a demo job:

text
/* Detailed source-code truncated for AI context efficiency. */

Job Execution

Job execution is used to track the jobs which are related to a specified job, like parent and children jobs. If one job has executions, the following two extra properties will be appended to the job stats.

json
{
      "job": {
          "executions": ["uuid-sub-job"],
          "multiple_executions": true
      }
}

For the job execution/sub job, there will be an extra property upstream_job_id pointing to id of the upstream (/parent) job.

json
{
      "job": {
          "upstream_job_id": "parent-id"
      }
}

Under that situation, the flag multiple_executions will be set to be true. The list executions will contain all the ids of the executions (/sub jobs).

General job

Any jobs can launch new jobs through the launch function in the job context. All those jobs will be tracked as sub jobs (executions) of the caller job.

go
func (j *Job) Run(ctx job.Context, params job.Parameters) error{
    // ...
    subJob, err := ctx.LaunchJob(models.JobRequest{})
    // ...

    return nil
}

Periodic job

The job launched with Periodic kind is actually a scheduled job template which will be not run directly. The real running job will be created by cloning the configurations from the job template and run. And then each periodic job will have multiple job executions with independent id and each job execution will link to the Periodic job by the upstream_job_id.

Logger

There are two loggers here. One is for job service itself and another one is for the running jobs. Each logger can configure multi logger backends.

Each backend logger is identified by an unique name which will be used in the logger configurations to enable the corresponding loggers. Meanwhile, each backend logger MUST implement the logger.Interface. A logger can also support (optional):

  • sweeper: Sweep the outdated logs. A sweeper MUST implement sweeper.Interface
  • getter: Get the specified log data. A getter MUST implement getter.Interface

All the backend loggers SHOULD onboard via the static logger registry.

go
// knownLoggers is a static logger registry.
// All the implemented loggers (w/ sweeper) should be registered
// with an unique name in this registry. Then they can be used to
// log info.
var knownLoggers = map[string]*Declaration{
	// File logger
	LoggerNameFile: {FileFactory, FileSweeperFactory, FileGetterFactory, false},
	// STD output(both stdout and stderr) logger
	LoggerNameStdOutput: {StdFactory, nil, nil, true},
}

So far, only the following two backends are supported:

  • STD_OUTPUT: Output the log to the std stream (stdout/stderr)
  • DB: Output the log to the database with the table name job_log
  • FILE: Output the log to the log files
    • sweeper supports
    • getter supports

Configure loggers

Logger configuration options:

Option Description
loggers[x].name The unique name of the logger backend
loggers[x].level The logger level of the logger backend
loggers[x].settings A hash map to pass extra settings of the logger backend. Depends on the implementation of the backend.
loggers[x].sweeper.duration The duration of the sweeper looping
loggers[x].sweeper.settings A hash map to pass extra settings of the sweeper. Depends on the implementation of sweeper.

An example:

yaml
#Loggers
loggers:
  - name: "STD_OUTPUT" # logger backend name, only support "DB", "FILE" and "STD_OUTPUT"
    level: "DEBUG" # INFO/DEBUG/WARNING/ERROR/FATAL
  - name: "FILE"
    level: "DEBUG"
    settings: # Customized settings of logger
      base_dir: "/tmp/job_logs"
    sweeper:
      duration: 1 #days
      settings: # Customized settings of sweeper
        work_dir: "/tmp/job_logs"
  - name: "DB"
    level: "DEBUG"
    sweeper:
      duration: 1 #days

Configuration

The following configuration options are supported:

Option Description ENV variable
protocol Protocol used to serve http JOB_SERVICE_PROTOCOL
https_config.cert The tls cert if enabled https protocol JOB_SERVICE_HTTPS_CERT
https_config.key The tls key if enabled https protocol JOB_SERVICE_HTTPS_KEY
port API server listening port JOB_SERVICE_PORT
worker_pool.worker_pool The worker concurrency number JOB_SERVICE_POOL_WORKERS
worker_pool.backend The job data persistent backend driver. So far, only redis supported JOB_SERVICE_POOL_BACKEND
worker_pool.redis_pool.redis_url The redis url if backend is redis JOB_SERVICE_POOL_REDIS_URL
worker_pool.redis_pool.namespace The namespace used in redis JOB_SERVICE_POOL_REDIS_NAMESPACE
loggers Loggers for job service itself. Refer to Configure loggers
job_loggers Loggers for the running jobs. Refer to Configure loggers
core_server The harbor core server endpoint which used to retrieve Harbor configures CORE_URL

Sample

yaml
---
#Protocol used to serve
protocol: "https"

#Config certification if use 'https' protocol
https_config:
  cert: "server.crt"
  key: "server.key"

#Server listening port
port: 9443

#Worker pool
worker_pool:
  #Worker concurrency
  workers: 10
  backend: "redis"
  #Additional config if use 'redis' backend
  redis_pool:
    #redis://[arbitrary_username:password@]ipaddress:port/database_index
    #or ipaddress:port[,weight,password,database_index]
    redis_url: "localhost:6379"
    namespace: "harbor_job_service"

#Loggers for the running job
job_loggers:
  - name: "STD_OUTPUT" # logger backend name, only support "DB", "FILE" and "STD_OUTPUT"
    level: "DEBUG" # INFO/DEBUG/WARNING/ERROR/FATAL
  - name: "FILE"
    level: "DEBUG"
    settings: # Customized settings of logger
      base_dir: "/tmp/job_logs"
    sweeper:
      duration: 1 #days
      settings: # Customized settings of sweeper
        work_dir: "/tmp/job_logs"
  - name: "DB"
    level: "DEBUG"
    sweeper:
      duration: 1 #days

#Loggers for the job service
loggers:
  - name: "STD_OUTPUT" # Same with above
    level: "DEBUG"

API

Authorization

As job service is always running in the backend environment, a simple secret auth way is choose now. To call the job service API, the Authorization header must be appended.

go
Authorization : Harbor-Secret <secret>

The expected secret is passed to job service by the ENV variable CORE_SECRET.

Endpoints

POST /api/v1/jobs

Submit jobs

  • Request body
json
{
    "job": {
        "name": "demo",
        "parameters": {
            "p1": "just a demo"
        },
        "status_hook": "https://my-hook.com",
        "metadata": {
            "kind": "Generic", // or "Scheduled" or "Periodic"
            "schedule_delay": 90, // seconds, only required when kind is "Scheduled"
            "cron_spec": "* 5 * * * *", // only required when kind is "Periodic"
            "unique": false
        }
    }
}
  • Response

    • 202 Accepted
    json
    {
        "job": {
            "id": "uuid-job",
            "status": "pending",
            "name": "DEMO",
            "kind": "Generic",
            "unique": false,
            "ref_link": "/api/v1/jobs/uuid-job",
            "enqueue_time": "2018-10-10 12:00:00",
            "update_time": "2018-10-10 13:00:00",
            "multiple_executions": false // To indicate if the job has sub executions
        }
    }
    • 401/500 Error
    json
    {
        "code": 500,
        "err": "short error message",
        "description": "detailed error message"
    }

GET /api/v1/jobs/{job_id}

Get job stats

  • Response

    • 200 OK
    json
    {
        "job": {
            "id": "uuid-job",
            "status": "pending",
            "name": "DEMO",
            "kind": "Periodic",
            "unique": false,
            "ref_link": "/api/v1/jobs/uuid-job",
            "enqueue_time": 1539164886,
            "update_time": 1539164886,
            "run_at": 1539164986,
            "cron_spec": "* 5 * * * * ",
            "check_in": "check in message", // if check in message
            "check_in_at": 1539164889, // if check in message
            "die_at": 0,
            "hook_status": "http://status-check.com",
            "executions": ["uuid-sub-job"], // the ids of sub executions of the job
            "multiple_executions": true
        }
    }
    • 401/500 Error
    json
    {
        "code": 500,
        "err": "short error message",
        "description": "detailed error message"
    }

POST /api/v1/jobs/{job_id}

Stop/Cancel/Retry job

  • Request body
json
{
    "action": "stop" //or "cancel" or "retry"
}
  • Response

    • 204 No content
    • 401/404/500/501 Error
    json
    {
        "code": 500,
        "err": "short error message",
        "description": "detailed error message"
    }

GET /api/v1/jobs/{job_id}/log

Retrieve job log

  • Response

    • 200 OK

    Log text bytes

    • 401/400/404/500 Error
    json
    {
        "code": 500,
        "err": "short error message",
        "description": "detailed error message"
    }

GET /api/v1/stats

Check job service healthy status

  • Response

    • 200 OK
    json
    [{
        "worker_pool_id": "pool1",
        "started_at": 1539164886,
        "heartbeat_at": 1539164986,
        "job_names": ["DEMO"],
        "concurrency": 10,
        "status": "healthy"
    }]
    • 401/500 Error
    json
    {
        "code": 500,
        "err": "short error message",
        "description": "detailed error message"
    }

How to Run

It's easy to run the job service.

  • First, compile and build the binary
go
// under jobservice folder
go build -a -o jobservice
  • Second, create configuration yaml file and configure the job service.

  • Then, export the secret via ENV variable CORE_SECRET.

  • Finally, start the service with the following command,

shell
jobservice -c <config_yaml_file_path>

Enjoy it!


File: src/pkg/chart/testdata/harbor-schema2/README.md

Helm Chart for Harbor

Notes: The master branch is in heavy development, please use the other stable versions instead. A highly available solution for Harbor based on chart can be found here. And refer to the guide to upgrade the existing deployment.

This repository, including the issues, focuses on deploying Harbor chart via helm. For functionality issues or Harbor questions, please open issues on goharbor/harbor

Introduction

This Helm chart installs Harbor in a Kubernetes cluster. Welcome to contribute to Helm Chart for Harbor.

Prerequisites

  • Kubernetes cluster 1.20+
  • Helm v3.2.0+

Installation

Add Helm repository

bash
helm repo add harbor https://helm.goharbor.io

Configure the chart

The following items can be set via --set flag during installation or configured by editing the values.yaml directly (need to download the chart first).

Configure how to expose Harbor service

  • Ingress: The ingress controller must be installed in the Kubernetes cluster.
    Notes: if TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to issue #5291 for details.
  • ClusterIP: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster.
  • NodePort: Exposes the service on each Nodeโ€™s IP at a static port (the NodePort). Youโ€™ll be able to contact the NodePort service, from outside the cluster, by requesting NodeIP:NodePort.
  • LoadBalancer: Exposes the service externally using a cloud providerโ€™s load balancer.

Configure the external URL

The external URL for Harbor core service is used to:

  1. populate the docker/helm commands showed on portal
  2. populate the token service URL returned to docker client

Format: protocol://domain[:port]. Usually:

  • if service exposed via Ingress, the domain should be the value of expose.ingress.hosts.core
  • if service exposed via ClusterIP, the domain should be the value of expose.clusterIP.name
  • if service exposed via NodePort, the domain should be the IP address of one Kubernetes node
  • if service exposed via LoadBalancer, set the domain as your own domain name and add a CNAME record to map the domain name to the one you got from the cloud provider

If Harbor is deployed behind the proxy, set it as the URL of proxy.

Configure how to persist data

  • Disable: The data does not survive the termination of a pod.
  • Persistent Volume Claim(default): A default StorageClass is needed in the Kubernetes cluster to dynamically provision the volumes. Specify another StorageClass in the storageClass or set existingClaim if you already have existing persistent volumes to use.
  • External Storage(only for images and charts): For images and charts, the external storages are supported: azure, gcs, s3 swift and oss.

Configure the other items listed in [configuration](#configuration) section

Install the chart

Install the Harbor helm chart with a release name my-release:

bash
helm install my-release harbor/harbor

Uninstallation

To uninstall/delete the my-release deployment:

bash
helm uninstall my-release

Configuration

The following table lists the configurable parameters of the Harbor chart and the default values.

Parameter Description Default
Expose
expose.type How to expose the service: ingress, clusterIP, nodePort or loadBalancer, other values will be ignored and the creation of service will be skipped. ingress
expose.tls.enabled Enable TLS or not. Delete the ssl-redirect annotations in expose.ingress.annotations when TLS is disabled and expose.type is ingress. Note: if the expose.type is ingress and TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to https://github.com/goharbor/harbor/issues/5291 for details. true
expose.tls.certSource The source of the TLS certificate. Set as auto, secret or none and fill the information in the corresponding section: 1) auto: generate the TLS certificate automatically 2) secret: read the TLS certificate from the specified secret. The TLS certificate can be generated manually or by cert manager 3) none: configure no TLS certificate for the ingress. If the default TLS certificate is configured in the ingress controller, choose this option auto
expose.tls.auto.commonName The common name used to generate the certificate, it's necessary when the type isn't ingress
expose.tls.secret.secretName The name of secret which contains keys named: tls.crt - the certificate; tls.key - the private key
expose.ingress.hosts.core The host of Harbor core service in ingress rule core.harbor.domain
expose.ingress.controller The ingress controller type. Currently supports default, gce, alb, f5-bigip and ncp default
expose.ingress.kubeVersionOverride Allows the ability to override the kubernetes version used while templating the ingress
expose.ingress.annotations The annotations used commonly for ingresses
expose.ingress.labels The labels specific to ingress {}
expose.clusterIP.name The name of ClusterIP service harbor
expose.clusterIP.annotations The annotations attached to the ClusterIP service {}
expose.clusterIP.ports.httpPort The service port Harbor listens on when serving HTTP 80
expose.clusterIP.ports.httpsPort The service port Harbor listens on when serving HTTPS 443
expose.clusterIP.annotations The annotations used commonly for clusterIP
expose.clusterIP.labels The labels specific to clusterIP {}
expose.nodePort.name The name of NodePort service harbor
expose.nodePort.ports.http.port The service port Harbor listens on when serving HTTP 80
expose.nodePort.ports.http.nodePort The node port Harbor listens on when serving HTTP 30002
expose.nodePort.ports.https.port The service port Harbor listens on when serving HTTPS 443
expose.nodePort.ports.https.nodePort The node port Harbor listens on when serving HTTPS 30003
expose.nodePort.annotations The annotations used commonly for nodePort
expose.nodePort.labels The labels specific to nodePort {}
expose.loadBalancer.name The name of service harbor
expose.loadBalancer.IP The IP of the loadBalancer. It only works when loadBalancer supports assigning IP ""
expose.loadBalancer.ports.httpPort The service port Harbor listens on when serving HTTP 80
expose.loadBalancer.ports.httpsPort The service port Harbor listens on when serving HTTPS 30002
expose.loadBalancer.annotations The annotations attached to the loadBalancer service {}
expose.loadBalancer.labels The labels specific to loadBalancer {}
expose.loadBalancer.sourceRanges List of IP address ranges to assign to loadBalancerSourceRanges []
Internal TLS
internalTLS.enabled Enable TLS for the components (core, jobservice, portal, registry, trivy) false
internalTLS.strong_ssl_ciphers Enable strong ssl ciphers for nginx and portal false
internalTLS.certSource Method to provide TLS for the components, options are auto, manual, secret. auto
internalTLS.trustCa The content of trust CA, only available when certSource is manual. Note: all the internal certificates of the components must be issued by this CA
internalTLS.core.secretName The secret name for core component, only available when certSource is secret. The secret must contain keys named: ca.crt - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, tls.crt - the content of the TLS cert file, tls.key - the content of the TLS key file.
internalTLS.core.crt Content of core's TLS cert file, only available when certSource is manual
internalTLS.core.key Content of core's TLS key file, only available when certSource is manual
internalTLS.jobservice.secretName The secret name for jobservice component, only available when certSource is secret. The secret must contain keys named: ca.crt - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, tls.crt - the content of the TLS cert file, tls.key - the content of the TLS key file.
internalTLS.jobservice.crt Content of jobservice's TLS cert file, only available when certSource is manual
internalTLS.jobservice.key Content of jobservice's TLS key file, only available when certSource is manual
internalTLS.registry.secretName The secret name for registry component, only available when certSource is secret. The secret must contain keys named: ca.crt - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, tls.crt - the content of the TLS cert file, tls.key - the content of the TLS key file.
internalTLS.registry.crt Content of registry's TLS cert file, only available when certSource is manual
internalTLS.registry.key Content of registry's TLS key file, only available when certSource is manual
internalTLS.portal.secretName The secret name for portal component, only available when certSource is secret. The secret must contain keys named: ca.crt - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, tls.crt - the content of the TLS cert file, tls.key - the content of the TLS key file.
internalTLS.portal.crt Content of portal's TLS cert file, only available when certSource is manual
internalTLS.portal.key Content of portal's TLS key file, only available when certSource is manual
internalTLS.trivy.secretName The secret name for trivy component, only available when certSource is secret. The secret must contain keys named: ca.crt - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, tls.crt - the content of the TLS cert file, tls.key - the content of the TLS key file.
internalTLS.trivy.crt Content of trivy's TLS cert file, only available when certSource is manual
internalTLS.trivy.key Content of trivy's TLS key file, only available when certSource is manual
IPFamily
ipFamily.ipv4.enabled if cluster is ipv4 enabled, all ipv4 related configs will set correspondingly, but currently it only affects the nginx related components ๏ฝœ true
ipFamily.ipv6.enabled if cluster is ipv6 enabled, all ipv6 related configs will set correspondingly, but currently it only affects the nginx related components ๏ฝœ true
Persistence
persistence.enabled Enable the data persistence or not true
persistence.resourcePolicy Setting it to keep to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted. Does not affect PVCs created for internal database and redis components. keep
persistence.persistentVolumeClaim.registry.existingClaim Use the existing PVC which must be created manually before bound, and specify the subPath if the PVC is shared with other components
persistence.persistentVolumeClaim.registry.storageClass Specify the storageClass used to provision the volume. Or the default StorageClass will be used (the default). Set it to - to disable dynamic provisioning
persistence.persistentVolumeClaim.registry.subPath The sub path used in the volume
persistence.persistentVolumeClaim.registry.accessMode The access mode of the volume ReadWriteOnce
persistence.persistentVolumeClaim.registry.size The size of the volume 5Gi
persistence.persistentVolumeClaim.registry.annotations The annotations of the volume
persistence.persistentVolumeClaim.jobservice.jobLog.existingClaim Use the existing PVC which must be created manually before bound, and specify the subPath if the PVC is shared with other components.
persistence.persistentVolumeClaim.jobservice.jobLog.storageClass Specify the storageClass used to provision the volume. Or the default StorageClass will be used (the default). Set it to - to disable dynamic provisioning
persistence.persistentVolumeClaim.jobservice.jobLog.subPath The sub path used in the volume
persistence.persistentVolumeClaim.jobservice.jobLog.accessMode The access mode of the volume ReadWriteOnce
persistence.persistentVolumeClaim.jobservice.jobLog.size The size of the volume 1Gi
persistence.persistentVolumeClaim.jobservice.jobLog.annotations The annotations of the volume
persistence.persistentVolumeClaim.database.existingClaim Use the existing PVC which must be created manually before bound, and specify the subPath if the PVC is shared with other components. If external database is used, the setting will be ignored
persistence.persistentVolumeClaim.database.storageClass Specify the storageClass used to provision the volume. Or the default StorageClass will be used (the default). Set it to - to disable dynamic provisioning. If external database is used, the setting will be ignored
persistence.persistentVolumeClaim.database.subPath The sub path used in the volume. If external database is used, the setting will be ignored
persistence.persistentVolumeClaim.database.accessMode The access mode of the volume. If external database is used, the setting will be ignored ReadWriteOnce
persistence.persistentVolumeClaim.database.size The size of the volume. If external database is used, the setting will be ignored 1Gi
persistence.persistentVolumeClaim.database.annotations The annotations of the volume
persistence.persistentVolumeClaim.redis.existingClaim Use the existing PVC which must be created manually before bound, and specify the subPath if the PVC is shared with other components. If external Redis is used, the setting will be ignored
persistence.persistentVolumeClaim.redis.storageClass Specify the storageClass used to provision the volume. Or the default StorageClass will be used (the default). Set it to - to disable dynamic provisioning. If external Redis is used, the setting will be ignored
persistence.persistentVolumeClaim.redis.subPath The sub path used in the volume. If external Redis is used, the setting will be ignored
persistence.persistentVolumeClaim.redis.accessMode The access mode of the volume. If external Redis is used, the setting will be ignored ReadWriteOnce
persistence.persistentVolumeClaim.redis.size The size of the volume. If external Redis is used, the setting will be ignored 1Gi
persistence.persistentVolumeClaim.redis.annotations The annotations of the volume
persistence.persistentVolumeClaim.trivy.existingClaim Use the existing PVC which must be created manually before bound, and specify the subPath if the PVC is shared with other components
persistence.persistentVolumeClaim.trivy.storageClass Specify the storageClass used to provision the volume. Or the default StorageClass will be used (the default). Set it to - to disable dynamic provisioning
persistence.persistentVolumeClaim.trivy.subPath The sub path used in the volume
persistence.persistentVolumeClaim.trivy.accessMode The access mode of the volume ReadWriteOnce
persistence.persistentVolumeClaim.trivy.size The size of the volume 1Gi
persistence.persistentVolumeClaim.trivy.annotations The annotations of the volume
persistence.imageChartStorage.disableredirect The configuration for managing redirects from content backends. For backends which not supported it (such as using minio for s3 storage type), please set it to true to disable redirects. Refer to the guide for more details false
persistence.imageChartStorage.caBundleSecretName Specify the caBundleSecretName if the storage service uses a self-signed certificate. The secret must contain keys named ca.crt which will be injected into the trust store of registry's and containers.
persistence.imageChartStorage.type The type of storage for images and charts: filesystem, azure, gcs, s3, swift or oss. The type must be filesystem if you want to use persistent volumes for registry. Refer to the guide for more details filesystem
persistence.imageChartStorage.gcs.existingSecret An existing secret containing the gcs service account json key. The key must be gcs-key.json. ""
persistence.imageChartStorage.gcs.useWorkloadIdentity A boolean to allow the use of workloadidentity in a GKE cluster. To use it, create a kubernetes service account and set the name in the key serviceAccountName of each component, then allow automounting the service account. false
General
externalURL The external URL for Harbor core service https://core.harbor.domain
caBundleSecretName The custom CA bundle secret name, the secret must contain key named "ca.crt" which will be injected into the trust store for core, jobservice, registry, trivy components.
uaaSecretName If using external UAA auth which has a self signed cert, you can provide a pre-created secret containing it under the key ca.crt.
imagePullPolicy The image pull policy
imagePullSecrets The imagePullSecrets names for all deployments
updateStrategy.type The update strategy for deployments with persistent volumes(jobservice, registry): RollingUpdate or Recreate. Set it as Recreate when RWM for volumes isn't supported RollingUpdate
logLevel The log level: debug, info, warning, error or fatal info
harborAdminPassword The initial password of Harbor admin. Change it from portal after launching Harbor Harbor12345
existingSecretAdminPassword The name of secret where admin password can be found.
existingSecretAdminPasswordKey The name of the key in the secret where to find harbor admin password Harbor HARBOR_ADMIN_PASSWORD
caSecretName The name of the secret which contains key named ca.crt. Setting this enables the download link on portal to download the CA certificate when the certificate isn't generated automatically
secretKey The key used for encryption. Must be a string of 16 chars not-a-secure-key
existingSecretSecretKey An existing secret containing the encoding secretKey ""
proxy.httpProxy The URL of the HTTP proxy server
proxy.httpsProxy The URL of the HTTPS proxy server
proxy.noProxy The URLs that the proxy settings not apply to 127.0.0.1,localhost,.local,.internal
proxy.components The component list that the proxy settings apply to core, jobservice, trivy
enableMigrateHelmHook Run the migration job via helm hook, if it is true, the database migration will be separated from harbor-core, run with a preupgrade job migration-job false
Nginx (if service exposed via ingress, Nginx will not be used)
nginx.image.repository Image repository goharbor/nginx-photon
nginx.image.tag Image tag dev
nginx.replicas The replica count 1
nginx.revisionHistoryLimit The revision history limit 10
nginx.resources The resources to allocate for container undefined
nginx.automountServiceAccountToken Mount serviceAccountToken? false
nginx.nodeSelector Node labels for pod assignment {}
nginx.tolerations Tolerations for pod assignment []
nginx.affinity Node/Pod affinities {}
nginx.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
nginx.podAnnotations Annotations to add to the nginx pod {}
nginx.priorityClassName The priority class to run the pod as
Portal
portal.image.repository Repository for portal image goharbor/harbor-portal
portal.image.tag Tag for portal image dev
portal.replicas The replica count 1
portal.revisionHistoryLimit The revision history limit 10
portal.resources The resources to allocate for container undefined
portal.automountServiceAccountToken Mount serviceAccountToken? false
portal.nodeSelector Node labels for pod assignment {}
portal.tolerations Tolerations for pod assignment []
portal.affinity Node/Pod affinities {}
portal.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
portal.podAnnotations Annotations to add to the portal pod {}
portal.serviceAnnotations Annotations to add to the portal service {}
portal.priorityClassName The priority class to run the pod as
portal.initContainers Init containers to be run before the controller's container starts. []
Core
core.image.repository Repository for Harbor core image goharbor/harbor-core
core.image.tag Tag for Harbor core image dev
core.replicas The replica count 1
core.revisionHistoryLimit The revision history limit 10
core.startupProbe.initialDelaySeconds The initial delay in seconds for the startup probe 10
core.resources The resources to allocate for container undefined
core.automountServiceAccountToken Mount serviceAccountToken? false
core.nodeSelector Node labels for pod assignment {}
core.tolerations Tolerations for pod assignment []
core.affinity Node/Pod affinities {}
core.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
core.podAnnotations Annotations to add to the core pod {}
core.serviceAnnotations Annotations to add to the core service {}
core.configureUserSettings A JSON string to set in the environment variable CONFIG_OVERWRITE_JSON to configure user settings. See the official docs.
core.quotaUpdateProvider The provider for updating project quota(usage), there are 2 options, redis or db. By default it is implemented by db but you can configure it to redis which can improve the performance of high concurrent pushing to the same project, and reduce the database connections spike and occupies. Using redis will bring up some delay for quota usage updation for display, so only suggest switch provider to redis if you were ran into the db connections spike around the scenario of high concurrent pushing to same project, no improvment for other scenes. db
core.secret Secret is used when core server communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars.
core.secretName Fill the name of a kubernetes secret if you want to use your own TLS certificate and private key for token encryption/decryption. The secret must contain keys named: tls.crt - the certificate and tls.key - the private key. The default key pair will be used if it isn't set
core.tokenKey PEM-formatted RSA private key used to sign service tokens. Only used if core.secretName is unset. If set, core.tokenCert MUST also be set.
core.tokenCert PEM-formatted certificate signed by core.tokenKey used to validate service tokens. Only used if core.secretName is unset. If set, core.tokenKey MUST also be set.
core.xsrfKey The XSRF key. Will be generated automatically if it isn't specified
core.priorityClassName The priority class to run the pod as
core.artifactPullAsyncFlushDuration The time duration for async update artifact pull_time and repository pull_count
core.gdpr.deleteUser Enable GDPR compliant user delete false
core.gdpr.auditLogsCompliant Enable GDPR compliant for audit logs by changing username to its CRC32 value if that user was deleted from the system false
core.initContainers Init containers to be run before the controller's container starts. []
Jobservice
jobservice.image.repository Repository for jobservice image goharbor/harbor-jobservice
jobservice.image.tag Tag for jobservice image dev
jobservice.replicas The replica count 1
jobservice.revisionHistoryLimit The revision history limit 10
jobservice.maxJobWorkers The max job workers 10
jobservice.jobLoggers The loggers for jobs: file, database or stdout [file]
jobservice.loggerSweeperDuration The jobLogger sweeper duration in days (ignored if jobLoggers is set to stdout) 14
jobservice.notification.webhook_job_max_retry The maximum retry of webhook sending notifications 3
jobservice.notification.webhook_job_http_client_timeout The http client timeout value of webhook sending notifications 3
jobservice.reaper.max_update_hours the max time to wait for a task to finish, if unfinished after max_update_hours, the task will be mark as error, but the task will continue to run, default value is 24 24
jobservice.reaper.max_dangling_hours the max time for execution in running state without new task created 168
jobservice.resources The resources to allocate for container undefined
jobservice.automountServiceAccountToken Mount serviceAccountToken? false
jobservice.nodeSelector Node labels for pod assignment {}
jobservice.tolerations Tolerations for pod assignment []
jobservice.affinity Node/Pod affinities {}
jobservice.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
jobservice.podAnnotations Annotations to add to the jobservice pod {}
jobservice.priorityClassName The priority class to run the pod as
jobservice.secret Secret is used when job service communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars.
jobservice.initContainers Init containers to be run before the controller's container starts. []
Registry
registry.registry.image.repository Repository for registry image goharbor/registry-photon
registry.registry.image.tag Tag for registry image dev
registry.registry.resources The resources to allocate for container undefined
registry.controller.image.repository Repository for registry controller image goharbor/harbor-registryctl
registry.controller.image.tag Tag for registry controller image dev
registry.controller.resources The resources to allocate for container undefined
registry.replicas The replica count 1
registry.revisionHistoryLimit The revision history limit 10
registry.nodeSelector Node labels for pod assignment {}
registry.automountServiceAccountToken Mount serviceAccountToken? false
registry.tolerations Tolerations for pod assignment []
registry.affinity Node/Pod affinities {}
registry.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
registry.middleware Middleware is used to add support for a CDN between backend storage and docker pull recipient. See official docs.
registry.podAnnotations Annotations to add to the registry pod {}
registry.priorityClassName The priority class to run the pod as
registry.secret Secret is used to secure the upload state from client and registry storage backend. See official docs. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars.
registry.credentials.username The username that harbor core uses internally to access the registry instance. Together with the registry.credentials.password, a htpasswd is created. This is an alternative to providing registry.credentials.htpasswdString. For more details see official docs. harbor_registry_user
registry.credentials.password The password that harbor core uses internally to access the registry instance. Together with the registry.credentials.username, a htpasswd is created. This is an alternative to providing registry.credentials.htpasswdString. For more details see official docs. It is suggested you update this value before installation. harbor_registry_password
registry.credentials.existingSecret An existing secret containing the password for accessing the registry instance, which is hosted by htpasswd auth mode. More details see official docs. The key must be REGISTRY_PASSWD ""
registry.credentials.htpasswdString Login and password in htpasswd string format. Excludes registry.credentials.username and registry.credentials.password. May come in handy when integrating with tools like argocd or flux. This allows the same line to be generated each time the template is rendered, instead of the htpasswd function from helm, which generates different lines each time because of the salt. undefined
registry.relativeurls If true, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. Needed if harbor is behind a reverse proxy false
registry.upload_purging.enabled If true, enable purge _upload directories true
registry.upload_purging.age Remove files in _upload directories which exist for a period of time, default is one week. 168h
registry.upload_purging.interval The interval of the purge operations 24h
registry.upload_purging.dryrun If true, enable dryrun for purging _upload, default false false
registry.initContainers Init containers to be run before the controller's container starts. []
Trivy
trivy.enabled The flag to enable Trivy scanner true
trivy.image.repository Repository for Trivy adapter image goharbor/trivy-adapter-photon
trivy.image.tag Tag for Trivy adapter image dev
trivy.resources The resources to allocate for Trivy adapter container
trivy.automountServiceAccountToken Mount serviceAccountToken? false
trivy.replicas The number of Pod replicas 1
trivy.debugMode The flag to enable Trivy debug mode false
trivy.vulnType Comma-separated list of vulnerability types. Possible values os and library. os,library
trivy.severity Comma-separated list of severities to be checked UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL
trivy.ignoreUnfixed The flag to display only fixed vulnerabilities false
trivy.insecure The flag to skip verifying registry certificate false
trivy.skipUpdate The flag to disable Trivy DB downloads from GitHub false
trivy.skipJavaDBUpdate If the flag is enabled you have to manually download the trivy-java.db file Trivy Java DB and mount it in the /home/scanner/.cache/trivy/java-db/trivy-java.db path false
trivy.offlineScan The flag prevents Trivy from sending API requests to identify dependencies. false
trivy.securityCheck Comma-separated list of what security issues to detect. Possible values are vuln, config and secret. vuln
trivy.timeout The duration to wait for scan completion 5m0s
trivy.gitHubToken The GitHub access token to download Trivy DB (see GitHub rate limiting)
trivy.priorityClassName The priority class to run the pod as
trivy.topologySpreadConstraints The priority class to run the pod as
trivy.initContainers Init containers to be run before the controller's container starts. []
Database
database.type If external database is used, set it to external internal
database.internal.image.repository Repository for database image goharbor/harbor-db
database.internal.image.tag Tag for database image dev
database.internal.password The password for database changeit
database.internal.shmSizeLimit The limit for the size of shared memory for internal PostgreSQL, conventionally it's around 50% of the memory limit of the container 512Mi
database.internal.resources The resources to allocate for container undefined
database.internal.automountServiceAccountToken Mount serviceAccountToken? false
database.internal.initContainer.migrator.resources The resources to allocate for the database migrator initContainer undefined
database.internal.initContainer.permissions.resources The resources to allocate for the database permissions initContainer undefined
database.internal.nodeSelector Node labels for pod assignment {}
database.internal.tolerations Tolerations for pod assignment []
database.internal.affinity Node/Pod affinities {}
database.internal.priorityClassName The priority class to run the pod as
database.internal.livenessProbe.timeoutSeconds The timeout used in liveness probe; 1 to 5 seconds 1
database.internal.readinessProbe.timeoutSeconds The timeout used in readiness probe; 1 to 5 seconds 1
database.internal.extrInitContainers Extra init containers to be run before the database's container starts. []
database.external.host The hostname of external database 192.168.0.1
database.external.port The port of external database 5432
database.external.username The username of external database user
database.external.password The password of external database password
database.external.coreDatabase The database used by core service registry
database.external.existingSecret An existing password containing the database password. the key must be password. ""
database.external.sslmode Connection method of external database (require, verify-full, verify-ca, disable) disable
database.maxIdleConns The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained. 50
database.maxOpenConns The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections. 100
database.podAnnotations Annotations to add to the database pod {}
Redis
redis.type If external redis is used, set it to external internal
redis.internal.image.repository Repository for redis image goharbor/redis-photon
redis.internal.image.tag Tag for redis image dev
redis.internal.resources The resources to allocate for container undefined
redis.internal.automountServiceAccountToken Mount serviceAccountToken? false
redis.internal.nodeSelector Node labels for pod assignment {}
redis.internal.tolerations Tolerations for pod assignment []
redis.internal.affinity Node/Pod affinities {}
redis.internal.priorityClassName The priority class to run the pod as
redis.internal.jobserviceDatabaseIndex The database index for jobservice 1
redis.internal.registryDatabaseIndex The database index for registry 2
redis.internal.trivyAdapterIndex The database index for trivy adapter 5
redis.internal.harborDatabaseIndex The database index for harbor miscellaneous business logic 0
redis.internal.cacheLayerDatabaseIndex The database index for harbor cache layer 0
redis.internal.initContainers Init containers to be run before the redis's container starts. []
redis.external.addr The addr of external Redis: :. When using sentinel, it should be :,:,: 192.168.0.2:6379
redis.external.sentinelMasterSet The name of the set of Redis instances to monitor
redis.external.coreDatabaseIndex The database index for core 0
redis.external.jobserviceDatabaseIndex The database index for jobservice 1
redis.external.registryDatabaseIndex The database index for registry 2
redis.external.trivyAdapterIndex The database index for trivy adapter 5
redis.external.harborDatabaseIndex The database index for harbor miscellaneous business logic 0
redis.external.cacheLayerDatabaseIndex The database index for harbor cache layer 0
redis.external.username The username of external Redis
redis.external.password The password of external Redis
redis.external.existingSecret Use an existing secret to connect to redis. The key must be REDIS_PASSWORD. ""
redis.podAnnotations Annotations to add to the redis pod {}
Exporter
exporter.replicas The replica count 1
exporter.revisionHistoryLimit The revision history limit 10
exporter.podAnnotations Annotations to add to the exporter pod {}
exporter.image.repository Repository for redis image goharbor/harbor-exporter
exporter.image.tag Tag for exporter image dev
exporter.nodeSelector Node labels for pod assignment {}
exporter.tolerations Tolerations for pod assignment []
exporter.affinity Node/Pod affinities {}
exporter.topologySpreadConstraints Constraints that define how Pods are spread across failure-domains like regions or availability zones []
exporter.automountServiceAccountToken Mount serviceAccountToken? false
exporter.cacheDuration the cache duration for information that exporter collected from Harbor 30
exporter.cacheCleanInterval cache clean interval for information that exporter collected from Harbor 14400
exporter.priorityClassName The priority class to run the pod as
Metrics
metrics.enabled if enable harbor metrics false
metrics.core.path the url path for core metrics /metrics
metrics.core.port the port for core metrics 8001
metrics.registry.path the url path for registry metrics /metrics
metrics.registry.port the port for registry metrics 8001
metrics.exporter.path the url path for exporter metrics /metrics
metrics.exporter.port the port for exporter metrics 8001
metrics.serviceMonitor.enabled create prometheus serviceMonitor. Requires prometheus CRD's false
metrics.serviceMonitor.additionalLabels additional labels to upsert to the manifest ""
metrics.serviceMonitor.interval scrape period for harbor metrics ""
metrics.serviceMonitor.metricRelabelings metrics relabel to add/mod/del before ingestion []
metrics.serviceMonitor.relabelings relabels to add/mod/del to sample before scrape []
Trace
trace.enabled Enable tracing or not false
trace.provider The tracing provider: jaeger or otel. jaeger should be 1.26+ jaeger
trace.sample_rate Set sample_rate to 1 if you want sampling 100% of trace data; set 0.5 if you want sampling 50% of trace data, and so forth 1
trace.namespace Namespace used to differentiate different harbor services
trace.attributes attributes is a key value dict contains user defined attributes used to initialize trace provider
trace.jaeger.endpoint The endpoint of jaeger http://hostname:14268/api/traces
trace.jaeger.username The username of jaeger
trace.jaeger.password The password of jaeger
trace.jaeger.agent_host The agent host of jaeger
trace.jaeger.agent_port The agent port of jaeger 6831
trace.otel.endpoint The endpoint of otel hostname:4318
trace.otel.url_path The URL path of otel /v1/traces
trace.otel.compression Whether enable compression or not for otel false
trace.otel.insecure Whether establish insecure connection or not for otel true
trace.otel.timeout The timeout in seconds of otel 10
Cache
cache.enabled Enable cache layer or not false
cache.expireHours The expire hours of cache layer 24

2. Official Technical Reference & Guides (goharbor/website)

File: README.md

The Harbor website

This repo houses the assets used to build the Harbor website, available at https://goharbor.io.

Tools

The website is built and developed using the Hugo static site generator.

Instructions for installing Hugo can be found here. Use the version of Hugo specified by the HUGO_VERSION environment variable in the netlify.toml configuration file, and make sure to install the "extended" version of Hugo with support for Hugo Pipes.

backport is used to backport PRs into different release branches.

Website content

The content for the Harbor blog is in content/blog, while the content for the Harbor documentation is in the docs folder.

The latest (edge) version of the documentation lives in the docs folder on the main branch, and is always viewable on https://goharbor.io/docs/edge. Documentation for specific released versions lives in its own release branch, for example release-2.1.0.

Creating a PR

In general, all PRs should be made against the main branch to update the edge version of the docs. If you are making a change that also affects released versions, indicate which release branches to update in your PR so a website maintainer can backport your changes.

If you are making a change that is specific to a single released version of documentation, make a PR against that branch (release-X). For example, if you are fixing something specific to v2.1.0 you should make a PR against the release-2.1.0 branch only. If you are fixing something that impacts v2.1.0 docs and all future versions, you should make the PR against the main branch so the change can also be backported to the v2.1.0 docs.

A preview of your changes is viewable through the Netlify preview linked in the PR tests. Use this to verify that your changes look good before asking the maintainers for a review. When updating the edge version make sure you add /docs/edge/ to the preview URL to see your changes.

Creating release docs

When creating docs for a new release, please create a branch with the format release-X.Y.Z.
When you want to make these docs available through the dropdown menu, put the following into the config.toml file, above all other versions (versions are linked based on order in the config file):

text
[[params.versions]]
harborversion = "X.Y.Z"
helmversion = "1.3"
branchname = "release-X.Y.Z"

As last step, update the _index.md file with the new version number and correct links.

After a release, update the backport tool configuration file, .backportrc.json, with the new release branch name.

CSS

The CSS for the site is built from Sass inputs in the assets/sass directory. There is also a small amount of JavaScript logic for the site in assets/js/app.js.

Publishing the website

The Harbor website is published automatically on the Netlify platform. Whenever changes are merged, the site is re-built and re-deployed, usually within about one minute.

Run the Harbor website locally

Step 1: Clone project

sh
git clone https://github.com/goharbor/website.git
cd website

Step 2: Load documentation content

The Markdown content for the Harbor docs is drawn from the docs folder and the release-X branches. To pull that content into your local website repo:

sh
make prepare

This copies the docs directory and the release-X branches into this repo's content folder, separated by versions, where it can be processed by Hugo.

Step 3: Install npm dependencies

sh
npm i

Step 4: Run Hugo in server mode

sh
make serve

This starts up the local Hugo server on http://localhost:1313. As you make changes, the site refreshes automatically in your browser.

To run the link checker for the Harbor website:

sh
make check-internal-links

This command builds the site (including drafts and future content), downloads the htmltest link checker into your local directory, and runs the checker in accordance with the configuration specified in .htmltest.yml. Only internal links are checked and all errors are piped to stdout.

License


File: docs/README.md

Harbor Documentation

This is the main table of contents for the Harbor 2.1.x documentation.

Harbor Installation and Configuration

This section describes how to install Harbor and perform the required initial configurations. These day 1 operations are performed by the Harbor Administrator.

Harbor Administration

This section describes how to use and maintain Harbor after deployment. These day 2 operations are performed by the Harbor Administrator.

Working with Harbor Projects

This section describes how users with the developer, maintainer, and project administrator roles manage and participate in Harbor projects.

Build, Customize, and Contribute to Harbor

This section describes how developers can build from Harbor source code, customize their deployments, and contribute to the open-source Harbor project.

See also the list of Articles from the Harbor Community.