Skip to content

Database Schema

Schema Location

All Drizzle ORM schema definitions are in apps/api/src/db/schema/.

Core Tables

Devices

The central table for managed endpoints:

ColumnTypeDescription
idUUIDPrimary key
hostnametextDevice hostname
ostextOperating system
archtextCPU architecture
agentVersiontextInstalled agent version
statusenumonline, offline, warning, critical, quarantined
organizationIdUUIDFK → organizations
siteIdUUIDFK → sites
agentTokenHashtextSHA-256 hash of the agent bearer token
lastHeartbeattimestampLast telemetry received
mtlsCertSerialNumbertextCloudflare mTLS cert serial (optional)
mtlsCertExpiresAttimestampmTLS cert expiry (optional)
quarantinedAttimestampWhen device was quarantined (optional)

Organizations

partners (MSP)
└── organizations (customer)
└── sites (location)
└── device_groups
└── devices

Users & RBAC

TablePurpose
usersUser accounts with email, password hash, MFA status
rolesRole definitions (Partner Admin, Technician, Viewer, etc.)
permissionsResource + action pairs (e.g., devices:read)
rolePermissionsMaps roles to permissions
partnerUsersMaps users to partners with roles

Default Roles

Seeded by pnpm db:seed:

RoleScopePermissions
Partner Adminpartner*:* (full access)
Partner TechnicianpartnerRead + execute on devices, scripts, alerts
Partner ViewerpartnerRead-only
Org AdminorganizationFull access within org
Org UserorganizationRead + limited write

Schema Management

Terminal window
# Push schema changes (development)
pnpm db:push
# Run migrations (production)
pnpm db:migrate
# Seed default roles, permissions, templates
pnpm db:seed
# Open Drizzle Studio (visual schema browser)
pnpm db:studio

Inspecting the Database

Terminal window
# Connect to the database
docker compose -f docker/docker-compose.prod.yml exec postgres \
psql -U breeze -d breeze
# List tables
\dt
# Describe a table
\d devices
# Count devices
SELECT count(*) FROM devices;