Skip to main content

Configuration

Look up a setting here. The environment variable tables are built from the code on every site build, so each row links to where the variable is read.

League, team and season​

Three settings identify your team. Set them in each place that reads them.

SettingLocallyOn KubernetesIn the UI
League IDESPN_LEAGUE_IDfantasy/deployment in the secret store, as ESPN_LEAGUE_IDSettings page
Team IDESPN_TEAM_IDfantasy/deployment, as ESPN_TEAM_IDSettings page
SeasonCURRENT_YEARfantasy-league-config ConfigMap, plus the --season arguments in two CronJobsSettings page

Both IDs are in your team's ESPN URL: …/team?leagueId=<league>&teamId=<team>. The deployment treats them as private and keeps them out of Git.

Write safety​

Which bots may write to ESPN is set by DRY_RUN, TRADE_DRY_RUN, TRADE_SUBMIT_ENABLED, TRADE_RESPONSE_ENABLED and AUTO_PUBLISH_IR_MOVES. Their defaults differ by bot. See Run with every write disabled before you change any of them.

Environment variables​

ColumnMeaning
DefaultWhat applies when the variable is unset. A dash means nothing does.
RequiredWhether you must set it, or the condition that makes it required. Many defaults are in-cluster addresses, so outside the cluster you set them anyway.
Labels under the nameSecret: the value is a credential. Set in production: fantasy-infra sets it, possibly from a Secret.

Shared by several services

