Skip to content

PostgreSQL Setup

ArchVault uses PostgreSQL 18 as its primary database, accessed through Drizzle ORM. All schema definitions live in apps/web/src/lib/schema/ and are managed via generated migrations.

The dev compose.yaml includes a pre-configured PostgreSQL service. This is the fastest way to get started.

  1. Start the database container:

    Terminal window
    pnpm docker:compose:up
  2. Copy the environment template:

    Terminal window
    cp apps/web/.env.example apps/web/.env

    The default DATABASE_URL already matches the Docker container:

    DATABASE_URL=postgres://c4user:c4pass@localhost:5432/c4platform
  3. Run migrations to create the schema:

    Terminal window
    pnpm db:migrate
  4. Start the dev server:

    Terminal window
    pnpm dev:web

The database container exposes port 5432 on localhost. Data is persisted in the pgdata Docker volume — it survives docker compose down but is removed with docker compose down -v.

ArchVault connects to PostgreSQL via a single DATABASE_URL environment variable in standard connection string format:

postgres://USER:PASSWORD@HOST:PORT/DATABASE

The connection is initialized in apps/web/src/lib/database.ts:

import { drizzle } from "drizzle-orm/node-postgres";
export const db = drizzle(process.env.DATABASE_URL!);

Drizzle Studio provides a visual interface to browse and edit your database:

Terminal window
pnpm db:studio

This opens a web UI where you can inspect tables, run queries, and view relationships. Useful for debugging during development.

The database contains 27 tables organized by domain:

DomainTablesDescription
Authentication12Users, sessions, accounts, organizations, teams, members, invitations, 2FA, SSO, SCIM
Workspaces1Architecture projects scoped to an organization
Core Domain8Elements, connections, technologies, tags, links — the C4 model data
Diagrams4Visual layouts, element/connection placement, revision history
Platform1Global application settings (key-value store)

Key design patterns used throughout:

  • Soft deletes — workspaces, elements, connections, and diagrams use a deletedAt timestamp
  • Audit trailscreatedBy, updatedBy, createdAt, updatedAt on most domain tables
  • Multi-tenancy — all content is scoped to an organization via the workspace
  • Cascade deletes — deleting a workspace removes all its elements, connections, tags, and diagrams
Terminal window
# Stop containers (data preserved)
pnpm docker:compose:down
# Stop and delete all data
pnpm docker:compose:down:v