Skip to main content

Environment variables

Most installations need only POSTGRES_PASSWORD, REDIS_PASSWORD, and ALLOWED_ORIGINS. Copy compose/.env.example to the repository-root .env; use compose/.env.full.example as the complete override template. The standard production service passes that root .env through its env_file, so supported optional values do not need matching entries in compose/docker-compose.yml.

Standard production values​

VariableRequiredDefaultPurpose
POSTGRES_PASSWORDYesNonePassword shared by TimescaleDB and the app's generated internal connection URL. Any dotenv-safe value is URL-encoded by the app.
REDIS_PASSWORDYesNonePassword shared by Redis and the app's generated internal connection URL.
ALLOWED_ORIGINSYesNone in productionComma-separated exact HTTPS browser origins. Paths, credentials, queries, fragments, and HTTP origins are rejected in production unless the explicit LAN-only exception below is enabled.
POSTGRES_USERNoriviamigoDatabase role used by production Compose.
DATABASE_URLNoBuilt from POSTGRES_USER and POSTGRES_PASSWORDComplete PostgreSQL URL. Overrides the standard Compose-derived URL and is required for direct API runs without POSTGRES_PASSWORD.
REDIS_URLNoBuilt from REDIS_PASSWORDComplete Redis URL using the Redis ACL default user. Overrides the standard Compose-derived URL and is required for direct API runs without REDIS_PASSWORD.

Image and Compose values​

VariableDefaultPurpose
RIVIAMIGO_IMAGEUnsetComplete image reference override, including an optional @sha256: digest. When set, it takes precedence over RIVIAMIGO_IMAGE_REGISTRY and IMAGE_TAG.
RIVIAMIGO_IMAGE_REGISTRYghcr.io/bballdavisRegistry namespace containing the unified riviamigo image.
IMAGE_TAGlatestImage tag; use a Calendar Version for repeatable deployments.
RIVIAMIGO_ORIGIN_PORT8080Host port mapped to the unified app container. Protect it with host firewall rules when using a remote gateway.
RIVIAMIGO_HOST_BIND_ADDRESS127.0.0.1Docker host-side address for the published origin port. Prefer the loopback default or remove host publication when the gateway shares the Docker network. A non-loopback override needs an explicit firewall boundary.
RIVIAMIGO_BIND_ADDRESS127.0.0.1Application listener address inside the container. It is not the Docker host publication address.
ALLOW_PUBLIC_ORIGIN_BINDfalseRequired, with the literal value true, before a non-loopback application RIVIAMIGO_BIND_ADDRESS is accepted. This is an explicit exposure opt-in, not a substitute for the authenticated gateway and firewall.
ALLOW_INSECURE_LAN_HTTP_AUTHfalseLAN-only exception. With the literal value true, permits non-Secure refresh cookies only when ALLOW_PUBLIC_ORIGIN_BIND=true, the API binds to an unspecified/private/loopback/link-local IP, and every ALLOWED_ORIGINS entry is an exact http:// private/loopback/link-local IP literal. It rejects hostnames, public IPs, HTTPS/HTTP mixes, paths, and credentials. Browser credentials and telemetry can be intercepted; prefer HTTPS.
RIVIAMIGO_ENV_FILE../.env relative to compose/docker-compose.ymlAlternate dotenv file injected into the app container. For a downloaded Synology project, set this to .env in the Container Manager project settings.
RIVIAMIGO_DB_SOURCE${RIVIAMIGO_DATA_DIR:-../data}/dbDatabase volume source. Set to riviamigo-db for a Docker-managed volume on new installs.
RIVIAMIGO_REDIS_SOURCE${RIVIAMIGO_DATA_DIR:-../data}/redisRedis volume source. Set to riviamigo-redis for a Docker-managed volume on new installs.
RIVIAMIGO_BACKUPS_SOURCE${RIVIAMIGO_DATA_DIR:-../data}/backupsBackup artifact volume source. Set to riviamigo-backups for a Docker-managed volume on new installs.
RIVIAMIGO_CACHE_SOURCE${RIVIAMIGO_DATA_DIR:-../data}/cacheApplication cache volume source. Set to riviamigo-cache for a Docker-managed volume on new installs.

Application security and runtime​

