Skip to content

Configuration reference ​

This page lists every configuration key with its type, built-in default and the environment variable that overrides it. It is generated from the code (internal/config and the packages whose settings it embeds), so it cannot drift from what the server reads. For the load order (defaults, then the YAML file, then the environment), validation and how to start the server with a file, see Configuration. Annotated copies of every key are in openartifact.example.yaml and .env.example.

  • YAML key: the dotted path in the configuration file; server.port is port under server:.
  • Env: the environment variable that overrides the key; it takes precedence over the file. When several variables are listed, they are aliases and the first one that is set wins.
  • Type: string, int, bool, float, duration (Go syntax such as 5m or 90s), list (a YAML sequence; comma-separated in the environment) or map (a YAML mapping; comma-separated key=value pairs in the environment).
  • Default: the value used when neither the file nor the environment sets the key; empty is an empty string, list or map.
  • Credentials are marked Secret: keep them in environment variables or in a file only the server can read.

Top level ​

YAML keyEnvTypeDefaultDescription
baseUrlBASE_URLstringhttp://localhost:8080baseUrl is the public URL of the server; it is used for generated links and SSO callbacks, so set it when the server runs behind a reverse proxy.

server ​

server configures the HTTP listener, TLS, timeouts and request limits.

YAML keyEnvTypeDefaultDescription
server.hostSERVER_HOSTstring0.0.0.0host is the listen address.
server.portSERVER_PORTint8080port is the listen port.
server.readTimeoutSERVER_READ_TIMEOUTint0readTimeout bounds an entire request (headers + body), in seconds. 0 (the default) means no limit so large artifact uploads are never truncated; slowloris protection instead comes from readHeaderTimeout.
server.writeTimeoutSERVER_WRITE_TIMEOUTint0writeTimeout bounds writing the response, in seconds. 0 (the default) means no limit: large artifact downloads and streams rely on per-handler deadlines instead of one server-wide cutoff.
server.readHeaderTimeoutSERVER_READ_HEADER_TIMEOUTint20readHeaderTimeout bounds only the time to read request headers, in seconds. It stays short regardless of readTimeout to still mitigate slowloris-style attacks even when body reads are unbounded.
server.maxBodyBytesSERVER_MAX_BODY_BYTESint17179869184maxBodyBytes caps the body of every request (http.MaxBytesReader), a last line of defence behind the per-handler limits so no endpoint can be made to spool or buffer an unbounded body. 0 disables the cap.
server.shutdownTimeoutSERVER_SHUTDOWN_TIMEOUTint30shutdownTimeout is how many seconds in-flight requests get to finish during a graceful shutdown.
server.shutdownDelaySERVER_SHUTDOWN_DELAYint0shutdownDelay is how many seconds the server keeps serving, reporting not ready on /ready, after a shutdown signal and before it stops accepting connections, so load balancers stop routing to it first. A second signal skips the delay. 0 disables it.
server.tlsEnabledSERVER_TLS_ENABLEDboolfalsetlsEnabled serves HTTPS and sends HSTS; it requires tlsCert and tlsKey.
server.tlsCertSERVER_TLS_CERTstringemptytlsCert is the path of the PEM certificate file.
server.tlsKeySERVER_TLS_KEYstringemptytlsKey is the path of the PEM private key file.
server.apiKeyAPI_KEYstringemptySecret. apiKey is a deprecated static key accepted on write endpoints while auth.legacyApiKeyEnabled is true. It authenticates as system/legacy-api-key and logs a warning on each use; empty disables it.
server.corsOriginsCORS_ORIGINSlistemptycorsOrigins lists the browser origins allowed by CORS; none by default.
server.instanceIdOPENARTIFACT_INSTANCE_IDstringemptyinstanceId names this instance in HA deployments; /health reports it (omitted when empty, the hostname is never disclosed).
server.ipAllowlistOPENARTIFACT_IP_ALLOWLISTlistemptyipAllowlist lists the CIDR blocks allowed to connect; empty allows all.
server.rateLimitRpsOPENARTIFACT_RATE_LIMIT_RPSint0rateLimitRps caps requests per second per client IP; 0 disables the limit.
server.trustedProxiesOPENARTIFACT_TRUSTED_PROXIESlistemptytrustedProxies lists CIDR blocks of reverse proxies allowed to set X-Forwarded-For/X-Real-IP. Empty (default) means no proxy is trusted — the immediate TCP peer is always used as the client IP, so a client can never spoof its own IP via those headers.
server.pprofEnabledOPENARTIFACT_PPROF_ENABLEDboolfalsepprofEnabled mounts Go's runtime profiler under /api/v1/admin/pprof/ (admin "manage" permission required). Off by default: profiles expose internals and CPU profiling costs cycles. Sets non-zero mutex and block profile rates while enabled.

database ​

database configures the PostgreSQL connection and its pool.

