Bedrud uses GORM as its ORM, supporting both SQLite and PostgreSQL.
Supported Databases
- SQLite: Default for development and small installs. File path via
database.path. - PostgreSQL: Recommended for higher concurrency. Use discrete fields (
host,port,user,password,dbname,sslmode) — not a URL inpath.
SQLite File Layout
WAL mode is enabled for concurrent reads:
| File | Purpose |
|---|---|
*.db | Main database file |
*.db-shm | Shared memory |
*.db-wal | Write-ahead log |
These files are normal. SQLite recovers after crashes automatically.
Core Models
Located in server/internal/models/:
| Model | File | Purpose |
|---|---|---|
User | user.go | Accounts, roles (accesses), credentials |
Room | room.go | Meetings; settings embedded with settings_ prefix |
RoomParticipant | room.go | Join/presence records |
Passkey | passkey.go | WebAuthn credentials |
UserPreferences | user_preferences.go | Per-user UI/media prefs |
InviteToken | invite_token.go | Gated registration tokens |
ChatUpload | chat_upload.go | Chat image metadata/quotas |
Job | job.go | Async queue jobs |
Webhook | webhook.go | Outbound webhook endpoints |
SystemSettings | settings.go | Runtime admin overrides (singleton) |
VerificationEvent | verification_event.go | Email verification audit |
Refresh / refresh tokens | refresh.go | Refresh token storage |
Recording | recording.go | Planned recording records |
| Stats DTOs | stats.go, queue_stats.go | Aggregates for admin overview |
Custom Types: StringArray
StringArray in user.go implements sql.Scanner / driver.Valuer for cross-DB role arrays (native text[] on Postgres; serialized form on SQLite).
Foreign Keys
Composite keys (e.g. participants) and cascade constraints are applied in internal/database/migrations.go beyond plain AutoMigrate.
Repository Pattern
Handlers use repositories under internal/repository/:
user_repository,room_repository,passkey_repositorysettings_repository,invite_token_repository,webhook_repositoryuser_preferences_repository,recording_repository,verification_event_repository
user, err := h.userRepo.GetByEmail(email)Automatic Migrations
On startup (unless bedrud run --skip-migrate), GORM AutoMigrate creates/updates tables from models. Manual SQL helpers live in internal/database/migrations.go.
CLI: bedrud db migrate / bedrud db status.