Everything is configured with environment variables. Docker Compose reads them from .env (start from .env.example). The Helm chart sets them from its values (helm/values.yaml); the names below are the variable names, which is also what an existingSecret or extraEnv uses.
Most installations set fewer than ten of these. The rest have defaults that suit a normal site.
#Required
| Variable |
Meaning |
APP_SECRET |
The key that encrypts credentials stored in the database (git tokens, integration configurations, the private Maven repository password). 64 hex characters (openssl rand -hex 32). The backend will not start in production without it. Do not just change it: stored credentials would become unreadable. Replace it with the rotation tool (Running dpndncY). It does not sign sessions or API tokens; that is a separate key that rotates by itself (below) |
CORS_ORIGIN |
The origin browsers use, for example https://dpndncy.example.com. The backend will not start in production without it. Several origins can be given comma separated; * is refused. Compose and Helm derive it from DOMAIN / config.publicUrl |
SUPERADMIN_EMAIL, SUPERADMIN_PASSWORD |
The first operator account. Used while ENABLE_BOOTSTRAP_SUPERADMIN=true |
#Addresses
| Variable |
Default |
Meaning |
DOMAIN, API_DOMAIN |
|
Compose only. The console and API hostnames |
NEXT_PUBLIC_APP_ORIGIN |
http://localhost:3000 |
The origin the console presents to the API on its own requests. Must be one of CORS_ORIGIN. Set it to the console address |
APP_URL |
http://localhost:3000 |
The console address, used in links in emails and exports |
PUBLIC_API_URL |
APP_URL |
The API address shown in generated pipeline snippets and agent instructions. Set it when the API has its own hostname |
PORT |
3001 |
The API port inside the container |
WEB_PORT |
3000 |
The console port inside the container |
TRUST_PROXY |
off |
true trusts one reverse-proxy hop for the client address (needed behind Caddy, nginx or an ingress, otherwise every visitor shares one rate-limit bucket). Any other value is passed to Express as its trust proxy setting |
#Sign-in and sessions
| Variable |
Default |
Meaning |
ENABLE_BOOTSTRAP_SUPERADMIN |
false |
Creates or updates the operator account from SUPERADMIN_* at every start. While true, a restart resets that account's password. Turn it off after your first sign-in |
SUPERADMIN_NAME |
Superadmin |
Display name |
COOKIE_SECURE |
true |
Send the session cookie only over HTTPS. Set false only for plain-HTTP evaluation |
COOKIE_DOMAIN |
|
Cookie domain, if the console and another host must share it |
SESSION_TTL_SECONDS |
28800 |
Browser session length (8 hours). Sessions also end whenever the server restarts |
MFA_TTL_SECONDS |
300 |
How long the second step of sign-in stays valid |
SERVICE_TOKEN_TTL_SECONDS |
2592000 |
Lifetime of internal service tokens |
AUTH_RATE_LIMIT |
20 |
Sign-in attempts per 15 minutes per address |
API_RATE_LIMIT |
300 |
API requests per minute per address |
OIDC_ISSUER_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_REDIRECT_URI, OIDC_SCOPES |
|
Single sign-on with OpenID Connect. Register https://<console>/api/auth/oidc/callback |
SAML_IDP_SSO_URL, SAML_IDP_CERT, SAML_SP_ENTITY_ID, SAML_SP_ACS_URL |
|
SAML 2.0. The service provider metadata is at /api/auth/saml/metadata |
API tokens created in Settings do not expire with a restart. They are valid for 365 days unless you choose otherwise when creating them, and each user can hold up to 10.
#Outbound proxy
| Variable |
Meaning |
HTTPS_PROXY, HTTP_PROXY |
The proxy for outbound connections (advisory lookups, registries, integrations) |
NO_PROXY |
Destinations that bypass it. The container always adds 127.0.0.1, localhost and ::1 itself |
When a proxy variable is present the container switches on Node's proxy support at start-up; nothing else is needed. The proxy must allow the destinations in Ports and networking, and the machine must trust the proxy's certificate authority if it re-signs TLS.
#Key rotation
| Variable |
Default |
Meaning |
JWT_SECRET_ROTATION_DAYS |
0 (off); 90 in .env.example and the Helm chart |
Rotates the key that signs sessions and API tokens when it is this many days old. Nobody is signed out: the previous key keeps verifying until its window ends |
JWT_SECRET_VERIFY_WINDOW_DAYS |
400 |
How long a retired signing key keeps verifying tokens. It must be at least as long as the longest API token, or those tokens stop working after a rotation |
API_TOKEN_MAX_DAYS |
0 (no cap) |
The longest an API token may live. Longer requests, and "never expires", are cut to this. Setting it forces pipelines to replace their tokens on a schedule; 90 to 365 is typical |
If rotation is on and the verify window is shorter than the longest possible token, the server says so in its log at start-up.
#Storage
| Variable |
Default |
Meaning |
DB_PATH |
./data/dpndncY.db |
The SQLite database. In the container this is inside /app/data, which must be a persistent volume |
There is no external database option. dpndncY runs on SQLite, one container per installation.
#Email
| Variable |
Default |
Meaning |
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM |
|
Outgoing mail for invitations, alerts and scheduled reports. Without it no email is sent: when you create a tenant owner or a user, set their initial password yourself |
#Vulnerability data
| Variable |
Default |
Meaning |
NVD_API_KEY |
|
Raises NVD rate limits. Free from nvd.nist.gov |
GITHUB_TOKEN |
|
Adds GitHub advisory data and raises GitHub rate limits |
GHSA_ENABLED |
true |
Use GitHub security advisories |
OSV_TIMEOUT_MS, OSV_MAX_RETRIES |
15000, 3 |
OSV.dev request behaviour |
DPNDNCY_AIRGAPPED |
false |
No outbound calls. Vulnerability data comes from an imported offline database (Running dpndncY without internet access (air-gapped)) |
OSV.dev is always used and needs no key.
#Limits
| Variable |
Default |
Meaning |
MAX_ZIP_UPLOAD_MB |
200 |
Largest source archive the API accepts |
MAX_ZIP_FILES |
4000 |
Most files read from one archive |
JSON_LIMIT |
2mb |
Largest JSON request body |
CLI_TIMEOUT_MS |
120000 |
Time allowed for tool calls made while scanning |
MAVEN_TIMEOUT_MS |
300000 |
Time allowed for a Maven resolution |
MONITORING_WORKER_INTERVAL_MS |
300000 |
How often the continuous-monitoring worker looks for projects due for a rescan |
ALLOWED_PROJECT_PATHS |
|
Folders on the server, in addition to the workspaces created by uploads, that may be scanned by path (comma separated). Empty by default. Pipelines upload source, so they do not need this |
#Licence
| Variable |
Default |
Meaning |
LICENSE_SERVER_URL |
https://license.dpndncy.com |
Used by Settings, License, Activate online |
DPNDNCY_LICENSE_HEARTBEAT |
false |
Opt-in daily check-in carrying the licence id and aggregate counts only. Always off when air-gapped |
A new installation runs a 30-day trial. After it ends, or when a licence expires and its 7-day grace period ends, the installation turns read-only: data stays visible and new scans are blocked.
#Optional hardening
| Variable |
Meaning |
DPNDNCY_NODE_WORKER_IMAGE, DPNDNCY_PYTHON_WORKER_IMAGE, DPNDNCY_MAVEN_WORKER_IMAGE |
Container images used to run untrusted package or build steps in isolation. When unset, those steps are not run |
ALLOWED_PRIVATE_REGISTRIES |
Private HTTPS container registries (host or host:port) that image scans may reach. Private addresses are refused by default |
SAST_EXTERNAL_AI_ENABLED |
false. When true, rule metadata (never source code) may be sent to an external service for guidance |
#A note on .env files
On a machine where the application starts from a folder containing a .env file, that file overrides variables set in the process environment. The container image contains no .env file, so there the environment you pass is what applies. If a setting appears to be ignored on a bare-metal install, check for a .env in the working directory.