YAML keyEnvTypeDefaultDescription
database.driverDB_DRIVERstringpostgresdriver names the database driver. It must be non-empty; PostgreSQL is the only supported database and the server always connects to it.
database.hostDB_HOSTstringlocalhosthost is the database host.
database.portDB_PORTint5432port is the database port.
database.userDB_USERstringpostgresuser is the database user.
database.passwordDB_PASSWORDstringemptySecret. password is the database password. The CHANGE_ME placeholder of the example files is rejected at startup.
database.databaseDB_NAMEstringartifact_repodatabase is the database name.
database.sslModeDB_SSLMODEstringrequiresslMode is the PostgreSQL sslmode; disable only for local development without TLS.
database.optionsDB_OPTIONSmapemptyoptions are extra libpq connection parameters. The environment form is comma-separated key=value pairs, merged over the YAML keys.
database.maxOpenConnsDB_MAX_OPEN_CONNSint25maxOpenConns is the size of the connection pool. 0 means the driver default; otherwise at least 2 (a blob-lock transaction pins one connection and its callback needs another), and at least 4 while tiering.enabled is true.
database.maxIdleConnsDB_MAX_IDLE_CONNSint5maxIdleConns is how many idle connections the pool keeps warm.
database.connMaxLifetimeMinutesDB_CONN_MAX_LIFETIME_MINUTESint30connMaxLifetimeMinutes is the maximum lifetime of a connection, in minutes.
database.authCacheTtlMsDB_AUTH_CACHE_TTL_MSint2000authCacheTtlMs is how long, in milliseconds, per-request authentication lookups (token, user, groups, permission targets, repository by name) are served from memory. Writes through this process invalidate immediately; other replicas observe a change after at most this long. 0 disables the cache.
database.connectTimeoutDB_CONNECT_TIMEOUTduration1mconnectTimeout is how long startup keeps retrying the initial database connection (capped exponential backoff) before giving up. 0 fails at the first error.

storage ​

storage selects and configures the blob store (see operations/storage.md). Its replica block adds an asynchronous second copy of every blob (see operations/replication.md).

YAML keyEnvTypeDefaultDescription
storage.typeSTORAGE_BACKEND, STORAGE_TYPEstringfilesystemtype selects the storage backend: filesystem, s3, gcs, azure, garage, seaweedfs or oci. garage and seaweedfs reuse the S3 client with path-style addressing forced on.
storage.endpointSTORAGE_ENDPOINTstringemptyendpoint is the endpoint URL of an S3-compatible service (s3, garage, seaweedfs) or the URL of the OCI registry.
storage.bucketSTORAGE_BUCKETstringartifactsbucket is the bucket name (s3, garage, seaweedfs) or the OCI repository prefix.
storage.regionSTORAGE_REGIONstringus-east-1region is the AWS region or equivalent.
storage.accessKeySTORAGE_ACCESS_KEYstringemptyaccessKey is the S3 access key. It is used only when both keys are set, otherwise the AWS credential chain applies.
storage.secretKeySTORAGE_SECRET_KEYstringemptySecret. secretKey is the S3 secret key.
storage.pathSTORAGE_PATHstring/var/lib/artifactspath is the directory of the filesystem backend.
storage.optionsSTORAGE_OPTIONSmapemptyoptions are free-form backend options. The environment form is comma-separated key=value pairs, merged over the YAML keys. None of the built-in backends reads any key yet.
storage.forcePathStyleSTORAGE_S3_FORCE_PATH_STYLEboolfalseforcePathStyle uses path-style S3 addressing (required for MinIO, Garage and SeaweedFS).
storage.presignTtlSTORAGE_S3_PRESIGN_TTLduration5mpresignTtl is the lifetime of presigned download URLs (s3, gcs), clamped to 1m-1h. It only applies while presignDownloads is on.
storage.presignUploadTtlSTORAGE_PRESIGN_UPLOAD_TTLduration30mpresignUploadTtl is the lifetime of presigned PUT upload URLs, clamped to 1m-12h.
storage.presignMaxPendingUploadsSTORAGE_PRESIGN_MAX_PENDING_UPLOADSint20presignMaxPendingUploads is how many outstanding (not completed, not expired) presigned uploads one user may hold; 0 means unlimited. Beyond it, creating an upload answers 429.
storage.presignDownloadsSTORAGE_PRESIGN_DOWNLOADSboolfalsepresignDownloads answers blob downloads with a 307 redirect to a presigned URL (s3 and gcs only) instead of streaming them. A repository can override it with presign_downloads.
storage.presignMinSizeSTORAGE_PRESIGN_MIN_SIZEint1048576presignMinSize is the size in bytes below which blobs are always streamed; 0 redirects everything and a negative value is rejected at startup.
storage.presignEndpointSTORAGE_PRESIGN_ENDPOINTstringemptypresignEndpoint is the public base URL (absolute http(s), no query or fragment) that presigned URLs are signed against (S3 family); empty uses the endpoint. Set it when the endpoint is not reachable by clients.
storage.gcsBucketOPENARTIFACT_GCS_BUCKETstringemptygcsBucket is the GCS bucket (reached through the S3-compatible XML API).
storage.gcsHmacKeyOPENARTIFACT_GCS_HMAC_KEYstringemptygcsHmacKey is the GCS HMAC access key (required for gcs).
storage.gcsHmacSecretOPENARTIFACT_GCS_HMAC_SECRETstringemptySecret. gcsHmacSecret is the GCS HMAC secret.
storage.azureAccountNameOPENARTIFACT_AZURE_ACCOUNT_NAMEstringemptyazureAccountName is the Azure storage account name.
storage.azureAccountKeyOPENARTIFACT_AZURE_ACCOUNT_KEYstringemptySecret. azureAccountKey is the Azure storage account key.
storage.azureContainerNameOPENARTIFACT_AZURE_CONTAINER_NAMEstringemptyazureContainerName is the Azure container name.
storage.azureEndpointOPENARTIFACT_AZURE_ENDPOINTstringemptyazureEndpoint is the blob service URL, for Azurite or a sovereign cloud; empty uses https://<account>.blob.core.windows.net.
storage.stagingPathSTORAGE_STAGING_PATHstringemptystagingPath is the spool directory for server-relayed presigned uploads on oci storage (filesystem uses <path>/staging); empty means <tmp>/openartifact-staging.
storage.ociInsecureSTORAGE_OCI_INSECUREboolfalseociInsecure allows plain HTTP to the OCI registry (dev and testing only).
storage.ociUsernameSTORAGE_OCI_USERNAMEstringemptyociUsername is the OCI registry user.
storage.ociPasswordSTORAGE_OCI_PASSWORDstringemptySecret. ociPassword is the OCI registry password.