VariableRequiredDefaultDescription
DB_HOSTSet in productionyes, outside the clustercore: fantasy-db.default.svc.cluster.local; worker: none (node-postgres falls back to PGHOST or localhost)Postgres host.Read in core/src/database.py:10, worker/src/bots/trade_scan.js:153 and 7 more
DB_NAMESet in productionyes, outside the clustercore: fantasy_football; worker: nonePostgres database name.Read in core/src/database.py:11, worker/src/bots/trade_scan.js:154 and 7 more
DB_USERSet in productionyes, outside the clustercore: bot_admin; worker: nonePostgres user.Read in core/src/database.py:12, worker/src/bots/trade_scan.js:155 and 7 more
DB_PASSWORDSecret · Set in production from a Secretyes—Postgres password. Core logs an error and every query fails without it.Read in core/src/database.py:13, worker/src/bots/trade_scan.js:156 and 7 more
REDIS_HOSTSet in productionyes, outside the clusterfantasy-cache.default.svc.cluster.localRedis host for daily locks, the draft feed and notification de-duplication.Read in core/src/api/draft.py:76 and 1 more, worker/src/bots/draft_clicker.js:23 and 3 more
REDIS_PORTSet in productionno6379Redis port.Read in core/src/api/draft.py:77 and 1 more, worker/src/bots/draft_clicker.js:24 and 3 more
AMQP_URLSecret · Set in production from a Secretyes, outside the clusteramqp://guest:[email protected]:5672/%2f (the worker's default ends in // instead)RabbitMQ connection URL, including the credentials. Encode the default vhost as %2f. MoreRead in core/src/ingestion/sync_players.py:21 and 1 more, worker/src/queue/connection.js:8
TRIGGER_API_KEYSecret · Set in production from a Secretyes, for every trigger and job write—Shared key for the API's write endpoints. The API returns 500 on those routes without it; core's jobs send it, and the UI's nginx (or the Vite dev proxy) adds it as X-API-Key. Never expose it as a VITE_ variable. MoreRead in core/src/api/routes.py:45 and 1 more, web-ui/vite.config.ts:17 and 3 more
ESPN_LEAGUE_IDSecret · Set in production from a Secretyes—Your ESPN league ID. Production keeps it in OpenBao with the session cookies. MoreRead in core/src/api/draft.py:109 and 18 more, worker/src/bots/auth.js:294 and 22 more
ESPN_TEAM_IDSecret · Set in production from a Secretyes—Your team's ID within the league. MoreRead in core/src/api/dashboard.py:34 and 14 more, worker/src/bots/check_espn_session.js:26 and 20 more
CURRENT_YEARSet in productionyes, for the first refresh (draft_prep_refresh exits without it)core: the current calendar year; worker: 2026The ESPN season ID, such as 2026. MoreRead in core/src/api/league.py:38 and 8 more, worker/src/bots/auth.js:295 and 12 more
ESPN_S2Secret · Set in production from a Secretyesnull (the worker falls back to OpenBao)The espn_s2 session cookie from a logged-in browser. MoreRead in core/src/ingestion/sync_league.py:46, worker/src/bots/auth.js:76 and 1 more
OTEL_EXPORTER_OTLP_ENDPOINTSet in productionno—OTLP endpoint for traces; tracing is off when unset. Core takes a bare http://host:4318 and appends /v1/traces; the worker exports over gRPC to an http:// URL.Read in core/src/launcher/k8s.py:152 and 1 more, worker/src/telemetry/init.js:35
RUN_IDno—Run log row the job adopts, so a launched run and its log entry match.Read in worker/src/db/run_log.js:59 and 1 more
RUN_TRIGGERno—What started the run, such as schedule, manual or downstream.Read in core/src/services/run_log_service.py:95
RUN_PARENT_IDno—Parent run, for chained jobs.Read in core/src/services/run_log_service.py:298 and 1 more, worker/src/db/run_log.js:61 and 3 more
RUN_CRONJOBSet in productionno—Name of the CronJob that started the run.Read in core/src/services/run_log_service.py:98
RUN_K8S_JOBSet in productionnofalls back to HOSTNAMEName of the Kubernetes Job that started the run.Read in core/src/services/run_log_service.py:99
DRAFT_MODEnocore: live; worker: nonelive or practice. A practice draft lets the clicker submit even when DRY_RUN is unset; mock makes the worker join a practice lobby.Read in core/src/optimization/draft_matrix.py:90, worker/src/bots/draft_sync.js:1310 and 1 more
LLM_PROVIDER_PRIORITYnogroq:openai/gpt-oss-120b, then gemini, then ollama:llama3.1:8b (the Gemini model differs between core and worker)Ordered provider:model list to try. MoreRead in core/src/llm_client.py:245 and 1 more, worker/src/lib/llm_client.js:427
{PROVIDER}_API_KEYsuch as GROQ_API_KEY, GEMINI_API_KEYSecret · Set in production from a Secretyes, for each hosted provider you usenull (falls back to OpenBao)API key for a hosted LLM provider. MoreRead in core/src/api/routes.py:45 and 1 more, web-ui/vite.config.ts:17 and 3 more
OPENBAO_{PROVIDER}_SECRET_PATHsuch as OPENBAO_GROQ_SECRET_PATH, OPENBAO_GEMINI_SECRET_PATHnosecret/fantasy/<provider>OpenBao path read for the provider's key when the variable is unset.Read in worker/src/bots/auth.js:31
{PROVIDER}_RPM_LIMITsuch as GROQ_RPM_LIMIT, GEMINI_RPM_LIMITnogroq 30, gemini 15Requests per minute allowed per provider.
OLLAMA_URLnohttp://keda-add-ons-http-interceptor-proxy.keda.svc.cluster.local:8080Ollama URL. The default goes through the KEDA HTTP add-on, which scales Ollama from zero.Read in core/src/llm_client.py:200 and 1 more, worker/src/lib/llm_client.js:336 and 1 more
OLLAMA_HOST_HEADERnoollama.default.svc.cluster.local (only when OLLAMA_URL is unset)Host header the KEDA interceptor routes on.Read in core/src/llm_client.py:204, worker/src/lib/llm_client.js:338
LLM_HISTORY_CAPTURE_CONTENTnofalse (metadata only)Set to true to store prompt and response text with each LLM call. MoreRead in core/src/services/llm_history.py:41, worker/src/db/activity.js:166

Core pipeline

