Harbor logo

Harbor Plugin

View information about your component's Docker images stored in a Harbor registry.

Created by @BESTSELLER

Set up Backstage in minutes with Roadie

Harbor in Backstage

Installation steps

Install the front-end plugin.

cd packages/app
yarn add @bestsellerit/backstage-plugin-harbor

Add a new Harbor tab to the entity page.

// packages/app/src/components/catalog/EntityPage.tsx
import {
} from '@bestsellerit/backstage-plugin-harbor';

const serviceEntityPage = (
    <EntityLayout.Route path="/harbor" title="Harbor">
      <EntityHarborContent />

Add the Harbor card to the Overview tab on the entity page.

// packages/app/src/components/catalog/EntityPage.tsx
const overviewContent = (
  <Grid container spacing={3} alignItems="stretch">
      <EntitySwitch.Case if={isHarborAvailable}>
        <Grid item>

Install the backend plugin.

cd packages/backend
yarn add @bestsellerit/backstage-plugin-harbor-backend

Create a new harbor.ts file with a function to create the backend plugin.

// packages/backend/src/plugins/harbor.ts
import { createRouter } from '@bestsellerit/backstage-plugin-harbor-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';

export default async function createPlugin({
}: PluginEnvironment): Promise<Router> {
  return await createRouter({ logger, config });

Integrate the backend plugin into the backend router.

// packages/backend/src/index.ts
import harbor from './plugins/harbor';

async function main() {
  // tip: add the route to the apiRouter before the apiRouter is added to the service to ensure your API routes are available
  const harborEnv = useHotMemoize(module, () => createEnv('harbor'));
  apiRouter.use('/harbor', await harbor(harborENv));

Add required configuration to connect Backstage to your Harbor instance.

# app-config.yaml
  baseUrl: https://demo.goharbor.io

Add an annotation to a component's catalog-info.yaml to link the component to its Harbor repository.

# catalog-info.yml
    goharbor.io/repository-slug: briandesousa/backstage-sample-service

Found a mistake? Update these instructions.

Things to know

Harbor is an open source registry for Docker images that can be installed on your own infrastructure. It includes many common image registry capabilities including image vulnerability scanning.

The Harbor plugin displays information about Docker images stored in your Harbor registry. Backstage catalog components can be associated to a Harbor repository. The Harbor Dashboard appears as a new tab on the catalog entity page:

Harbor dashboard close-up

A Harbor widget is also available to display a summary of vulnerabilities in your component’s Docker image. This widget can be added to any tab on the entity page:

Harbor vulnerability widget card

The plugin will only display information about images in Harbor if a vulnerability scan has been run on the image. You can enable automatic scanning on image push in Harbor project settings:

Harbor automate image scan setting


The plugin connects to Harbor with a username and password that is stored in app-config.yaml. Credentials can be defined directly in the YAML file or passed in via environment variables like this:

        baseUrl: https://demo.goharbor.io
          $env: HARBOR_USERNAME
          $env: HARBOR_PASSWORD

Consider creating a dedicated Harbor user for the connection from Backstage.

Don’t have Harbor setup yet?

A demo of Harbor is available at demo.goharbor.io. The demo allows you to create an account and push images. All accounts and images are automatically purged on a regular basis. This is a great and easy way to experiement with Harbor in Backstage.

See Conditions of Use of the Demo Server on Harbor’s website for more information.

Set up Backstage in minutes with Roadie