storage.replica ​

storage.replica is the optional blob replica: an asynchronous second copy of every blob on another backend (see operations/replication.md).

YAML keyEnvTypeDefaultDescription
storage.replica.typeOPENARTIFACT_STORAGE_REPLICA_TYPEstringemptytype selects the storage backend: filesystem, s3, gcs, azure, garage, seaweedfs or oci. garage and seaweedfs reuse the S3 client with path-style addressing forced on.
storage.replica.endpointOPENARTIFACT_STORAGE_REPLICA_ENDPOINTstringemptyendpoint is the endpoint URL of an S3-compatible service (s3, garage, seaweedfs) or the URL of the OCI registry.
storage.replica.bucketOPENARTIFACT_STORAGE_REPLICA_BUCKETstringemptybucket is the bucket name (s3, garage, seaweedfs) or the OCI repository prefix.
storage.replica.regionOPENARTIFACT_STORAGE_REPLICA_REGIONstringus-east-1region is the AWS region or equivalent.
storage.replica.accessKeyOPENARTIFACT_STORAGE_REPLICA_ACCESS_KEYstringemptyaccessKey is the S3 access key. It is used only when both keys are set, otherwise the AWS credential chain applies.
storage.replica.secretKeyOPENARTIFACT_STORAGE_REPLICA_SECRET_KEYstringemptySecret. secretKey is the S3 secret key.
storage.replica.pathOPENARTIFACT_STORAGE_REPLICA_PATHstringemptypath is the directory of the filesystem backend.
storage.replica.optionsOPENARTIFACT_STORAGE_REPLICA_OPTIONSmapemptyoptions are free-form backend options. The environment form is comma-separated key=value pairs, merged over the YAML keys. None of the built-in backends reads any key yet.
storage.replica.forcePathStyleOPENARTIFACT_STORAGE_REPLICA_FORCE_PATH_STYLEboolfalseforcePathStyle uses path-style S3 addressing (required for MinIO, Garage and SeaweedFS).
storage.replica.gcsBucketOPENARTIFACT_STORAGE_REPLICA_GCS_BUCKETstringemptygcsBucket is the GCS bucket (reached through the S3-compatible XML API).
storage.replica.gcsHmacKeyOPENARTIFACT_STORAGE_REPLICA_GCS_HMAC_KEYstringemptygcsHmacKey is the GCS HMAC access key (required for gcs).
storage.replica.gcsHmacSecretOPENARTIFACT_STORAGE_REPLICA_GCS_HMAC_SECRETstringemptySecret. gcsHmacSecret is the GCS HMAC secret.
storage.replica.azureAccountNameOPENARTIFACT_STORAGE_REPLICA_AZURE_ACCOUNT_NAMEstringemptyazureAccountName is the Azure storage account name.
storage.replica.azureAccountKeyOPENARTIFACT_STORAGE_REPLICA_AZURE_ACCOUNT_KEYstringemptySecret. azureAccountKey is the Azure storage account key.
storage.replica.azureContainerNameOPENARTIFACT_STORAGE_REPLICA_AZURE_CONTAINER_NAMEstringemptyazureContainerName is the Azure container name.
storage.replica.azureEndpointOPENARTIFACT_STORAGE_REPLICA_AZURE_ENDPOINTstringemptyazureEndpoint is the blob service URL, for Azurite or a sovereign cloud; empty uses https://<account>.blob.core.windows.net.
storage.replica.ociInsecureOPENARTIFACT_STORAGE_REPLICA_OCI_INSECUREboolfalseociInsecure allows plain HTTP to the OCI registry (dev and testing only).
storage.replica.ociUsernameOPENARTIFACT_STORAGE_REPLICA_OCI_USERNAMEstringemptyociUsername is the OCI registry user.
storage.replica.ociPasswordOPENARTIFACT_STORAGE_REPLICA_OCI_PASSWORDstringemptySecret. ociPassword is the OCI registry password.
storage.replica.readFallbackOPENARTIFACT_STORAGE_REPLICA_READ_FALLBACKstringnotfoundreadFallback is what a read does when the primary cannot answer: notfound (the default: the primary says the blob does not exist), error (also when the primary fails) or off (never read from the replica).
storage.replica.intervalOPENARTIFACT_STORAGE_REPLICA_INTERVALduration5sinterval is the pause between replication passes (queued blobs are also picked up as soon as they are enqueued).
storage.replica.batchOPENARTIFACT_STORAGE_REPLICA_BATCHint100batch is how many queued operations one claim takes.
storage.replica.concurrencyOPENARTIFACT_STORAGE_REPLICA_CONCURRENCYint4concurrency is how many blobs are copied at once.
storage.replica.verifyIntervalOPENARTIFACT_STORAGE_REPLICA_VERIFY_INTERVALduration24hverifyInterval is the pause between verify passes; 0 = only on demand (POST /api/v1/admin/storage/replication/verify).
storage.replica.verifyDeepOPENARTIFACT_STORAGE_REPLICA_VERIFY_DEEPboolfalseverifyDeep also hashes the bytes of both copies during a verify pass, instead of comparing existence and size only.
storage.replica.maxBackoffOPENARTIFACT_STORAGE_REPLICA_MAX_BACKOFFduration1hmaxBackoff caps the retry delay of a failing operation.

