Overview: local vs production
| Service | Used by | Locally | In production |
|---|---|---|---|
| PostgreSQL | nest-api, workers | compose.yml (5432); tests on 5499 |
a managed or self-hosted PostgreSQL 15+ |
| Redis | nest-api (cache, rate limits, queues, realtime), workers | compose.yml (6379); tests on 6399 |
a persistent Redis 7 |
| Object storage | nest-api media |
MinIO, or a real bucket | S3 or any S3-compatible store |
| SMTP | nest-api mail |
a catcher such as Mailpit | a transactional mail provider |
| Google sign-in | nest-api auth |
optional | a Google OAuth client |
| GrowthBook | nest-api feature-flags |
GrowthBook Cloud or self-hosted | the same |
| OpenObserve | every template | a local container, or off | one org per project |
| Temporal | --with temporal |
the dev server in compose.yml (7233, UI 8233) |
a Temporal cluster, mTLS |
| Infisical | yarn secrets |
optional | the secret store for every environment |
Each service page covers the variables, a local setup, production values and the mistakes that fail silently.
The rule of thumb
Section titled “The rule of thumb”Back ends connect with credentials from .env; front ends only ever hold
public values. A VITE_* variable is compiled into JavaScript that every
visitor downloads. The only tokens that belong there are write-only ones built
to be public (the OpenObserve RUM token).