VariableDefaultPurpose
JWT_SECRETGenerated and stored in PostgreSQLRSA private signing key. If overridden, the public and age keys must also be supplied.
JWT_PUBLIC_KEYGenerated and stored in PostgreSQLRSA public verification key. Supply only as part of the complete three-key override.
AGE_ENCRYPTION_KEYGenerated and stored in PostgreSQLage X25519 identity used to encrypt provider credentials. Supply only as part of the complete three-key override.
RIVIAMIGO_SETUP_TOKENUnsetOne-time first-owner proof for production registration. Mutually exclusive with RIVIAMIGO_SETUP_TOKEN_FILE; must be at least 32 bytes. Known example placeholders are rejected. Keep this value out of shell history where possible.
RIVIAMIGO_SETUP_TOKEN_FILEUnsetFile containing the one-time first-owner proof. Mutually exclusive with RIVIAMIGO_SETUP_TOKEN; one trailing line ending is accepted. Prefer a mounted secret file.
RIVIAMIGO_ENVproductionEnables production configuration validation. Use development only for local development.
PORT3001Internal API listener port. The unified production nginx expects 3001.
RUST_LOGriviamigo_api=debug,tower_http=infoRust tracing filter. Structured [riviamigo][LEVEL] key-value logs are written to stdout.
TZUTCDocker/container timezone used by nginx and other runtime processes. This does not control Riviamigo’s user-facing application timezone, which is configured in Settings → Units.
COOKIE_INSECUREUnset; true in compose/docker-compose.dev.ymlStrict local-development-only boolean for non-Secure refresh cookies. true enables it in RIVIAMIGO_ENV=development; false keeps cookies Secure; production rejects the variable when explicitly set. It is required when the local/test browser origin is plain HTTP, otherwise refresh after a page reload can appear as a logout. Use ALLOW_INSECURE_LAN_HTTP_AUTH=true only for the separately documented trusted-LAN production exception.
VEHICLE_IMAGE_CACHE_DIRPlatform cache directory; /data/cache/riviamigo/vehicle-images in the production imagePersistent local artwork mirror. Standard Compose does not need to set it.
RIVIAMIGO_DATA_DIR../data relative to compose/docker-compose.ymlOverrides the host directory used for PostgreSQL, Redis, backups, and cache data. Primarily useful for isolated verification stacks.
BACKUP_DRIVERpg_dumpRecovery-package database exporter. Other values are rejected for full recovery packages.
BACKUP_ARTIFACT_DIR/backupsDirectory containing generated, imported, safety, and restore-job recovery artifacts. Keep it on persistent storage with capacity for the uploaded package plus a required safety backup.
BACKUP_POLL_INTERVAL_SECONDS60Number of seconds between backup-scheduler checks.
RESTORE_AGENT_URLhttp://127.0.0.1:3002Internal unified-container restore supervisor URL. Do not expose it as a public service.
RESTORE_AGENT_KEY_FILE/backups/.restore-agent-keyInternal capability key generated by the production supervisor as the application user. Keep it inside the persistent backup volume.
RECOVERY_MAX_UPLOAD_BYTES17179869184 (16 GiB)Largest accepted imported recovery package.
RECOVERY_MAX_EXPANDED_BYTES68719476736 (64 GiB)Largest permitted expanded recovery archive.
RECOVERY_MAX_MEMBER_BYTES68719476736 (64 GiB)Largest permitted individual archive member. Cannot exceed the expanded limit.
RECOVERY_MAX_MANIFEST_BYTES1048576 (1 MiB)Independent manifest JSON limit during validation and extraction.
RECOVERY_MAX_SETTINGS_BYTES1048576 (1 MiB)Independent backup-settings JSON limit.
RECOVERY_MAX_HISTORY_BYTES16777216 (16 MiB)Operational-history JSON limit; records are parsed and merged incrementally.
RECOVERY_MAX_MEMBERS10000Maximum archive-member count.
RECOVERY_MAX_COMPRESSION_RATIO200Maximum permitted expanded-to-compressed archive ratio.
RECOVERY_MIN_FREE_BYTES2147483648 (2 GiB)Minimum free artifact-volume space before import/write steps. Values below 2 GiB are rejected.
RECOVERY_UPLOAD_DEADLINE_SECONDS1800 (30 min)Deadline for receiving and validating an imported package.
RECOVERY_RESTORE_DEADLINE_SECONDS14400 (4 hr)Deadline for the restore supervisor's destructive swap operation.
S3_ENDPOINTUnsetOptional fallback endpoint when the saved S3 endpoint is empty. Custom endpoints use path-style addressing.
S3_ACCESS_KEYUnsetOptional fallback access key used only when a complete saved credential pair is unavailable.
S3_SECRET_KEYUnsetOptional fallback secret key paired with S3_ACCESS_KEY; never returned by the API or stored in recovery packages.

