diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index 08cffa3..9e4441a 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -42,6 +42,8 @@ COPY --from=build /repo/apps/web/dist ./apps/web/dist WORKDIR /repo/apps/api EXPOSE 3000 -# Applies pending migrations before starting — keeps the review environment's -# schema in sync automatically, no manual step needed. -CMD ["sh", "-c", "node_modules/.bin/prisma migrate deploy && node dist/server.js"] +# Applies pending migrations, then seeds the reference data (Diet/Category/ +# Allergy — see src/scripts/seed-runtime.ts) before starting. Both steps are +# safe to repeat on every container start: migrate deploy only applies +# pending migrations, and the seed upserts by unique name. +CMD ["sh", "-c", "node_modules/.bin/prisma migrate deploy && node dist/scripts/seed-runtime.js && node dist/server.js"] diff --git a/apps/api/src/scripts/seed-runtime.ts b/apps/api/src/scripts/seed-runtime.ts new file mode 100644 index 0000000..5044d91 --- /dev/null +++ b/apps/api/src/scripts/seed-runtime.ts @@ -0,0 +1,27 @@ +import { prisma } from "../db/prisma.js"; +import { seedReferenceData } from "../db/reference-seed-data.js"; + +/** + * Runtime seed entry point for the production Docker image — run via + * `node dist/scripts/seed-runtime.js` in apps/api/Dockerfile's CMD, after + * `prisma migrate deploy` and before starting the server. + * + * Deliberately separate from `prisma/seed.ts` (the dev-time entry point + * wired to `prisma db seed`/`prisma migrate reset`): that one imports + * `seedReferenceData` from `../src/db/...` and runs via `tsx`, but the + * runtime image only ships compiled `dist` output, not `src` (see the + * Dockerfile) — this lives under `src/` instead, so `tsc` compiles it + * alongside everything else, and it runs under plain `node`, no tsx + * needed at runtime. + * + * Safe to run on every container start: `seedReferenceData` upserts by + * each row's unique name, so re-running it against a database that + * already has this data is a no-op. + */ +seedReferenceData(prisma) + .then(() => prisma.$disconnect()) + .catch(async (err) => { + console.error(err); + await prisma.$disconnect(); + process.exit(1); + });