log ​

log configures the log level, format and destination.

YAML keyEnvTypeDefaultDescription
log.levelLOG_LEVELstringinfolevel is the minimum severity logged: debug, info, warn or error. Unknown values fall back to info.
log.formatLOG_FORMATstringjsonformat is json or text; any other value gives console text.
log.outputLOG_OUTPUTstringstdoutoutput is stdout, stderr or a file path (appended to).

gpg ​

gpg configures the key file that signs APT and RPM metadata and release bundle manifests (see security/signing.md).

YAML keyEnvTypeDefaultDescription
gpg.enabledGPG_ENABLEDboolfalseenabled loads the file key at keyPath. Keys managed through the admin API sign regardless.
gpg.keyPathGPG_KEY_PATHstringemptykeyPath is the private key file (the read-only fallback key).
gpg.passphraseGPG_PASSPHRASEstringemptySecret. passphrase unlocks the key at keyPath.
gpg.autoGenerateGPG_AUTO_GENERATEboolfalseautoGenerate generates an RSA-4096 global signing key at startup when no key exists yet. It needs OPENARTIFACT_SECRET_KEY and is replica-safe.

attestation ​

attestation configures the signing key of SBOM and VEX attestations (see security/sbom.md).

YAML keyEnvTypeDefaultDescription
attestation.keyPathATTESTATION_KEY_PATHstringemptykeyPath is an unencrypted PKCS#8 or SEC1 PEM private key (ECDSA or Ed25519). Empty: a P-256 key is generated on first use and stored encrypted in the database.

auth ​

auth configures sessions, anonymous reads and the login-state and SAML service provider keys (see security/authentication.md).

YAML keyEnvTypeDefaultDescription
auth.allowAnonymousReadALLOW_ANONYMOUS_READboolfalseallowAnonymousRead lets anonymous clients read private repositories (via the "anonymous-read" permission target). Repositories flagged public are always anonymously readable, never writable, whatever this says.
auth.legacyApiKeyEnabledLEGACY_API_KEY_ENABLEDboolfalselegacyApiKeyEnabled accepts the deprecated server.apiKey on write endpoints.
auth.sessionDurationHoursSESSION_DURATION_HOURSint24sessionDurationHours is the lifetime of a web session, in hours.
auth.hmacKeyAUTH_HMAC_KEYstringemptySecret. hmacKey signs OIDC and SAML login state. Unset: a random key is generated once and persisted in system_settings (shared by replicas); a configured value wins.
auth.samlSpCertOPENARTIFACT_SAML_SP_CERTstringemptysamlSpCert is the PEM certificate of the SAML service provider. Unset: a self-signed pair is generated once and persisted encrypted in system_settings (shared by replicas); regenerating it means re-registering the certificate at the identity provider.
auth.samlSpKeyOPENARTIFACT_SAML_SP_KEYstringemptySecret. samlSpKey is the PEM private key of the SAML service provider. Unset together with the certificate: a self-signed pair is generated (see samlSpCert). Stored unencrypted while OPENARTIFACT_SECRET_KEY is unset.

bootstrap ​

bootstrap configures the first admin account and API token created on an empty instance (see getting-started/installation.md).

YAML keyEnvTypeDefaultDescription
bootstrap.adminPasswordFileOPENARTIFACT_BOOTSTRAP_ADMIN_PASSWORD_FILEstringemptySecret. adminPasswordFile is a file holding the initial admin password (a trailing newline is trimmed). Preferred over AdminPassword.
bootstrap.adminPasswordOPENARTIFACT_BOOTSTRAP_ADMIN_PASSWORDstringemptySecret. adminPassword is the initial admin password itself (compose convenience; AdminPasswordFile wins when both are set).
bootstrap.forcePasswordChangeOPENARTIFACT_BOOTSTRAP_FORCE_PASSWORD_CHANGEboolfalseSecret. forcePasswordChange forces a password change at the first login of a supplied password. A generated password always forces it.
bootstrap.adminTokenFileOPENARTIFACT_BOOTSTRAP_ADMIN_TOKEN_FILEstringemptyadminTokenFile is a file holding an admin API token secret (oa_pat_ followed by 32 to 128 characters from A-Za-z0-9_-), created as the access token "bootstrap" of the admin user.
bootstrap.adminTokenTtlOPENARTIFACT_BOOTSTRAP_ADMIN_TOKEN_TTLduration0adminTokenTtl is the lifetime of the bootstrap token; 0 means none.
bootstrap.generatedPasswordTtlOPENARTIFACT_BOOTSTRAP_GENERATED_PASSWORD_TTLduration24hSecret. generatedPasswordTtl is how long a generated (printed) admin password stays valid for login; 0 means it never expires.

backup ​

backup configures where backups are written and how long a running backup holds back blob deletions (see operations/backup.md).

YAML keyEnvTypeDefaultDescription
backup.backupDirOPENARTIFACT_BACKUP_DIRstring/var/lib/openartifact/backupsbackupDir is the directory backup files are written to.
backup.leaseTtlOPENARTIFACT_BACKUP_LEASE_TTLduration5mleaseTtl is how long a running backup's hold on deleted blob bytes survives without a heartbeat. A running backup renews it every third of this; a crashed backup stops holding deletions back once it expires.