Resource and outbound controls​

VariableDefaultPurpose
WS_MAX_PER_USER8Concurrent live sockets per account.
WS_MAX_PER_VEHICLE32Concurrent live sockets per vehicle.
WS_MAX_GLOBAL128Concurrent live sockets per API process. Admission precedes Redis subscription allocation.
METRICS_MAX_PER_USER4Concurrent metric/Grafana operations per account.
METRICS_MAX_GLOBAL8Concurrent metric/Grafana operations per API process; maximum configurable value is 16 to retain database connection capacity.
METRICS_TIMEOUT_SECONDS600Whole metric-operation deadline. Match upstream proxy timeouts when changing it.
BASEMAP_CACHE_MAX_BYTES134217728 (128 MiB)Shared basemap payload, metadata and index budget. Cache pressure produces misses, not global operational-key eviction.
BASEMAP_CACHE_TTL_SECONDS604800 (7 days)Lifetime of each cached basemap payload and response metadata.
REDIS_MAXMEMORY192mbProduction Compose Redis limit beneath its 256 MiB container limit. Uses noeviction; operational writes can fail if the remaining headroom is exhausted.
WEATHER_MAX_RESPONSE_BYTES10485760Actual weather response-body byte limit.
RIVIAN_MAX_RESPONSE_BYTES10485760Actual Rivian HTTP response-body byte limit.
GEOCODER_MAX_RESPONSE_BYTES2097152Actual geocoder response-body byte limit.
OIDC_MAX_RESPONSE_BYTES2097152Discovery, token and JWKS response-body byte limit.
OIDC_PRIVATE_NETWORK_ALLOWLISTEmptyOperator-owned comma-separated private CIDRs for HTTPS OIDC providers. Restores cannot populate this policy.
S3_PRIVATE_NETWORK_ALLOWLISTEmptyOperator-owned comma-separated private CIDRs for custom S3 endpoints.
S3_ALLOW_INSECURE_PRIVATE_HTTPfalseExplicit trusted-LAN S3 HTTP exception; also requires matching private CIDRs. Public HTTP is always rejected.
S3_ALLOW_DEVELOPMENT_GARAGEfalseDevelopment-only exception for the exact operator-configured S3_ENDPOINT origin resolving exclusively to local/private addresses. The dev launcher and dev Compose enable it for Garage. Ignored in production.
DEV_HOST_BIND_ADDRESS127.0.0.1Development Compose publication address for API, PostgreSQL, Redis and Garage ports. Override only for intentional network sharing.

Weather/geocoder private-network policy remains in External Connections. Every outbound connection validates all current DNS answers and pins those addresses while retaining the hostname for TLS/signing. Mixed public/private answers, metadata/link-local addresses and redirects are rejected. Environment HTTP proxies do not bypass this policy. Public providers use HTTPS; private exceptions must be explicit and limited to their intended CIDRs.

OIDC and authentication overrides​

Database-backed authentication settings under Settings > Authentication are the primary configuration path. Each value below overrides only the same field in the database when set; the settings response identifies the effective source. Secrets are write-only and never returned. OIDC and password login are independent switches. Both default to the safe local-login posture: OIDC off and password login on. Automatic SSO starts are off by default.