VariableRequiredDefaultDescription
CORE_API_BASE_URLSet in productionyes, for jobs that call the API: the defaults name a namespace the manifests don't usehttp://fantasy-core-pipeline.core.svc.cluster.local:8000 (trigger client) or http://fantasy-api.core.svc.cluster.local:8000 (stale draft sweeper)Base URL core's jobs use to call the core API's trigger endpoints.Read in core/src/ops/sweep_stale_draft_jobs.py:38 and 1 more
ESPN_SWIDSecret · Set in production from a Secretyes, for ESPN reads—The SWID cookie, under the name core reads. The worker reads the same value as SWID. MoreRead in core/src/ingestion/sync_league.py:47
AUTO_PUBLISH_IR_MOVESSet in productionnooffLets the waiver evaluator publish IR stash moves without a human (1, true or yes). MoreRead in core/src/optimization/waiver_evaluator.py:61
OTEL_CONSOLE_EXPORTno—Set to 1 to print core's spans to the console.Read in core/src/telemetry.py:48
WORKER_OTEL_EXPORTER_OTLP_ENDPOINTno—OTLP endpoint the job launcher passes to the worker pods it starts.Read in core/src/launcher/k8s.py:157
RUN_ATTEMPTno—Attempt number of a launcher run.Read in core/src/services/run_log_service.py:294 and 1 more
JOB_NAMESet in productionno—Scopes idempotency keys for the lineup optimizer and rumor action jobs.Read in core/src/optimization/lineup_solver.py:668 and 2 more
JOB_CATALOG_PATHno/etc/fantasy-job-catalog/catalog.yamlJob catalog the launcher schedules and the /v1/jobs API reads.Read in core/src/launcher/catalog.py:438
{PROFILE}_IMAGEsuch as CORE_IMAGE, WORKER_IMAGEyes, for each image placeholder the job catalog uses—Image reference the launcher substitutes for a catalog profile's image placeholder.
K8S_NAMESPACEnodefaultNamespace the API and launcher create Jobs in.Read in core/src/k8s_client.py:9
DRAFT_SYNC_IMAGESet in productionyes, for drafts (POST /v1/draft/start returns 500 without it)—Core image the API runs draft listener Jobs from.Read in core/src/api/draft.py:78
BROWSER_WORKER_IMAGESet in productionyes, for drafts—Worker image the API runs draft clicker Jobs from.Read in core/src/api/draft.py:138
DRAFT_SYNC_ENV_SECRETSet in productionyes, for drafts—Name of the Secret holding the ESPN cookies and IDs that draft Jobs load.Read in core/src/api/draft.py:84
DRAFT_SYNC_ENV_CONFIGMAPSet in productionyes, for drafts—Name of the ConfigMap holding league settings that draft Jobs load.Read in core/src/api/draft.py:85
DRAFT_SYNC_DB_SECRET_NAMEnodatabase-credentialsSecret holding the Postgres password for draft Jobs.Read in core/src/api/draft.py:92
DRAFT_SYNC_DB_SECRET_KEYnopostgres-passwordKey within that Secret.Read in core/src/api/draft.py:93
DRAFT_PICK_CLOCK_SECONDS_LIVEno90Pick clock the API assumes for a live draft.Read in core/src/api/draft.py:119
DRAFT_PICK_CLOCK_SECONDS_PRACTICEno30Pick clock the API assumes for a practice draft.Read in core/src/api/draft.py:120
AUTO_DRAFT_DELAY_SECONDS_LIVEno45How long into a live pick the bot waits before auto-publishing its choice.Read in core/src/api/draft.py:123
AUTO_DRAFT_DELAY_SECONDS_PRACTICEno15Auto-publish delay for a practice draft.Read in core/src/api/draft.py:129
DRAFT_STATUS_STALENESS_SECONDSno15Age after which the API reports draft status as stale.Read in core/src/api/draft.py:133
DRAFT_PICK_CLOCK_SECONDSno90 (set per Job by the API)Pick clock the draft listener uses.Read in core/src/optimization/draft_matrix.py:66
AUTO_DRAFT_DELAY_SECONDSno8 (set per Job by the API)Auto-publish delay the draft listener uses.Read in core/src/optimization/draft_matrix.py:60 and 1 more
MIN_AUTO_PUBLISH_WINDOW_SECONDSno10Smallest time left on the clock in which the listener still auto-publishes.Read in core/src/optimization/draft_matrix.py:78
MAX_CONSECUTIVE_PUBLISH_FAILURESno3Publish failures in a row before the listener stops auto-publishing.Read in core/src/optimization/draft_matrix.py:85
PICK_REJECTION_GRACE_SECONDSno10How long the listener waits for a rejected pick to clear before acting again.Read in core/src/optimization/draft_matrix.py:103
MATCHUP_WEIGHTING_ENABLEDnofalseWeights VORP by opponent defense strength. Only the exact string true enables it. MoreRead in core/src/optimization/vorp_matrix.py:32
RUMOR_ACTION_CONFIDENCE_THRESHOLDno0.75Minimum rumor confidence before the rumor action job acts.Read in core/src/services/rumor_action_service.py:43
OUTGOING_COMMIT_HOURSno72How long an approved outgoing trade stays committed.Read in core/src/services/trade_offer_service.py:189
ACTIVITY_DEPENDENCY_HOLD_SECONDSno3600How long a dependent activity waits for the activity it depends on.Read in core/src/services/activity_service.py:81
LLM_CONTENT_RETENTION_DAYSno90Days to keep captured LLM prompt and response text.Read in core/src/services/activity_runner.py:376
RUN_LOG_RETENTION_DAYSno90Days to keep run log rows.Read in core/src/services/activity_runner.py:383
MCP_GOOGLE_OAUTH_CLIENT_IDyes, for /mcpnull (the MCP endpoint rejects every token)Google OAuth client ID that MCP access tokens must be issued for.Read in core/src/api/mcp_server.py:38
MCP_GOOGLE_ALLOWED_EMAILyes, for /mcp—The one Google account allowed to use the MCP endpoint.Read in core/src/api/mcp_server.py:39
MCP_RESOURCE_URLnohttp://fantasy-core-pipeline.default.svc.cluster.local:8000/mcpPublic URL of the MCP endpoint, used as the OAuth resource.Read in core/src/api/mcp_server.py:40
MCP_ALLOWED_HOSTSnoemptyComma-separated Host headers the MCP endpoint accepts.Read in core/src/api/mcp_server.py:57
CHAT_LLM_PROVIDER_PRIORITYnofalls back to LLM_PROVIDER_PRIORITYProvider order for the chat endpoint. Ollama is always excluded. MoreRead in core/src/services/chat_service.py:67
LLM_REQUEST_TIMEOUT_SECONDSno15Timeout for a hosted provider request from core.Read in core/src/llm_client.py:126
OLLAMA_REQUEST_TIMEOUT_SECONDSno100Timeout for an Ollama request from core, which allows for a cold start.Read in core/src/llm_client.py:125
REDDIT_CLIENT_IDSecretnonull (Reddit is skipped and only RSS feeds are read)Reddit API app ID. MoreRead in core/src/ingestion/sync_rumors.py:109
REDDIT_CLIENT_SECRETSecretno—Reddit API app secret. MoreRead in core/src/ingestion/sync_rumors.py:110
REDDIT_USER_AGENTno—User agent sent to Reddit. MoreRead in core/src/ingestion/sync_rumors.py:111 and 1 more
REDDIT_MIN_SCOREno20Minimum post score to ingest.Read in core/src/ingestion/sync_rumors.py:40
REDDIT_MAX_POST_AGE_HOURSno72Oldest post to ingest.Read in core/src/ingestion/sync_rumors.py:41