ai ​

ai configures AI-assisted package analysis (see integrations/ai-analysis.md).

YAML keyEnvTypeDefaultDescription
ai.enabledAI_ENABLEDboolfalseenabled turns AI-assisted artifact analysis on (metadata tagging, license check, security notes).
ai.autoAnalyzeAI_AUTO_ANALYZEboolfalseautoAnalyze analyses every upload without being asked. Off: analyses start only on request (UI, API or MCP). Needs enabled.
ai.providerAI_PROVIDERstringopenaiprovider is the LLM backend: openai, azure, ollama or custom (any OpenAI-compatible endpoint; needs baseUrl).
ai.baseUrlAI_BASE_URLstringemptybaseUrl overrides the API base URL (Azure OpenAI, Ollama or a custom endpoint).
ai.apiKeyAI_API_KEYstringemptySecret. apiKey authenticates to the provider; required for openai and azure, leave it empty for a local ollama.
ai.modelAI_MODELstringgpt-4o-minimodel is the model to use, for example gpt-4o-mini or llama3; it must be available on the configured provider.
ai.maxTokensAI_MAX_TOKENSint1024maxTokens caps the completion tokens of one analysis request.
ai.timeoutSecsAI_TIMEOUT_SECSint30timeoutSecs is the HTTP timeout of an AI API call, in seconds.
ai.systemPromptAI_SYSTEM_PROMPTstringemptysystemPrompt overrides the built-in system prompt; empty uses it.

mcp ​

mcp configures the embedded Model Context Protocol server (see integrations/mcp.md).

