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 only as an override template. The standard production container reads that file directly, so supported optional values do not need matching entries in Compose.

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_ADDRESS0.0.0.0Docker host-side address for the published origin port. This Compose-only setting is separate from the application's internal listener. Restrict it with a host firewall.
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_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.

| 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 are part of the PostgreSQL backup and therefore survive restore. This is an explicitly accepted P2 shared-fate risk: a database compromise or loss 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.