Setup checklist
Generation gets a project to “installed and committed”. Everything below is what stays with you: values that are per project, per environment or secret, and so can’t come from a template. Work through the section for each repository you generated, then the shared list at the end.
nest-api
Section titled “nest-api”To run locally
-
SMTP_USER,SMTP_PASSWORDset (empty on purpose; the API won’t start without them). A local catcher works: SMTP. -
BETTER_AUTH_SECRETreplaced:openssl rand -base64 32. -
yarn dc:up && yarn dc:wait,yarn db:migrate,yarn db:seed. - With
--with feature-flags:GROWTHBOOK_API_HOST,GROWTHBOOK_CLIENT_KEY. - With
--with temporal:docker compose up -d temporal.
Before production
-
APP_ENV=production;SERVER_HOST,BETTER_AUTH_URL= the API’s public URL. -
FRONTEND_HOST= the front end’s origin; other front-end origins inMISC_CORS_ORIGINS. -
BETTER_AUTH_COOKIE_DOMAIN: empty for one origin,.example.comfor apps on subdomains. See Auth, cookies and CORS. -
BASIC_AUTH_USER/BASIC_AUTH_PASSandSUPERUSER_*changed from the examples. - Real PostgreSQL, Redis,
SMTP and S3 (with
media). -
RATE_LIMIT_IP_HEADERS= the header your reverse proxy sets. -
HEALTH_*sized to the container. - Google sign-in, if you want it.
- Migrations run before each deploy: deployment.
react-app
Section titled “react-app”-
VITE_APP_API_URL= the API (build argument in production). - The API trusts this origin: its
FRONTEND_HOST. -
yarn genrun against the API and the types committed (API_DOC_*). - With
marketing:VITE_APP_SITE_URL,PRODUCTION_ORIGINinsrc/features/seo/routes.ts,VITE_APP_SUPPORT_EMAIL. - Legal pages (
src/routes/legal/) written: they ship as placeholders.
react-monorepo
Section titled “react-monorepo”- Each
apps/*/.env:VITE_APP_API_URLand the siblingVITE_APP_*_HOSTorigins. - The API trusts every app’s origin (
FRONTEND_HOST+MISC_CORS_ORIGINS), and its cookie domain covers every app’s host. -
packages/types/.envcreated withAPI_DOC_*, types generated and committed. - With
app-landing:VITE_APP_SITE_URL,PRODUCTION_ORIGIN, and the terms, privacy and contact pages other apps link to.
node-worker
Section titled “node-worker”- The API’s Prisma schema copied in (or shared as a submodule),
yarn db:generate. -
DATABASE_URLandREDIS_*identical to the API’s. - Queue names identical to the API’s producers (
src/workers/constants.ts). - With
temporal:TEMPORAL_TASK_QUEUE= where the API starts workflows.
py-worker
Section titled “py-worker”-
HOME_PATH= the project’s absolute path (/appin Docker). -
DB_*andREDIS_*identical to the API’s. - SQLAlchemy models written under
models/to match the API’s schema. - With
temporal: the API starts Python workflows onpython(or your queue).
Every project
Section titled “Every project”- Secrets in Infisical, one project with
dev,test,stagingandprodenvironments;INFISICAL_PROJECT_IDin your shell and in CI. Secrets with Infisical. - CI secrets on each repository:
REGISTRY_URL,REGISTRY,DK_USER,DK_ACCESS_TOKEN, plusINFISICAL_TOKEN(API) and theVITE_*build values (front ends). Deploying. - OpenObserve: an org for the project, its ingestion token on the back ends, a RUM token on the front ends, and every front-end origin in the instance’s CORS list. OpenObserve.
- Temporal (if used): a namespace and a client certificate for the project. Temporal.
- DNS and TLS for every public hostname, at your reverse proxy.
- A distinct
OTEL_SERVICE_NAMEper service, so each has its own stream.