Deploy DevPortal to Kubernetes
This guide walks through deploying DevPortal V2 to a Kubernetes cluster using the veecode-devportal-platform Helm chart. See Plan your setup before proceeding.
For environments where Helm is not available, a no-Helm fallback using raw manifests is documented at the end of this page.
Step 1: Add the Helm repository
helm repo add next-charts https://veecode-platform.github.io/next-charts
helm repo update next-charts
helm search repo veecode-devportal-platform
# should show: 0.1.0 / 2.0.0
Step 2: Create the credentials Secret
Credentials for the presets you select must be in a Kubernetes Secret before helm install. The chart references it via existingSecret.
Never pass production credentials through --set credentials.* — that stores them in the Helm release manifest. Use existingSecret for production.
- GitHub
- GitLab
- Azure
For the github and github-auth presets:
kubectl create secret generic my-devportal-creds \
--namespace platform \
--from-literal=GITHUB_PAT=<personal-access-token> \
--from-literal=GITHUB_ORG=<your-org> \
--from-literal=GITHUB_AUTH_CLIENT_ID=<oauth-client-id> \
--from-literal=GITHUB_AUTH_CLIENT_SECRET=<oauth-client-secret>
For the gitlab preset (identity + integration):
kubectl create secret generic my-devportal-creds \
--namespace platform \
--from-literal=GITLAB_HOST=gitlab.com \
--from-literal=GITLAB_TOKEN=<personal-access-token> \
--from-literal=GITLAB_AUTH_CLIENT_ID=<oauth-app-id> \
--from-literal=GITLAB_AUTH_CLIENT_SECRET=<oauth-app-secret> \
--from-literal=GITLAB_GROUP=<root-group>
For the azure (integration) and azure-auth (identity) presets:
kubectl create secret generic my-devportal-creds \
--namespace platform \
--from-literal=AZURE_DEVOPS_TOKEN=<pat> \
--from-literal=AZURE_DEVOPS_HOST=dev.azure.com \
--from-literal=AZURE_DEVOPS_ORG=<org> \
--from-literal=AZURE_DEVOPS_PROJECT=<project> \
--from-literal=AZURE_AUTH_TENANT_ID=<tenant-id> \
--from-literal=AZURE_AUTH_CLIENT_ID=<client-id> \
--from-literal=AZURE_AUTH_CLIENT_SECRET=<client-secret>
For GitOps workflows, use an external secrets operator (External Secrets Operator, Vault Agent, Sealed Secrets) to populate the Secret from your secrets store.
Step 3: Install the chart
helm install devportal next-charts/veecode-devportal-platform \
--namespace platform \
--create-namespace \
--set 'presets={recommended,github,github-auth}' \
--set existingSecret=my-devportal-creds
To enable ingress at install time:
helm install devportal next-charts/veecode-devportal-platform \
--namespace platform \
--create-namespace \
--set 'presets={recommended,github,github-auth}' \
--set existingSecret=my-devportal-creds \
--set ingress.enabled=true \
--set ingress.hostname=devportal.example.com \
--set ingress.ingressClassName=nginx
For the kubernetes preset, also pass --set rbac.clusterRoles.create=true so the chart creates the necessary ClusterRole and ClusterRoleBinding.
Step 4: Verify the deployment
kubectl rollout status deploy/devportal-veecode-devportal-platform \
--namespace platform --timeout=10m
# quick smoke-test without ingress
kubectl port-forward svc/devportal-veecode-devportal-platform \
--namespace platform 7007:7007
curl -sf localhost:7007/healthcheck && echo OK
A successful boot logs lines like:
VEECODE: preset resolver — VEECODE_PRESETS=recommended,github,github-auth
VEECODE: applying preset "recommended"
...
Running in PRODUCTION mode
If a required variable is missing, the container exits with code 78 and logs exactly which variable to set — the pod will not enter a crash loop silently.
Upgrading
helm upgrade devportal next-charts/veecode-devportal-platform \
--namespace platform \
--reuse-values \
--set existingSecret=my-devportal-creds
No-Helm fallback
If Helm is not available, use the reference manifest from the devportal-platform repository. This manifest applies the same two PVCs, a Deployment, and a Service using plain kubectl:
kubectl apply -f https://raw.githubusercontent.com/veecode-platform/devportal-platform/main/examples/deploy/k8s.yaml
You will need to edit the manifest to:
- Set
VEECODE_PRESETSin theDeploymentenv block. - Add an
envFromreferencing a Secret with the required variables for your preset combination. - Add an
Ingressresource (see Plan your setup).
The Helm chart is the recommended path for production because it handles PVC provisioning, RBAC, ingress, and upgrades consistently. The raw manifest is suitable for minimal or air-gapped environments.
Next steps
- Configure additional integrations — see Auth & Integrations
- Review RBAC roles and assign them to users — see RBAC
- Enable additional plugins via the marketplace in the DevPortal UI