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
orgIdUUIDFK → organizations
siteIdUUIDFK → sites
agentIdvarchar(64)Unique agent identifier
agentTokenHashvarchar(64)SHA-256 hash of the agent bearer token (nullable for pre-migration devices)
hostnamevarchar(255)Device hostname
displayNamevarchar(255)Optional display name
osTypeenumwindows, macos, linux
osVersionvarchar(100)OS version string
osBuildvarchar(100)OS build identifier (optional)
architecturevarchar(20)CPU architecture (e.g. amd64, arm64)
agentVersionvarchar(20)Installed agent version
statusenumonline, offline, maintenance, decommissioned, quarantined
lastSeenAttimestampLast telemetry received
enrolledAttimestampWhen the device was enrolled
enrolledByUUIDFK → users (who initiated enrollment)
tagstext[]Array of string tags
mtlsCertSerialNumbervarchar(128)Cloudflare mTLS cert serial (optional)
mtlsCertExpiresAttimestampmTLS cert expiry (optional)
mtlsCertIssuedAttimestampmTLS cert issue date (optional)
mtlsCertCfIdvarchar(128)Cloudflare cert ID (optional)
quarantinedAttimestampWhen device was quarantined (optional)
quarantinedReasonvarchar(255)Reason for quarantine (optional)
createdAttimestampRow creation time
updatedAttimestampLast update time
TableDescription
deviceHardwareCPU model, cores, RAM, disk, GPU, serial number, manufacturer
deviceNetworkInterfacesNetwork interfaces with MAC, IP, type, primary flag, public IP
deviceDisksMount points, filesystem type, capacity, health
deviceTelemetryTime-series CPU, RAM, disk, network, process count
deviceSoftwareInstalled applications with version, publisher, install location
deviceRegistryEntriesWindows registry snapshots
deviceConfigEntriesConfiguration file key-value pairs
deviceNetworkConnectionsActive TCP/UDP connections with process info
deviceGroupsStatic and dynamic device groups with filter rules
deviceGroupMembershipsMany-to-many device ↔ group mapping
deviceCommandsCommand queue (pending, completed, failed)

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;