Skip to main content
Version: v1

Frequently Asked Questions

Container startup​

The container starts but the marketplace is empty​

The marketplace catalog is downloaded from an OCI image at startup. If the download fails (no internet access, image pull timeout, or first-boot race) the marketplace will be empty.

Force a fresh download on the next startup:

docker run ... -e CATALOG_INDEX_REFRESH=true veecode/devportal:latest

The default catalog image is quay.io/veecode/plugin-catalog-index:latest. Override it with CATALOG_INDEX_IMAGE if you host it internally.

The container exits immediately after starting​

Check the logs:

docker logs devportal

Common causes:

  • A required environment variable for the selected VEECODE_PROFILE is missing (e.g., GITLAB_HOST is unset for the gitlab profile).
  • The app-config.local.yaml mount path is wrong or the file has a syntax error. Backstage will fail to start if any mounted config file is invalid YAML.
  • Port 7007 is already in use on the host.

I set a key in app-config.local.yaml but it has no effect​

Config files are merged in a 7-layer order. Your app-config.local.yaml is layer 5, but plugin-generated config (dynamic-plugins-root/app-config.dynamic-plugins.yaml) is layer 6 and loads after it. A plugin's pluginConfig block in dynamic-plugins.yaml can override keys from your local.yaml. See Custom Configuration for the full merge order.


Authentication​

GitLab OAuth sign-in is not working​

Check that you are using the correct variable names. The GitLab profile reads GITLAB_AUTH_CLIENT_ID and GITLAB_AUTH_CLIENT_SECRET. Using GITLAB_CLIENT_ID or GITLAB_CLIENT_SECRET will not work.

Also verify the redirect URI in your GitLab OAuth Application matches exactly:

http://localhost:7007/api/auth/gitlab/handler/frame

GitHub sign-in fails with "Bad credentials"​

The github profile uses two separate credential sets:

  • Sign-in (OAuth): GITHUB_AUTH_CLIENT_ID / GITHUB_AUTH_CLIENT_SECRET
  • Integration (GitHub App): GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET + GITHUB_APP_ID + GITHUB_PRIVATE_KEY

If GITHUB_AUTH_CLIENT_ID is unset, the entrypoint automatically copies GITHUB_CLIENT_ID to it. Make sure your OAuth App credentials (not GitHub App credentials) are set for sign-in.

GITHUB_PRIVATE_KEY causes errors due to newlines​

Use GITHUB_PRIVATE_KEY_BASE64 instead. Base64-encode the PEM file and set that variable. The entrypoint decodes it automatically:

base64 -w 0 < github-app.private-key.pem
# paste the output as GITHUB_PRIVATE_KEY_BASE64

Keycloak authentication fails at sign-in​

Confirm KEYCLOAK_BASE_URL and KEYCLOAK_REALM are correct — the discovery URL is built from them ($KEYCLOAK_BASE_URL/realms/$KEYCLOAK_REALM). The entrypoint logs the resolved value: check the container log line VEECODE: Keycloak metadata URL: ....

Also confirm the redirect URI in your Keycloak client:

http://localhost:7007/api/auth/oidc/handler/frame

Profiles​

Which profile should I use?​

SituationRecommended profile
Just exploring, no auth needed(no profile — use guest)
GitHub repos, simple token accessgithub-pat
GitHub repos + team sign-ingithub
GitLab repos + sign-ingitlab
Azure DevOps repos + sign-inazure
Keycloak SSOkeycloak
OpenLDAP / FreeIPAldap
Microsoft Active Directoryldap-ad

I set VEECODE_PROFILE but it has no effect​

Profile names are case-sensitive and lowercase. Supported values: github-pat, github, gitlab, keycloak, azure, ldap, ldap-ad. Verify the container log shows VEECODE: Loading <profile> configuration... during startup.


Plugins​

How do I enable a bundled plugin?​

Add an entry to your dynamic-plugins.yaml with disabled: false. You do not need to rebuild the image or run yarn add. Example:

plugins:
- package: './dynamic-plugins/dist/backstage-plugin-kubernetes-dynamic'
disabled: false

See Dynamic Plugins for details.

My dynamic-plugins.yaml disables all plugins unexpectedly​

If your custom dynamic-plugins.yaml does not include dynamic-plugins.default.yaml, all built-in plugins revert to their default state (disabled). Add the includes: key:

includes:
- dynamic-plugins.default.yaml

plugins:
- package: './dynamic-plugins/dist/my-plugin-dynamic'
disabled: false

Getting more help​