river Helm values reference#

Helm values reference table for the river application.

Key

Type

Default

Description

affinity

object

{}

Affinity rules for the pod

command

list

["mppdb","up"]

Command to run in the container. mppdb up starts and supervises the service stack, which is what the container image’s start script does.

config.advertiseRequestBase

bool

true

Whether the service advertises the URL a client actually reached it on (True) or pins the configured baseUrl for every generated URL (False). Behind a TLS-terminating proxy the pod sees plain http, so leaving this True mints http:// job/redirect URLs the https console then blocks; set it False so async job and result URLs are pinned to the external https baseUrl. TOML-only (no env var), so it is rendered into the mppdb.toml ConfigMap.

config.authProvider

string

"apikey"

Identity provider, supplied as MPPDB_AUTH_PROVIDER. apikey validates the service’s own API keys and is what the initial smoke deployment uses; this flips to gafaelfawr once the service can consume the identity headers injected by the ingress.

config.baseUrl

string

global.baseUrl plus ingress.pathPrefix

Public base URL the service advertises in generated URLs, supplied as MPPDB_BASE_URL.

config.branding

object

{}

Display branding, rendered into the [branding] table of the generated mppdb.toml as string keys. Empty omits the table, leaving the image’s built-in branding.

config.clickhouse.host

string

"sdfiana035.sdf.slac.stanford.edu"

Host name of the ClickHouse server, supplied as MPPDB_CLICKHOUSE_HOST. This is outside the Kubernetes cluster, so egress from the pod to it must be permitted.

config.clickhouse.port

int

8123

HTTP port of the ClickHouse server, supplied as MPPDB_CLICKHOUSE_PORT

config.configPath

string

"/etc/mppdb/mppdb.toml"

Container path the generated mppdb.toml is mounted at, supplied as MPPDB_CONFIG

config.dataDir

string

"/data"

Container path of the persistent data directory, supplied as MPPDB_DATA_DIR. The state database, spool, lake, and manifests all live beneath it, and it is where the PVC is mounted.

config.databases

object

dp2, ppdb, and ssp; see values.yaml

Databases to serve, rendered into the [databases] tables of the generated mppdb.toml. This block is the authorization boundary: a database absent here is not served, whatever the catalog store holds. chDatabase is the physical ClickHouse database. manifestsDir and lakeDir are set only for databases that have a Parquet lake and snapshot pointer; static ClickHouse-only imports leave them out. A registry key is also accepted, resolved against config.registryDir, but it is ignored under MPPDB_ENGINE=clickhouse, which this deployment uses: the catalog comes from TAP_SCHEMA.registries in the store. Do not set it here.

config.defaultDatabase

string

""

Database that unqualified ADQL table names resolve to, written to default_database in the TOML configuration. Empty on purpose: with no default, every table reference must be qualified as database.table, which is what we want now that the obsolete mppdb database is gone and no single database is the natural home for a bare name. Setting this omits the TOML key entirely; it must name one of the databases entries if set at all.

config.engine

string

"clickhouse"

Query engine, supplied as MPPDB_ENGINE. clickhouse runs ADQL against a ClickHouse server over HTTP rather than against a local DuckDB.

config.extraEnv

object

{}

Additional environment variables for the container, as a mapping of name to value. Use this for MPPDB_* settings that have no dedicated value above. Never put credentials here; they come from the river secret.

config.host

string

"0.0.0.0"

Address the service binds to, supplied as MPPDB_HOST. The service defaults this to loopback, which would make the pod unreachable.

config.manifestsDir

string

"/data/manifests"

Directory holding the snapshot manifests, supplied as MPPDB_MANIFESTS_DIR. Must be set explicitly: leaving it unset silently yields an empty snapshot.

config.metricsAddr

string

"0.0.0.0"

Address the metrics server binds to, supplied as MPPDB_METRICS_ADDR. The service defaults this to loopback, which would make the metrics port unreachable from outside the pod.

config.metricsPort

int

9100

Port the Prometheus metrics server listens on, supplied as MPPDB_METRICS_PORT

config.port

int

8080

Port the service listens on, supplied as MPPDB_PORT

config.registryDir

string

"/opt/mppdb/deploy/usdf"

Directory inside the image holding the registry YAML files that the [databases] entries below refer to. PLACEHOLDER: confirm this against the published image at integration time; nothing in this chart can verify it.

config.scsDatabase

string

"dp2"

Database that Simple Cone Search resolves its table against. Independent of defaultDatabase – SCS targets exactly one database, and with no default it would otherwise refuse every request. Must be a databases entry.

config.scsDefaultTable

string

"DiaObject"

Bare table name SCS uses when the request omits one. Must exist in scsDatabase; note dp2 has DiaObject and no DiaObjectLast.

config.spoolDir

string

"/spool"

Container path the spool claim is mounted at, supplied as MPPDB_SPOOL_DIR. Separate volume; see persistence.spoolSize.

config.spoolWatermarkBytes

string