VariableDefaultPurpose
RIVIAMIGO_OIDC_ENABLEDDatabase/default falseShow and enable the OIDC SSO login flow.
RIVIAMIGO_PASSWORD_LOGIN_ENABLEDDatabase/default trueKeep the local password form and password endpoint available. Set false only after testing SSO and recording break-glass recovery.
RIVIAMIGO_OIDC_AUTO_LOGINDatabase/default falseAutomatically start SSO from the login page when the provider is ready, regardless of the password-login setting. A failed or cancelled callback stays on the login page for a manual retry.
RIVIAMIGO_OIDC_ISSUER_URLDatabase/unsetOIDC issuer URL used for discovery and token validation. The runtime requires an absolute HTTPS URL.
RIVIAMIGO_OIDC_PUBLIC_BASE_URLDatabase/unsetPublic HTTPS base URL used to derive the exact /v1/auth/oidc/callback redirect URI.
RIVIAMIGO_OIDC_CLIENT_IDDatabase/unsetConfidential OIDC client identifier.
RIVIAMIGO_OIDC_CLIENT_SECRETDatabase/unsetClient secret override. Mutually exclusive with _FILE; never returned by the API.
RIVIAMIGO_OIDC_CLIENT_SECRET_FILEUnsetOptional overlay-only path to a mounted file containing the client secret. Mutually exclusive with the direct secret variable; the standard Compose file does not mount this path, so setting it without the overlay fails startup. The supplied OIDC secret Compose overlay sets it automatically.
RIVIAMIGO_OIDC_CLIENT_SECRET_SOURCEUnsetOptional overlay-only host file consumed by compose/docker-compose.oidc-secret.yml. Compose also passes this non-secret path through the shared dotenv environment, but Riviamigo does not read it; setting it without the overlay is inert.
RIVIAMIGO_OIDC_BUTTON_LABELSign in with SSOText shown on the SSO button.
RIVIAMIGO_OIDC_SCOPESopenid email profileSpace-separated provider scopes. openid is mandatory; Riviamigo rejects or hides an OIDC configuration that omits it.
RIVIAMIGO_OIDC_TOKEN_AUTH_METHODautoToken endpoint authentication: auto, client_secret_basic, or client_secret_post.
RIVIAMIGO_OIDC_AUTO_SIGNUPDatabase/default falsePermit a qualifying new OIDC identity to create a basic user.
RIVIAMIGO_OIDC_AUTO_LINK_VERIFIED_EMAILDatabase/default falsePermit a verified provider email to link to one matching existing account. With no domain or extra claim restriction, any verified email domain from this provider qualifies.
RIVIAMIGO_OIDC_ALLOWED_EMAIL_DOMAINSDatabase/unsetOptional comma-separated, case-insensitive email domains allowed by auto-link/auto-signup policy. Unset accepts all verified email domains.
RIVIAMIGO_OIDC_REQUIRED_CLAIM_NAMEDatabase/unsetOptional exact claim name required for OIDC login. Must be set together with the claim value.
RIVIAMIGO_OIDC_REQUIRED_CLAIM_VALUEDatabase/unsetOptional exact value for the required claim. Must be set together with the claim name.

The first-owner setup proof remains required for a new production installation. For recovery, remove malformed or stale OIDC overrides from the root .env, including any RIVIAMIGO_OIDC_CLIENT_SECRET_FILE and RIVIAMIGO_OIDC_CLIENT_SECRET_SOURCE values, then set RIVIAMIGO_PASSWORD_LOGIN_ENABLED=true and RIVIAMIGO_OIDC_ENABLED=false. Recreate only the app container without including the optional OIDC secret overlay: committed startup code parses OIDC environment values before the application can serve the recovery login. Repair and test the provider as a local super-user, remove the temporary overrides, and recreate only the app container again. See OIDC single sign-on.

| CHARGE_IDENTITY_BACKFILL_BATCH_SIZE | 1000 | Historical charge payloads processed per transaction. Valid range: 100-10000. | | CHARGE_IDENTITY_BACKFILL_PAUSE_MS | 100 | Delay between successful backfill batches. Valid range: 0-5000 milliseconds. |

The charge identity backfill does not introduce a second container. After the schema expansion, the in-process worker uses the existing app runtime and persists resumable progress in PostgreSQL; /health only proves that the app is ready to serve, not that every populated vehicle has finished backfilling.

The setup endpoint reports whether a proof is required and available, but never reveals its source or value. An unclaimed production installation without a configured proof remains healthy but refuses registration.