YAML keyEnvTypeDefaultDescription
mcp.enabledMCP_ENABLEDboolfalseenabled mounts the MCP server on the main HTTP listener.
mcp.transportMCP_TRANSPORTstringhttptransport must be http (the only supported transport; stdio is rejected). The endpoint requires an "Authorization: Bearer" token.
mcp.httpPathMCP_HTTP_PATHstring/mcphttpPath is the mount path of the HTTP endpoint.
mcp.allowedOriginsMCP_ALLOWED_ORIGINSlistemptyallowedOrigins are the browser origins (scheme://host[:port]) accepted in the Origin header of MCP requests, besides the origin of baseUrl. A request with any other Origin is refused with 403; requests without an Origin header (non-browser clients) are unaffected.
mcp.maxBodyBytesMCP_MAX_BODY_BYTESint1048576maxBodyBytes caps one MCP request body (default 1 MiB).
mcp.rateLimitPerMinuteMCP_RATE_LIMIT_PER_MINUTEint600rateLimitPerMinute caps MCP requests per authenticated principal per minute (default 600; 0 disables the limit).
mcp.aiTriggerPerMinuteMCP_AI_TRIGGER_PER_MINUTEint10aiTriggerPerMinute caps trigger_ai_analysis calls per principal per minute, since each one can cost an LLM call (default 10; 0 disables).

workers ​

workers tunes the background workers: metadata regeneration, Docker registry garbage collection and upload staging, webhook retention.

YAML keyEnvTypeDefaultDescription
workers.metadataRegenConcurrencyOPENARTIFACT_METADATA_REGEN_CONCURRENCYint4metadataRegenConcurrency caps how many metadata regenerations (npm, maven, deb, rpm together) run at once. Each pins up to two database connections, so keep it well below database.maxOpenConns.
workers.dockerGcIntervalOPENARTIFACT_DOCKER_GC_INTERVALduration1hdockerGcInterval is the pause between scheduled Docker registry garbage collection passes (untagged manifests and the blobs only they used). Zero or negative disables the schedule; the admin API can still run it.
workers.dockerGcGracePeriodOPENARTIFACT_DOCKER_GC_GRACE_PERIODduration24hdockerGcGracePeriod is how long an untagged manifest, or an unreferenced blob, must have been idle before registry GC may delete it. It must outlast the slowest push: layers are uploaded before the manifest that references them.
workers.proxyDockerDigestTtlOPENARTIFACT_PROXY_DOCKER_DIGEST_TTLduration720hproxyDockerDigestTtl is how long a docker proxy keeps a manifest or blob addressed by digest after its last pull. Such content never changes, so this only bounds the cache's size: the proxy cache worker evicts what has not been pulled for this long, and the next pull fetches it again. Zero keeps it until an admin purge or the repository's removal.
workers.proxyUpstreamStallTimeoutOPENARTIFACT_PROXY_UPSTREAM_STALL_TIMEOUTduration1mproxyUpstreamStallTimeout is how long a proxy upstream response body may deliver no data before the fetch fails and its flight is released. It is reset on every read, so slow but steady downloads are unaffected. Zero disables the check.
workers.dockerUploadTtlOPENARTIFACT_DOCKER_UPLOAD_TTLduration24hdockerUploadTtl is how long a blob upload session may sit idle before the sweeper deletes it and its staged file. Zero or negative disables the sweeper.
workers.dockerUploadDirOPENARTIFACT_DOCKER_UPLOAD_DIRstringemptydockerUploadDir is where in-progress blob uploads are staged. Empty means /tmp/openartifact/docker-uploads.
workers.webhookDeliveryRetentionDaysOPENARTIFACT_WEBHOOK_DELIVERY_RETENTION_DAYSint30webhookDeliveryRetentionDays is how many days finished (success or failed) webhook delivery records are kept before the hourly purge deletes them. 0 keeps them forever. Pending deliveries are never purged.

trash ​

trash tunes soft delete (see operations/trash.md).

YAML keyEnvTypeDefaultDescription
trash.retentionDaysOPENARTIFACT_TRASH_RETENTIONint7retentionDays is how many days a deleted artifact, version or repository stays restorable before the purge worker removes it for good. It applies to repositories without their own trash_retention_days; 0 disables the trash (deletes are immediate and permanent).
trash.purgeIntervalOPENARTIFACT_TRASH_PURGE_INTERVALduration15mpurgeInterval is the pause between purge passes. Zero or negative disables the schedule: nothing expires until an admin purges by hand.

audit ​

audit tunes the retention of the audit log (see operations/audit-retention.md).

YAML keyEnvTypeDefaultDescription
audit.retentionDaysOPENARTIFACT_AUDIT_RETENTION_DAYSint0retentionDays is how many days audit entries are kept before the retention worker deletes them in batches. 0 keeps them forever (the default): export them with oa audit export before enabling a limit.
audit.purgeIntervalOPENARTIFACT_AUDIT_PURGE_INTERVALduration1hpurgeInterval is the pause between retention passes. Only used when RetentionDays is positive.
audit.purgeBatchSizeOPENARTIFACT_AUDIT_PURGE_BATCH_SIZEint5000purgeBatchSize is how many entries one delete statement removes; a pass repeats it, paced, until nothing older than the retention is left.

docs ​

docs configures the links from the web UI to the published documentation.

YAML keyEnvTypeDefaultDescription
docs.baseUrlOPENARTIFACT_DOCS_BASE_URLstringhttps://openartifact.github.io/baseUrl is the root of the published documentation site; the web UI links to the version matching the server (release builds) or to the latest docs (development builds). Point it at an internal mirror for air-gapped installs; empty hides every documentation link.

api ​

api configures the REST API explorer (see integrations/api.md).

api.docs ​

api.docs configures the interactive API reference.

YAML keyEnvTypeDefaultDescription
api.docs.enabledOPENARTIFACT_API_DOCS_ENABLEDbooltrueenabled serves the interactive API reference at /api/reference (the old /swagger paths redirect to it) and links it from the About dialog. When false both answer 404. The OpenAPI spec at /api/v1/openapi.json and /api/v1/openapi.yaml is always served: the web client and tooling use it.

branding ​

branding white-labels the UI: product name, logos, favicon, colour, login message and support/source links (see operations/branding.md). Administrators can override every value at runtime.

YAML keyEnvTypeDefaultDescription
branding.productNameOPENARTIFACT_BRANDING_PRODUCT_NAMEstringemptyproductName replaces "OpenArtifact" in the UI (title, sidebar, login).
branding.logoLightOPENARTIFACT_BRANDING_LOGO_LIGHTstringemptylogoLight is the path of a PNG or SVG logo shown on light surfaces; when only one logo is set it is used for both themes.
branding.logoDarkOPENARTIFACT_BRANDING_LOGO_DARKstringemptylogoDark is the path of a PNG or SVG logo shown on dark surfaces.
branding.faviconOPENARTIFACT_BRANDING_FAVICONstringemptyfavicon is a PNG or SVG file.
branding.primaryColorOPENARTIFACT_BRANDING_PRIMARY_COLORstringemptyprimaryColor is the accent colour as #rrggbb.
branding.loginMessageOPENARTIFACT_BRANDING_LOGIN_MESSAGEstringemptyloginMessage is shown on the login page (plain text with a tiny markdown subset).
branding.supportUrlOPENARTIFACT_BRANDING_SUPPORT_URLstringemptysupportUrl is an http(s) or mailto link shown in the About dialog.
branding.sourceUrlOPENARTIFACT_BRANDING_SOURCE_URLstringemptysourceUrl is where users can get the source of the running version (AGPL-3.0 section 13); it defaults to the upstream repository and cannot be hidden.

blobDeletion ​

blobDeletion tunes the deferred deletion of blob bytes (see operations/storage.md).

YAML keyEnvTypeDefaultDescription
blobDeletion.graceOPENARTIFACT_BLOB_DELETION_GRACEduration24hgrace is how long the bytes of a deleted blob are kept before they may be removed. During it a re-upload of the same content reuses them. Zero removes them as soon as no running backup needs them.
blobDeletion.sweepIntervalOPENARTIFACT_BLOB_DELETION_SWEEP_INTERVALduration1msweepInterval is the pause between sweeper passes. Zero or negative disables the schedule (the queue then only grows).
blobDeletion.sweepBatchOPENARTIFACT_BLOB_DELETION_SWEEP_BATCHint200sweepBatch is how many queued deletions a sweeper claims at a time.

tiering ​

tiering tunes the storage tier mover (see operations/storage-tiering.md). Tiers and policies themselves are managed through the admin API; with no tier besides the primary store configured none of this has any effect.

YAML keyEnvTypeDefaultDescription
tiering.enabledOPENARTIFACT_TIERING_ENABLEDbooltrueenabled switches the background mover on. Reads from every tier work regardless; only the movement of blobs between tiers depends on it.
tiering.intervalOPENARTIFACT_TIERING_INTERVALduration5minterval is the pause between mover passes. Zero or negative disables the schedule; an admin can still start a pass by hand.
tiering.batchOPENARTIFACT_TIERING_BATCHint200batch caps how many blobs one pass moves; the rest wait for the next pass.
tiering.concurrencyOPENARTIFACT_TIERING_CONCURRENCYint2concurrency is how many blobs are copied at once.
tiering.maxBytesPerSecondOPENARTIFACT_TIERING_MAX_BYTES_PER_SECONDint67108864maxBytesPerSecond caps the mover's total copy bandwidth (all concurrent copies together). Zero is unlimited.
tiering.verifyReadbackOPENARTIFACT_TIERING_VERIFY_READBACKbooltrueverifyReadback re-reads each copied blob from the target tier and compares its sha256 before the placement flips, on top of the size check.
tiering.accessFlushIntervalOPENARTIFACT_TIERING_ACCESS_FLUSH_INTERVALduration30saccessFlushInterval is how often recorded blob downloads (used by "idle for N days" policies and promote-on-read) are written to the database.
tiering.refreshIntervalOPENARTIFACT_TIERING_REFRESH_INTERVALduration30srefreshInterval is how often each replica reloads the tier list, so a tier created on one replica is used by the others.

recovery ​

recovery groups the disaster-recovery settings.

recovery.journal ​

recovery.journal tunes the row journal that mirrors package metadata as sidecar blobs in the blob store (see operations/rebuild-from-storage.md).

YAML keyEnvTypeDefaultDescription
recovery.journal.enabledOPENARTIFACT_RECOVERY_JOURNAL_ENABLEDbooltrueenabled switches the journal on: the database triggers mark changed rows and the worker writes their sidecar blobs. Off, nothing is captured and openartifact rebuild cannot restore rows created while it was off.
recovery.journal.intervalOPENARTIFACT_RECOVERY_JOURNAL_INTERVALduration10sinterval is the pause between worker passes that drain the dirty queue.
recovery.journal.batchOPENARTIFACT_RECOVERY_JOURNAL_BATCHint200batch is how many dirty rows one drain step claims.
recovery.journal.concurrencyOPENARTIFACT_RECOVERY_JOURNAL_CONCURRENCYint4concurrency is how many sidecar blobs are written or deleted at once.
recovery.journal.reconcileIntervalOPENARTIFACT_RECOVERY_JOURNAL_RECONCILE_INTERVALduration24hreconcileInterval is how often every journaled table is re-checked for rows without a sidecar (backfill) and sidecars without a row. Zero disables periodic reconciles after the first complete one.

projects ​

projects tunes project self-service (see security/projects.md).

YAML keyEnvTypeDefaultDescription
projects.selfCreateOPENARTIFACT_PROJECTS_SELF_CREATEboolfalseselfCreate lets any authenticated human user create a project and become its owner. Off by default: only global admins create projects. An administrator can change it at runtime (system setting projects.self_create), which then takes precedence over this default.

federation ​

federation tunes federated repositories (see operations/federation.md). Repositories are federated individually through the admin API; this only switches the pull workers and the peer endpoints on and tunes them.

YAML keyEnvTypeDefaultDescription
federation.enabledOPENARTIFACT_FEDERATION_ENABLEDboolfalseenabled starts the pull workers and mounts the /federation/v1 peer endpoints. Off by default.
federation.pollIntervalOPENARTIFACT_FEDERATION_POLL_INTERVALduration30spollInterval is the pause between pulls of one peer that is caught up.
federation.batchSizeOPENARTIFACT_FEDERATION_BATCH_SIZEint200batchSize is how many log entries one pull page carries.
federation.maxBackoffOPENARTIFACT_FEDERATION_MAX_BACKOFFduration15mmaxBackoff caps the retry delay of an unreachable or failing peer.
federation.requestTimeoutOPENARTIFACT_FEDERATION_REQUEST_TIMEOUTduration30srequestTimeout bounds one request to a peer (blob transfers are bounded by it per request, not in total).
federation.tombstoneRetentionOPENARTIFACT_FEDERATION_TOMBSTONE_RETENTIONduration720htombstoneRetention is how long the tombstone of a deleted unit is kept in the log; a member that stays offline longer must be resynced.
federation.spoolDirOPENARTIFACT_FEDERATION_SPOOL_DIRstringemptyspoolDir is where blobs pulled from peers are downloaded to. An interrupted download stays there and the next pull resumes it with a Range request. Empty uses a directory under the OS temp dir; set it to a persistent volume to resume across restarts, and give every instance its own.
federation.maxPartialBytesOPENARTIFACT_FEDERATION_MAX_PARTIAL_BYTESint10737418240maxPartialBytes caps the total size of the interrupted downloads kept in the spool; the least recently written are removed first.
federation.maxPartialAgeOPENARTIFACT_FEDERATION_MAX_PARTIAL_AGEduration24hmaxPartialAge removes an interrupted download that was not written to for this long.

telemetry ​

telemetry configures OpenTelemetry export (off by default), see operations/monitoring.md.

telemetry.otlp ​

telemetry.otlp configures the OTLP exporters. The endpoint, protocol, headers and TLS settings are shared by every signal. The standard OTEL_* environment variables override the file; the signal specific OTEL_EXPORTER_OTLP_TRACES_*, OTEL_EXPORTER_OTLP_METRICS_* and OTEL_EXPORTER_OTLP_LOGS_* variables only apply while endpoint is empty.

YAML keyEnvTypeDefaultDescription
telemetry.otlp.enabledOPENARTIFACT_OTLP_ENABLEDboolfalseenabled is the master switch: nothing is exported without it, whatever the per-signal switches say. Off by default; OTEL_SDK_DISABLED=true forces it off.
telemetry.otlp.endpointOTEL_EXPORTER_OTLP_ENDPOINTstringemptyendpoint is host:port or an http(s) URL of the collector. Empty uses the SDK default (localhost:4317 for grpc, localhost:4318 for http).
telemetry.otlp.protocolOTEL_EXPORTER_OTLP_PROTOCOLstringgrpcprotocol is "grpc" (default) or "http" (OTLP/HTTP protobuf).
telemetry.otlp.headersOTEL_EXPORTER_OTLP_HEADERSmapemptySecret. headers are sent with every export request (collector credentials). Never logged. The environment form is comma-separated key=value pairs with percent-encoded values.
telemetry.otlp.insecureOTEL_EXPORTER_OTLP_INSECUREboolfalseinsecure disables TLS towards the collector. An http:// endpoint implies it.
telemetry.otlp.serviceNameOTEL_SERVICE_NAMEstringopenartifactserviceName is the service.name resource attribute.
telemetry.otlp.sampleRatioOTEL_TRACES_SAMPLER_ARGfloat1sampleRatio is the fraction of new traces recorded, in [0,1]. Requests carrying a sampled traceparent are always recorded (parent based).
telemetry.otlp.tracesOTEL_TRACES_EXPORTERbooltruetraces exports distributed traces and installs the HTTP server middleware. On by default, so enabled alone keeps tracing. The environment form is OTEL_TRACES_EXPORTER: otlp turns it on, none turns it off.
telemetry.otlp.metricsOTEL_METRICS_EXPORTERboolfalsemetrics exports the Prometheus registry (Go runtime and openartifact_* families) over OTLP to the same endpoint. /metrics is unaffected. The environment form is OTEL_METRICS_EXPORTER: otlp turns it on, none turns it off.
telemetry.otlp.logsOTEL_LOGS_EXPORTERboolfalselogs is the switch for application log records over OTLP; with it (or audit) on, an OTLP log provider is started on the same endpoint. Reserved: no records are written to it yet (#192). The environment form is OTEL_LOGS_EXPORTER: otlp turns it on, none turns it off.
telemetry.otlp.auditOPENARTIFACT_OTLP_AUDITboolfalseaudit is the switch for audit events over OTLP (scope openartifact.audit), independent of traces. It shares the log provider with logs. Reserved: no events are written to it yet (#193). The audit_logs table stays the source of truth.

scanners ​

scanners configures the external vulnerability scanners (trivy, grype) used by on-demand scans (see security/scanning.md). OSV needs none of it.

YAML keyEnvTypeDefaultDescription
scanners.cacheDirOPENARTIFACT_SCANNER_CACHE_DIRstringemptycacheDir is where the scanners keep their vulnerability databases (<cacheDir>/trivy, <cacheDir>/grype). It must be writable unless offline is set. Empty means a directory under the user cache dir; the container image sets /var/cache/openartifact/scanners.
scanners.updateIntervalOPENARTIFACT_SCANNER_UPDATE_INTERVALduration6hupdateInterval is the pause between database refreshes. 0 downloads only when the server starts and never again; otherwise at least 1h.
scanners.offlineOPENARTIFACT_SCANNER_OFFLINEboolfalseoffline stops the server from downloading databases: scans use what cacheDir already holds and fail while it holds none.
scanners.downloadBaseUrlOPENARTIFACT_SCANNER_DOWNLOAD_BASE_URLstringhttps://github.comdownloadBaseUrl is the https origin the pinned release archives are downloaded from when a scanner's install mode is "auto". A mirror must serve GitHub's release paths (/<owner>/<repo>/releases/download/<tag>/<file>).

scanners.trivy ​

scanners.trivy configures the trivy binary and its database sources.

YAML keyEnvTypeDefaultDescription
scanners.trivy.pathOPENARTIFACT_TRIVY_PATHstringemptypath is the binary: a command name looked up on PATH, or an absolute path. Empty means "trivy".
scanners.trivy.installOPENARTIFACT_TRIVY_INSTALLstringnoneinstall is "none" (default) or "auto": download the pinned trivy release into the cache directory when path is empty and trivy is not on PATH.
scanners.trivy.dbRepositoryOPENARTIFACT_TRIVY_DB_REPOSITORYstringemptydbRepository is an OCI repository mirroring ghcr.io/aquasecurity/trivy-db. Empty is the upstream default.
scanners.trivy.javaDbRepositoryOPENARTIFACT_TRIVY_JAVA_DB_REPOSITORYstringemptyjavaDbRepository is an OCI repository mirroring ghcr.io/aquasecurity/trivy-java-db. Empty does not download the Java database (several hundred MB; only JAR scanning needs it).

scanners.grype ​

scanners.grype configures the grype binary and its database source.

YAML keyEnvTypeDefaultDescription
scanners.grype.pathOPENARTIFACT_GRYPE_PATHstringemptypath is the binary: a command name looked up on PATH, or an absolute path. Empty means "grype".
scanners.grype.installOPENARTIFACT_GRYPE_INSTALLstringnoneinstall is "none" (default) or "auto": download the pinned grype release into the cache directory when path is empty and grype is not on PATH.
scanners.grype.dbUrlOPENARTIFACT_GRYPE_DB_URLstringemptydbUrl is the database listing URL of a mirror (GRYPE_DB_UPDATE_URL). Empty is the upstream default.

Environment-only variables ​

These variables are read by the configuration loader but have no YAML key.

VariableDescription
OTEL_SDK_DISABLEDtrue forces telemetry off, overriding telemetry.otlp.enabled and OPENARTIFACT_OTLP_ENABLED.

Variables read outside the configuration loader, such as the secret-encryption key, the metrics scrape token and the migration switch, are described in Environment-only variables.

Free software under the AGPL-3.0-or-later.