Browser worker

VariableRequiredDefaultDescription
CORE_PIPELINE_URLyes, outside the cluster, for the trade botshttp://fantasy-core-pipeline.default.svc.cluster.local:8000Base URL the worker uses to call the core API for trade scoring, context and candidates.Read in worker/src/lib/core_pipeline.js:5
SWIDSecret · Set in production from a Secretyesnull (falls back to OpenBao)The SWID cookie, under the name the worker reads. Core reads the same value as ESPN_SWID. MoreRead in worker/src/bots/auth.js:76 and 1 more
ESPN_SESSION_STATE_FILESecret · Set in productionyes, for the draft room, trade builder and other rendered pagesnull (falls back to OpenBao)Path to a saved Playwright storage state (cookies plus the Disney login's localStorage). MoreRead in worker/src/bots/auth.js:152
OPENBAO_ESPN_SECRET_PATHnosecret/fantasy/espnOpenBao path the worker reads espn_s2 and swid from when the cookie variables are unset. MoreRead in worker/src/bots/auth.js:31
OPENBAO_ESPN_SESSION_STATE_PATHnosecret/fantasy/espn-session-stateOpenBao path for the saved browser session, read by the bots and written by the remote login Job. MoreRead in worker/src/bots/auth.js:91 and 1 more
OPENBAO_K8S_ROLEnofantasy-browser-workerOpenBao Kubernetes auth role the remote login Job uses to save the session.Read in worker/src/bots/remote_login.js:118 and 1 more
CDP_DEBUG_PORTno—Opens a Chrome DevTools port on the bot's browser for live debugging.Read in worker/src/bots/auth.js:190 and 1 more
NODE_ENVno—When production, the bots block images, CSS and fonts to speed up page loads.Read in worker/src/bots/auth.js:260
FORCE_MANUAL_LOGINno—Makes the recon tools ignore the saved session and prompt for a fresh login. MoreRead in worker/src/bots/draft_recon.js:164 and 1 more
TRADE_RECON_TO_TEAM_IDyes, for trade_recon—Opposing team the trade recon tool opens a trade with.Read in worker/src/bots/trade_recon.js:195
LOGIN_WAIT_TIMEOUT_MSno1800000How long the remote login Job waits for you to log in over VNC.Read in worker/src/bots/remote_login.js:43
LOGIN_POLL_INTERVAL_MSno5000How often the remote login Job checks for a completed login.Read in worker/src/bots/remote_login.js:46
VNC_DISPLAYno:99X display the remote login image starts Xvfb on.Read in worker/scripts/start-vnc.sh:20
VNC_RESOLUTIONno1280x800x24Virtual screen size for the remote login browser.Read in worker/scripts/start-vnc.sh:21
VNC_PORTno5900x11vnc port in the remote login image.Read in worker/scripts/start-vnc.sh:22
NOVNC_PORTno6080noVNC web client port in the remote login image.Read in worker/scripts/start-vnc.sh:23
VNC_PASSWORDSecretnonull (no password)Password for the remote login VNC session. Without it, only a port-forward protects the session.Read in worker/scripts/start-vnc.sh:52
DRY_RUNnoper bot: lineup is live, every other bot dry-runsOnly 0, false or no make a bot write to ESPN; any other non-blank value forces a dry run. Set DRY_RUN=true while you evaluate the stack, because the lineup bot is live by default. More
TRADE_DRY_RUNSet in productionnofalls back to DRY_RUNDry-run switch for trade submissions only, parsed like DRY_RUN. It lets trades go live without arming every other bot. More
TRADE_SUBMIT_ENABLEDSet in productionnooffArms outgoing trade submissions (1, true or yes). An approval and verified selectors are still required. MoreRead in worker/src/bots/trade_builder.js:97
TRADE_RESPONSE_ENABLEDnooffArms accept, decline and counter responses to incoming trades (1, true or yes). MoreRead in worker/src/bots/trade_response.js:78
IDLE_EXIT_SECONDSSet in productionno0 (never exit)The worker exits after this many idle seconds, so a KEDA-scaled pod frees its slot. Production uses 120.Read in worker/src/index.js:115
DEBUG_CAPTUREnoonSet to 0, false or no to stop saving page snapshots and the ESPN write log. MoreRead in worker/src/bots/debug_capture.js:26
DEBUG_OUTPUT_DIRno<repo>/recon-outputWhere debug captures and recon output are written.Read in worker/src/bots/debug_capture.js:22 and 4 more
POD_NAMEnofalls back to HOSTNAMEIdentifies the pod in the draft session registry.Read in worker/src/bots/session_registry.js:98
LOG_LEVELnoinfopino log level. MoreRead in worker/src/telemetry/logger.js:11
OTEL_SERVICE_NAMESet in productionnofantasy-browser-workerService name on worker traces. Production sets a name per workload for core as well.Read in worker/src/telemetry/init.js:27
DRAFT_ROOM_URLno—Opens this draft room URL instead of navigating from the league.Read in worker/src/bots/draft_sync.js:1302 and 2 more
DRAFT_HEALTH_INTERVAL_MSno10000How often the draft sync checks its own health.Read in worker/src/bots/draft_sync.js:50
DRAFT_PICK_SILENCE_WARN_MSno180000Warns when no pick has been seen for this long.Read in worker/src/bots/draft_sync.js:56
DRAFT_STALL_TERMINAL_CYCLESno3Failed health cycles before the draft sync gives up.Read in worker/src/bots/draft_sync.js:65
DRAFT_COMMAND_POLL_INTERVAL_MSno1000How often the draft sync polls Redis for pick commands.Read in worker/src/bots/draft_sync.js:71
DRAFT_COMMAND_CONFIRM_TIMEOUT_MSno5000How long to wait for ESPN to confirm a pick command.Read in worker/src/bots/draft_sync.js:78
DRAFT_DOM_POLL_INTERVAL_MSno5000How often the draft room page is re-read.Read in worker/src/bots/draft_dom_observer.js:67
DRAFT_WATCH_STALL_MSno45000Stall threshold for the draft-watch script.Read in worker/scripts/draft-watch.js:52
LLM_REQUEST_TIMEOUT_MSno15000Timeout for a hosted provider request from the worker.Read in worker/src/lib/llm_client.js:169
OLLAMA_REQUEST_TIMEOUT_MSno100000Timeout for an Ollama request from the worker.Read in worker/src/lib/llm_client.js:166
OLLAMA_DIRECT_URLnohttp://ollama.default.svc.cluster.local:11434Ollama URL the worker uses for calls that bypass the interceptor.Read in worker/src/lib/llm_client.js:407
TRADE_EVALUATE_TIMEOUT_MSno10000Timeout for the core trade evaluation call.Read in worker/src/bots/trade_bot.js:35
TRADE_SCORE_TIMEOUT_MSno30000 for scans, 20000 in the trade inboxTimeout for the core trade score call.Read in worker/src/bots/trade_inbox.js:68
TRADE_CONTEXT_TIMEOUT_MSno30000Timeout for the core trade context and bye outlook calls.
TRADE_INBOX_SHADOW_ACCEPT_MIN_SCOREno—Score at or above which the inbox's advisory shadow decision says accept.
TRADE_INBOX_SHADOW_DECLINE_MAX_SCOREno—Score at or below which the inbox's advisory shadow decision says decline.
RUMOR_DIGEST_CHUNK_SIZEno20Rumors per LLM request in the daily digest.Read in worker/src/bots/rumor_digest_bot.js:33
RUMOR_DIGEST_TOKEN_BUDGETno6000Token budget per digest request.Read in worker/src/bots/rumor_digest_bot.js:37
RUMOR_DIGEST_CHUNK_DELAY_MSno60000Pause between digest requests, to stay under provider rate limits.Read in worker/src/bots/rumor_digest_bot.js:64
NTFY_URLSet in productionnonull (nothing is sent)ntfy server URL for phone notifications. MoreRead in worker/src/lib/notify.js:93
NTFY_TOKENSecret · Set in production from a Secretnonull (nothing is sent)ntfy access token with publish rights to the topic. MoreRead in worker/src/lib/notify.js:94
NTFY_TOPICSet in productionnofantasyntfy topic. MoreRead in worker/src/lib/notify.js:47
WEB_UI_BASE_URLSet in productionnonull (pushes carry no link)Public UI URL that notification taps open. MoreRead in worker/src/lib/notify.js:38

Web UI

VariableRequiredDefaultDescription
CORE_API_UPSTREAMyes, outside the clusterfantasy-core-pipeline.default.svc.cluster.local:8000 (set in the image)host:port that the UI container's nginx proxies /v1/ to.Read in web-ui/nginx.conf.template:36
VITE_API_PROXY_TARGETnohttp://localhost:8000Core API URL the Vite dev server proxies /v1 to. Set it in the shell, not in .env.local. MoreRead in web-ui/vite.config.ts:8
VITE_DEV_LEAGUE_IDnoemptyLeague ID prefilled in dev builds only. Put it in .env.local.Read in web-ui/src/hooks/useDraftConfig.ts:12
VITE_DEV_TEAM_IDnoemptyTeam ID prefilled in dev builds only. Put it in .env.local.Read in web-ui/src/hooks/useDraftConfig.ts:13
VITEST_MAX_WORKERSno25%Vitest worker limit.Read in web-ui/vitest.config.ts:10

Platform images and libraries

VariableRequiredDefaultDescription
OTEL_EXPORTER_OTLP_PROTOCOLSet in productionnoSDK defaultRead by the OpenTelemetry SDKs; production sets http/protobuf for core and grpc for the worker.
POSTGRES_DBSet in productionyes—Database the Postgres image creates on first start (fantasy_football).
POSTGRES_USERSet in productionyes—Owner the Postgres image creates (bot_admin).
POSTGRES_PASSWORDSecret · Set in production from a Secretyes—That user's password; the same value as DB_PASSWORD.
PGDATASet in productionno—Postgres data directory inside the volume.
PGHOSTSet in productionyes—psql connection for the read-only role Job.
PGDATABASESet in productionyes—psql connection for the read-only role Job.
PGUSERSet in productionyes—psql connection for the read-only role Job.
PGPASSWORDSecret · Set in production from a Secretyes—psql connection for the read-only role Job.
READONLY_PASSWORDSecret · Set in production from a Secretyes—Password the Job sets on the grafana_reader role. More
RABBITMQ_DEFAULT_USERSecret · Set in production from a Secretyes—Broker user that the definitions init container creates and the probes check. More
RABBITMQ_DEFAULT_PASSSecret · Set in production from a Secretyes—That user's password.
RABBITMQ_VM_MEMORY_HIGH_WATERMARK_RELATIVESet in productionno—Share of container memory at which RabbitMQ blocks publishers (0.4).
OAUTH2_PROXY_CLIENT_IDSecret · Set in production from a Secretyes—Google OAuth client ID for the sign-in proxy. More
OAUTH2_PROXY_CLIENT_SECRETSecret · Set in production from a Secretyes—Google OAuth client secret.
OAUTH2_PROXY_REDIRECT_URLSecret · Set in production from a Secretyes—Your public callback URL, ending in /oauth2/callback. Production keeps it in OpenBao.
ARGOCD_IMAGE_UPDATER_KUSTOMIZE_V5Set in productionno—Image Updater setting; see the Argo CD Image Updater docs.
ARGOCD_IMAGE_UPDATER_GIT_COMMIT_USERSet in productionno—Author of the Image Updater's digest commits.
ARGOCD_IMAGE_UPDATER_GIT_COMMIT_EMAILSet in productionno—Email on the Image Updater's digest commits.
ARGOCD_IMAGE_UPDATER_WRITE_BACK_METHODSet in productionno—git, so new digests are committed to fantasy-infra.
ARGOCD_IMAGE_UPDATER_WRITE_BACK_TARGETSet in productionno—kustomization, so digests land in the overlay's images list.
ARGOCD_IMAGE_UPDATER_LOG_LEVELSet in productionno—Image Updater log level.
ARGOCD_IMAGE_UPDATER_HEALTH_PORTSet in productionno—Image Updater health port.

How is this page kept current?​

The descriptions live in docs/installation/env-vars.yaml. Each full site build scans core, the worker, the UI and fantasy-infra, and fails when a variable is read or set but not described, described but no longer read, or set from a Secret but not marked secret. The nightly build catches a new variable within a day. To check before you push, run npm run check:env from this repository with the other checkouts next to it, or with FANTASY_DOCS_ROOT pointing at them.