Shared PostgreSQL database with Prisma for all DALI services (dali-web, dali-edu, etc.).
- Docker and Docker Compose installed
- Node.js 18+ and npm
- Ports 5432 (PostgreSQL) and 5050 (pgAdmin) available
-
Start the database:
docker-compose up -d
-
Install dependencies:
npm install
-
Set up environment variables:
# Create .env file echo "DATABASE_URL=postgresql://dali:dali_password@localhost:5432/dali_db" > .env
-
Generate Prisma Client:
npm run db:generate
-
Push schema to database:
npm run db:push
The database uses PostgreSQL with multiple schemas:
dali_edu- Education service tables (User, Course, Enrollment)dali_web- Web service tables (TeamMembersCache, ProjectsCache, etc.)shared- Shared tables (AuditLog)
All schemas are defined in prisma/schema.prisma.
# Generate Prisma Client (after schema changes)
npm run db:generate
# Push schema changes to database (development)
npm run db:push
# Create and apply a migration (recommended for production)
npm run db:migrate
# Deploy migrations (production)
npm run db:migrate:deploy
# Open Prisma Studio (database GUI)
npm run db:studio
# Run seed script
npm run db:seed
# Reset database (⚠️ deletes all data)
npm run db:resetIf dali-db is a shared package:
// In dali-edu or dali-web
import { prisma } from '@dali/db/lib/prisma.js';
const user = await prisma.user.findUnique({
where: { email: 'user@dartmouth.edu' },
});After generating Prisma Client in dali-db, you can copy the generated client to your service:
# In dali-edu
cp -r ../dali-db/lib/generated ./src/lib/prisma-clientThen import:
import { PrismaClient } from './lib/prisma-client/index.js';For development, you can symlink:
# In dali-edu
ln -s ../../dali-db/lib/generated ./src/lib/prisma-clientPostgreSQL:
- Host:
localhost - Port:
5432(or value from.env) - Database:
dali_db(or value from.env) - User:
dali(or value from.env) - Password:
dali_password(or value from.env)
Connection String:
postgresql://dali:dali_password@localhost:5432/dali_db
pgAdmin (Optional):
- URL:
http://localhost:5050 - Email:
admin@dali.edu(or value from.env) - Password:
admin(or value from.env)
All database schemas are defined in prisma/schema.prisma. This is the single source of truth for all database structures.
- Edit
prisma/schema.prisma - Run
npm run db:generateto generate Prisma Client - Run
npm run db:push(development) ornpm run db:migrate(production)
// In prisma/schema.prisma
model Assignment {
id String @id @default(uuid()) @db.Uuid
courseId String @map("course_id") @db.Uuid
title String @db.VarChar(255)
dueDate DateTime @map("due_date") @db.Timestamptz(6)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
course Course @relation(fields: [courseId], references: [id])
@@schema("dali_edu")
@@map("assignments")
@@index([courseId])
}Prisma supports multiple PostgreSQL schemas. Models are organized by schema:
model User {
// ... fields
@@schema("dali_edu") // This model is in the dali_edu schema
@@map("users")
}
model TeamMembersCache {
// ... fields
@@schema("dali_web") // This model is in the dali_web schema
@@map("team_members_cache")
}docker-compose up -ddocker-compose downdocker-compose logs -f postgresdocker-compose exec postgres psql -U dali -d dali_dbdocker-compose exec postgres pg_dump -U dali dali_db > backup.sqldocker-compose exec -T postgres psql -U dali dali_db < backup.sqldocker-compose down -v
docker-compose up -d
npm run db:pushVisual database browser:
npm run db:studioOpens at http://localhost:5555 - browse all tables across all schemas.
Create a .env file:
DATABASE_URL=postgresql://dali:dali_password@localhost:5432/dali_dbRun: npm run db:generate
Run: npm run db:push or npm run db:migrate
- Make sure the database is running:
docker-compose up -d - Check
DATABASE_URLin.env
The init/01-init.sql script creates the schemas automatically when the database container is first created.