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.
- Part 1: New or changed APIs
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
# 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.tgzExpected output: Verified OK
Full verification guide: docs/signature-verification.md
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
- Twitter: @project_harbor
- User Group: Join Harbor user email group: [email protected] to get update of Harbor's news, features, releases, or to provide suggestion and feedback.
- Developer Group: Join Harbor developer group: [email protected] for discussion on Harbor development and contribution.
- Slack: Join Harbor's community for discussion and ask questions: Cloud Native Computing Foundation, channel: #harbor and #harbor-dev
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:
- Photon OS 1.0: docker image, license
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 APIinAPIsection
- 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,cancelledandscheduled. - More controllable actions:
stopandcancel. - Enhanced periodical jobs.
- Status web hook.
Use cases
With job service, you can:
- Submit a
Genericjob which will be executed immediately if worker resource is available and can be only execute once. - Submit a
Scheduledjob which will be executed after a specified delay. - Submit a
Periodicjob which will be repeatedly executed with specified interval. - Submit job with
uniqueflag 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
Periodicones. - Scheduler: Schedules the
Periodicjobs. - 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.
// 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
stopandcancel. - Get the
checkinfunc 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,
if cmd, ok := ctx.OPCommand(); ok {}Then, check if it is a cancel signal,
if cmd == opm.CtlCommandCancel {}finally, if it is, exit the logic and return the cancel error.
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,
if cmd, ok := ctx.OPCommand(); ok {}Then, check if it is a stop signal,
if cmd == opm.CtlCommandStop {}finally, if it is, exit the logic and return the cancel error.
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:
ctx.Checkin("30%")Job Implementation Sample
Here is a demo job:
/* 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.
{
"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.
{
"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.
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.
// 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:
#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 #daysConfiguration
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
---
#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.
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
{
"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
{
"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
// under jobservice folder
go build -a -o jobserviceSecond, 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,
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
helm repo add harbor https://helm.goharbor.ioConfigure 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:
- populate the docker/helm commands showed on portal
- populate the token service URL returned to docker client
Format: protocol://domain[:port]. Usually:
- if service exposed via
Ingress, thedomainshould be the value ofexpose.ingress.hosts.core - if service exposed via
ClusterIP, thedomainshould be the value ofexpose.clusterIP.name - if service exposed via
NodePort, thedomainshould be the IP address of one Kubernetes node - if service exposed via
LoadBalancer, set thedomainas 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
StorageClassis needed in the Kubernetes cluster to dynamically provision the volumes. Specify another StorageClass in thestorageClassor setexistingClaimif 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,s3swiftandoss.
Configure the other items listed in [configuration](#configuration) section
Install the chart
Install the Harbor helm chart with a release name my-release:
helm install my-release harbor/harborUninstallation
To uninstall/delete the my-release deployment:
helm uninstall my-releaseConfiguration
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: |
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):
[[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
git clone https://github.com/goharbor/website.git
cd websiteStep 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:
make prepareThis 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
npm iStep 4: Run Hugo in server mode
make serveThis starts up the local Hugo server on http://localhost:1313. As you make changes, the site refreshes automatically in your browser.
Checking links
To run the link checker for the Harbor website:
make check-internal-linksThis 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.
- Introduction
- Test Harbor with the Demo Server
- Harbor Compatibility List
- Harbor Installation Prerequisites
- Download the Harbor Installer
- Configure HTTPS Access to Harbor
- Configure the Harbor YML File
- Run the Installer Script
- Deploying Harbor with High Availability via Helm
- Troubleshooting Harbor Installation
- Reconfigure Harbor and Manage the Harbor Lifecycle
- Customize the Harbor Token Service
- Configure Harbor Settings at the Command Line
Harbor Administration
This section describes how to use and maintain Harbor after deployment. These day 2 operations are performed by the Harbor Administrator.
- Introduction
- Configuring Authentication
- Managing Users
- Configure Global Settings
- Configure Project Quotas
- Configuring Replication
- Vulnerability Scanning
- Garbage Collection
- Upgrade Harbor and Migrate Data
- Configure P2P Preheat
- User-defined OCI artifact
Working with Harbor Projects
This section describes how users with the developer, maintainer, and project administrator roles manage and participate in Harbor projects.
- Introduction
- Create Projects
- Project Configuration
- Working with Images, Tags, and Helm Charts
- Using API Explorer
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.
- Build Harbor from Source Code
- Developing the Harbor Frontend
- Customize the Harbor Look & Feel
- Developing for Internationalization
- Using Make
- View and test Harbor REST API via Swagger
- Registry Landscape
- E2E Test Scripting Guide
See also the list of Articles from the Harbor Community.