The project uses a two-tier migration system: automatic schema management via GORM and manual SQL migrations for complex changes.
For the full migration system documentation, see migrations/README.md.
Runs on application startup:
- Creates tables from Go models
- Adds missing columns
- Creates indexes
- Safe for production
- Cannot handle: column renames, data transformations, complex constraints
For complex changes:
- Data transformations
- Column renames and type changes
- Custom indexes and constraints
- Performance optimizations
- Full control with rollback support
# Check current migration status
make migrate-status
# Apply all pending migrations
make migrate-up
# Rollback last migration
make migrate-down
# Interactive migration tool (recommended for beginners)
make migrate# 1. Start the project (GORM creates base tables automatically)
make docker-dev
# 2. Apply SQL enhancements (optional, but recommended)
make migrate-up
# 3. Start developing
make dev# 1. Copy the template
cp migrations/TEMPLATE.md migrations/YYYYMMDD_HHMMSS_your_migration.md
# 2. Create forward migration SQL
# migrations/YYYYMMDD_HHMMSS_your_migration.sql
# 3. Create rollback SQL
# migrations/YYYYMMDD_HHMMSS_your_migration_rollback.sql
# 4. Test and apply
make migrate-test
make migrate-upThe following SQL migrations were added for new features. Apply them with make migrate-up:
| Migration | Description |
|---|---|
20260301_add_rbac.sql |
Creates roles, permissions, and user_roles tables |
20260301_seed_rbac_defaults.sql |
Seeds default system roles (admin, member) and permissions |
20260302_backfill_member_role.sql |
Assigns member role to all existing users |
| Migration | Description |
|---|---|
20260303_add_admin_magic_link.sql |
Adds magic_link_enabled flag to admin accounts |
20260303_add_magic_link_settings.sql |
Adds magic_link_enabled setting to applications |
20260303_seed_magic_link_email_type.sql |
Seeds the magic link email type into the email system |
Note: WebAuthn/passkey tables and session management tables are created automatically by GORM AutoMigrate on application startup -- no manual SQL migration is required.