Generated application keys live in PostgreSQL, but Riviamigo recovery packages exclude them. Restore generates fresh keys unless the complete external trio is configured; provider credentials and sessions must be recreated. This is an explicitly accepted P2 shared-fate risk: compromise of the live database can affect both application state and locally generated keys. Operators who need separate key custody should supply all three external overrides from their secret manager and maintain a tested recovery path for that manager. Administrators can inspect the active source through GET /v1/admin/security/status; startup logs expose only the source category, never key material. Supplying a new explicit age key to an existing database can make stored encrypted credentials unreadable; treat key changes as a migration.

Rivian telemetry behavior​

VariableDefaultPurpose
RIVIAN_GRAPHQL_GATEWAY_URLRivian production GraphQL gatewayDiagnostic upstream override. Normal installations should not set it.
RIVIAN_WS_RECONNECT_INITIAL_SECONDS10Initial websocket reconnect delay.
RIVIAN_WS_RECONNECT_MAX_SECONDS900Maximum websocket reconnect delay.
RIVIAN_RAW_EVENT_RETENTION_DAYS7Raw telemetry retention window in days.
RIVIAN_PERSIST_RAW_EVENTStruePersists raw Rivian events for diagnostics and repair.
RIVIAN_SUPPRESS_DUPLICATE_TELEMETRYtrueAvoids storing unchanged duplicate telemetry samples.
PARALLAX_ENABLEDtrueRuns the integrated in-process extended telemetry acquisition subsystem. Set false only for emergency rollback.

API rate limits​

All values must be positive integers. Per-minute settings control sustained traffic; burst settings control short spikes.

VariableDefault
RATE_LIMIT_AUTH_PUBLIC_PER_MINUTE30
RATE_LIMIT_AUTH_PUBLIC_BURST10
RATE_LIMIT_AUTH_METADATA_PER_MINUTE1200
RATE_LIMIT_AUTH_METADATA_BURST120
RATE_LIMIT_AUTH_READ_PER_MINUTE900
RATE_LIMIT_AUTH_READ_BURST180
RATE_LIMIT_AUTH_WRITE_PER_MINUTE240
RATE_LIMIT_AUTH_WRITE_BURST60
RATE_LIMIT_HEAVY_READ_PER_MINUTE300
RATE_LIMIT_HEAVY_READ_BURST90

Development and frontend values​

These values do not change the standard production topology.

VariableDefaultScope
DEV_API_PORTAutomatically selected near 3001Host-run API port for pnpm dev:stack.
DEV_WEB_PORTAutomatically selected near 5173Vite development port.
DEV_POSTGRES_PORTAutomatically selected near 5432Development TimescaleDB host port.
DEV_REDIS_PORTAutomatically selected near 6379Development Redis host port.
DEV_GARAGE_PORTAutomatically selected near 3900Development Garage S3 API port.
DEV_GARAGE_ADMIN_PORTAutomatically selected near 3903Development Garage administration port.
DEV_WEB_ORIGINSActive Vite originDevelopment CORS origins.
DEV_COMPOSE_PROJECT_NAMEriviamigoDevelopment Compose project name. The default shares the existing local development project; set a unique value for deliberate checkout isolation.
DEV_DATABASE_READY_TIMEOUT_SECONDS600Maximum wait for TimescaleDB startup or crash recovery before pnpm dev:stack fails. Minimum 60.
DEV_CARGO_BUILD_JOBS4 on Windows; unused elsewhereMaximum concurrent Cargo jobs while Windows pnpm dev:stack builds the API and restore supervisor. Set a positive integer to override.
COMPOSE_PROJECT_NAMEriviamigoOptional general Compose project-name override used when DEV_COMPOSE_PROJECT_NAME is unset. Use a unique value for deliberate checkout isolation.
VITE_RIVIAMIGO_API_BASE_URLCurrent browser origin in productionPreferred frontend API base URL override.
VITE_RIVIAMIGO_DEV_API_KEYUnsetDevelopment-only integration key used by supported local tooling.
VITE_RIVIAMIGO_RUN_LIVE_CONTRACT0Enables explicitly requested live frontend contract tests.
VITE_API_URLUnsetLegacy frontend API URL compatibility override.
VITE_WS_URLUnsetLegacy frontend websocket URL compatibility override.