"1924145348608"

Byte ceiling above which new async jobs are refused with 503 + Retry-After, written to MPPDB_SPOOL_WATERMARK_BYTES. The image default is 1 TiB, which on a 2 TiB spool would strand half the volume; but the watermark must also stay far enough below capacity that the results already in flight when it trips can still finish, or it fires only once the disk is already full — which is the ENOSPC this whole arrangement exists to prevent. Headroom is therefore sized from the worst case: max_result_bytes is 16 GiB and the heavy tier allows 16 concurrent jobs, so 256 GiB can legitimately be mid-write. 2 TiB - 256 GiB = 1.75 TiB, or 87.5% of the volume usable. Quoted: unquoted, YAML reads 13 digits as a float and Helm renders it as 1.924145348608e+12, which the service’s integer parser rejects.

config.tmpDir

string

"/data/tmp"

Directory used for temporary spill files, supplied as TMPDIR. Kept on the persistent volume rather than in /tmp, which is a small in-memory emptyDir.

config.tokenFile

string

"~/.river.token"

Path the console’s PyVO and TOPCAT recipes (and the .ipynb export) tell users to keep their token in, written to MPPDB_TOKEN_FILE. A top-level service setting, NOT branding: it is a path, not a display string. Must differ from other front-ends’ — the accounts deployment keeps ~/.mppdb.token, so a user of both does not have them collide in one file.

config.tokenPageUrl

string

""

URL of the identity provider’s token-creation page, supplied as MPPDB_TOKEN_PAGE_URL. Shown by the console’s token guidance in gafaelfawr auth mode; empty hides the link and tells the user to ask the operator.

config.useVaultSecret

bool

false

Whether to create a VaultSecret for the river secret. When false, the secret is expected to have been created by hand, which is how the initial smoke deployment works.

global.baseUrl

string

Set by Argo CD

Base URL for the environment

global.host

string

Set by Argo CD

Host name for ingress

global.vaultSecretsPath

string

Set by Argo CD

Base path for Vault secrets

image.pullPolicy

string

"IfNotPresent"

Pull policy for the image. Use Always where the tag is mutable, such as a branch name.

image.pullSecrets

list

[]

Names of image pull secrets in the app’s namespace, for a private registry. ghcr.io/mjuric/mppdb is private (the image bakes the source of a private repository), so pulling it requires one; at usdfdev this is the hand-created river-pull docker-registry secret (a read:packages GitHub PAT), managed the same way as the river secret until Vault access exists.

image.repository

string

"ghcr.io/mjuric/mppdb"

Image to run, built by the mppdb repository

image.tag

string

"sha-PLACEHOLDER"

Tag of the image to run. PLACEHOLDER: no image has been published yet, so this must be replaced with a real tag (and pinned per environment) before the chart is deployed.

ingress.annotations

object

{}

Additional annotations for the ingress rule

ingress.authType

string

"basic"

Authentication challenge Gafaelfawr issues on a 401. basic matches the other TAP services, and lets VO clients that only speak HTTP basic send a token as the password.

ingress.pathPrefix

string

"/river"

URL path the service is served under. The service itself serves at the root, so the ingress rewrites this prefix away.

ingress.scope

string

"read:tap"

Gafaelfawr scope required to reach the service. read:tap is the scope every other TAP service in Phalanx requires.

ingress.timeout

int

1800

Timeout for proxied requests, in seconds. Synchronous ADQL queries can run for a long time, and the nginx default of 60s would cut them off.

ingress.useAuthorization

bool

false

Whether Gafaelfawr should replace the client’s Authorization header with the delegated internal token. Must stay false while config.authProvider is apikey, because the service validates that header itself.

nodeSelector

object

{}

Node selector rules for the pod

persistence.size

string

"20Gi"

Size of the claim for config.dataDir

persistence.spoolSize

string

"2Ti"

Size of the separate spool claim, which holds async query results. Sized far above the data claim because a single result can be tens of GiB and results are retained for 7 days; the per-user spool_quota_bytes only means anything if the volume is larger than the quota.

persistence.storageClassName

string

"wekafs--sdf-k8s01"

Storage class backing the claim. wekafs--sdf-k8s01 is the Weka-backed dynamic provisioner used by every other USDF application that needs a read-write-once volume. Omit to use the cluster default.

podAnnotations

object

{}

Annotations for the pod

podSecurityContext

object

{"fsGroup":1000,"runAsGroup":1000,"runAsNonRoot":true,"runAsUser":1000}

Security context for the pod. fsGroup is what makes the persistent volume writable by the unprivileged service user, so it must match the uid and gid the image runs as.

resources

object

{"limits":{"cpu":"4","memory":"8Gi"},"requests":{"cpu":"2","memory":"4Gi"}}

Resource requests and limits. Guess: this is a query front end, not the database, so it is sized for request handling and result spooling rather than for scans. Revisit once real query load has been measured.

tolerations

list

[]

Tolerations for the pod

This page was last modified on .