Seed household on container startup via seed.mjs

Without a household row the signIn callback has nothing to attach the
first user to, causing "No household membership" on first load. Add
scripts/seed.mjs (plain ESM, only needs postgres which is already in the
image) and run it from the entrypoint after migrations. Idempotent — skips
if a household already exists. Default calendars/lists are created by the
signIn callback when the first user authenticates.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ginnoir
2026-05-06 20:49:20 -05:00
co-authored by Claude Sonnet 4.6
parent 1e076bd2f3
commit c66bf68373
3 changed files with 27 additions and 0 deletions
+1
View File
@@ -38,6 +38,7 @@ COPY --from=builder --chown=nextjs:nodejs /app/public ./public
# the app itself imports, not the postgres-js/migrator subpath.
COPY --from=builder --chown=nextjs:nodejs /app/drizzle ./drizzle
COPY --from=builder --chown=nextjs:nodejs /app/scripts/migrate.mjs ./scripts/migrate.mjs
COPY --from=builder --chown=nextjs:nodejs /app/scripts/seed.mjs ./scripts/seed.mjs
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/drizzle-orm ./node_modules/drizzle-orm
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/postgres ./node_modules/postgres
COPY --chown=nextjs:nodejs docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
+2
View File
@@ -8,4 +8,6 @@ else
echo "skipping migrations (RUN_MIGRATIONS=$RUN_MIGRATIONS)"
fi
node /app/scripts/seed.mjs
exec node /app/server.js
+24
View File
@@ -0,0 +1,24 @@
import postgres from "postgres";
const url = process.env.DATABASE_URL;
if (!url) {
console.error(JSON.stringify({ level: "error", msg: "DATABASE_URL is required" }));
process.exit(1);
}
const sql = postgres(url, { max: 1 });
try {
const [existing] = await sql`SELECT id, name FROM households LIMIT 1`;
if (existing) {
console.log(JSON.stringify({ level: "info", msg: "household exists", name: existing.name }));
} else {
await sql`INSERT INTO households (name) VALUES ('Home')`;
console.log(JSON.stringify({ level: "info", msg: "seeded household Home" }));
}
} catch (err) {
console.error(JSON.stringify({ level: "error", msg: "seed failed", err: String(err) }));
process.exit(1);
} finally {
await sql.end({ timeout: 5 });
}