Skip to main content

Environment Variables and Secrets

Securely manage configuration and secrets. All values are encrypted at rest using AES-256-GCM. Env vars are injected into your container at runtime.

Encrypted at rest

All environment variable values are encrypted with AES-256-GCM before storage. They are only decrypted when injected into containers.

API: Replace vs Upsert

Two methods are available for updating env vars via the API:

  • PUT /services/:id/env-vars -- Full replace. Existing vars not in the payload are deleted. If any existing key would be removed, confirm with "confirm_destructive": true.
  • PATCH /services/:id/env-vars -- Additive upsert. Only the provided keys are created/updated. Missing keys are left untouched. Optionally pass "delete": ["KEY"] to remove specific keys.
PATCH body
{
"env_vars": [
{ "key": "NEW_VAR", "value": "hello" },
{ "key": "EXISTING_VAR", "value": "updated" }
],
"delete": ["OLD_UNUSED_VAR"]
}
PUT body (destructive replace)
{
"mode": "replace",
"confirm_destructive": true,
"env_vars": [
{ "key": "DATABASE_URL", "value": "postgres://...", "is_secret": true },
{ "key": "NODE_ENV", "value": "production" }
]
}

Database Template References

Env var values can reference managed database connection fields using template syntax. References resolve when writing env vars and work with database ID or unique database name.

database references
{
"env_vars": [
{ "key": "PGHOST", "value": "${{ databases.my-db.host }}" },
{ "key": "PGPORT", "value": "${{ databases.my-db.port }}" },
{ "key": "PGDATABASE", "value": "${{ databases.my-db.db_name }}" },
{ "key": "PGUSER", "value": "${{ databases.my-db.username }}" },
{ "key": "PGPASSWORD", "value": "${{ databases.my-db.password }}", "is_secret": true },
{ "key": "DATABASE_URL", "value": "${{ databases.my-db.internal_url }}", "is_secret": true }
]
}

Env Groups

Env groups let you share configuration across multiple services. Define them in your blueprint or create them in the dashboard. When a group is updated, all linked services receive the changes.

railpush.yaml
envVarGroups:
- name: shared-config
envVars:
- key: LOG_LEVEL
value: info
- key: SENTRY_DSN
value: https://abc@sentry.io/123

services:
- type: web
name: my-api
envVars:
- fromGroup: shared-config
- key: PORT
value: "3000"