Skip to main content
Version: v1

Run with Docker

Get your DevPortal instance running in under 5 minutes.

Run DevPortal with Docker

This guide explains how to run the VeeCode DevPortal using standard Docker commands. This is useful for quick testing, local development, or if you prefer not to use the VKDR CLI.

Prerequisites

Quick Start (Docker Run)

You can simply run the following command to start a DevPortal instance locally:

# check for latest release
docker run --rm --name devportal -d -p 7007:7007 veecode/devportal:latest

This will start a DevPortal instance running on http://localhost:7007.

note

The default behavior enables "guest" authentication as an admin user. The default catalog will be populated with a built-in catalog for demo purposes.

You can stop this container with:

docker stop devportal

Quick Start (Docker Compose)

Alternatively, you can use docker compose to start a DevPortal instance locally with exactly the same result:.

Create a docker-compose.yml file:

services:
devportal:
image: veecode/devportal:latest
ports:
- "7007:7007"

Run it with:

docker compose up -d

Stop it with:

docker compose down

What you get

The DevPortal instance will be running on http://localhost:7007, with very limited functionality but still a good starting point.

Setup Defaults

Points to notice:

  • "Guest" authentication enabled as an admin user ("user:default/admin", "group:default/admins", "role:default/admin" with all permissions granted).
  • The catalog is populated with built-in demo entities (see What's in the demo catalog below).
  • The container loads several config files in a defined precedence order. Your custom file at /app/app-config.local.yaml overrides the base and profile defaults. See Custom Configuration for the full merge order.
  • There are many plugins already bundled in the container image, ready to be enabled. You can mount the /app/dynamic-plugins.yaml plugin file to enable those you want to use.

We will talk more about these subjects later on, but understand there are many possible ways to extend and configure DevPortal container without rebuilding it (or making a derived image).

What's in the demo catalog

When you run veecode/devportal:latest with no custom config, the catalog is not empty by accident — it is populated from /app/examples/ inside the image. Knowing what's in there matters because (a) you can read these files as concrete examples of how every entity kind is declared, and (b) you need a strategy for replacing them when you go beyond the demo.

The demo data lives in these files (you can inspect them directly with docker exec):

docker exec devportal ls /app/examples/
docker exec devportal cat /app/examples/entities.yaml
FileWhat it contains
entities.yamlSystem (examples), Components (example-website, example-node-app), an inline gRPC API
org.yamlUsers (guest, admin) and Groups (guests, admins, developers)
apis.yamlA live OpenAPI from apis.guru (loaded via $openapi remote ref) and a gRPC API
resources.yamlDemo Resources — a database, vault, bucket, and two environment-typed Resources
clusters.yamlA cluster Resource (my-own-cluster)
techdocs/catalog-info.yamlA Component with TechDocs enabled (good reference for TechDocs annotation usage)
template-nodejs/template.yamlScaffolder Template that creates a Node.js service repo on GitHub
template-openapi/template.yamlScaffolder Template that generates a Kong deck config from an OpenAPI spec
template-azure-nodejs/template.yamlVariant of the Node.js template targeting Azure DevOps

These files are registered as catalog locations in app-config.production.yaml, which is one of the layered configs loaded on startup. That is why they appear out of the box.

Demo Templates need credentials to execute

The three demo Templates appear in the Create tab but will fail at execution unless you provide the relevant secrets (GitHub token for example-nodejs-template and template-openapi, Kong connection for template-openapi, Azure DevOps PAT for template-azure-nodejs). They are useful as examples of template structure even if you don't run them.

Replacing the demo catalog

catalog.locations[] is additive in Backstage's config merge — entries from app-config.local.yaml are appended to (not substituted for) the ones in app-config.production.yaml. This means:

  • Adding your own entities alongside the demo: mount your own catalog-info.yaml and add it as a location in app-config.local.yaml. Both sets will appear.
  • Fully removing the demo entities: mount a replacement app-config.production.yaml that omits the /app/examples/ entries. You must preserve all the other settings from the original (baseUrl, CORS, auth, RBAC paths, etc.) — only do this when you intentionally want a clean catalog.

See Custom Catalog for the concrete YAML.

Next Steps

Now that you have DevPortal running, you can customize it:

  • Quick Setup with Profiles: Use VEECODE_PROFILE for quick GitHub, GitLab, or Azure DevOps integration
  • Custom Configuration: Mount custom app-config.local.yaml to configure integrations, authentication, and more
  • Dynamic Plugins: Enable, disable, and configure plugins using dynamic-plugins.yaml
  • Custom Catalog: Add your own components, APIs, and resources to the catalog