Overview
Umami uses database migrations to evolve the schema over time. Migrations are automatically applied during the build process or when starting the application in Docker.Migrations are managed by Prisma for PostgreSQL and custom SQL scripts for ClickHouse.
How Migrations Work
Migrations are versioned changes to the database schema that:- Create new tables and columns
- Add or modify indexes
- Transform existing data
- Ensure schema compatibility across versions
- PostgreSQL
- ClickHouse
- Managed by Prisma Migrate
- Located in
/prisma/migrations/ - Automatically tracked in
_prisma_migrationstable - Applied sequentially in order
Automatic Migration
Migrations run automatically in several scenarios:During Build
When building from source:package.json
Docker Startup
When starting the Docker container:package.json
check-db.js script:
- Validates
DATABASE_URLis set - Tests database connection
- Checks PostgreSQL version (minimum 9.4.0)
- Runs
prisma migrate deploy
Set
SKIP_DB_MIGRATION=1 to prevent automatic migrations on startup.Manual Migration
PostgreSQL
Run migrations manually:ClickHouse
ClickHouse migrations are applied automatically by the application. For manual application:Migration History
PostgreSQL Migrations
Located in/prisma/migrations/, each migration has its own directory:
01_init - Initial Schema
01_init - Initial Schema
Creates the foundation:
- User authentication tables
- Website configuration
- Session tracking
- Event data storage
- Basic indexes
02_report_schema_session_data
02_report_schema_session_data
Adds reporting features:
- Report configuration tables
- Session data attributes
- Report parameters storage
03_metric_performance_index
03_metric_performance_index
Performance optimization:
- Adds composite indexes for common queries
- Optimizes website_event lookups
- Improves session query performance
04_team_redesign
04_team_redesign
Team collaboration features:
- Team management tables
- Team membership relationships
- Access control
05_add_visit_id
05_add_visit_id
Visit tracking:
- Adds
visit_idcolumn to events - Creates indexes for visit-based queries
06_session_data
06_session_data
Enhanced session tracking:
- Session data table improvements
- Additional indexes for session lookups
- Data type optimizations
07_add_tag
07_add_tag
Event tagging:
- Adds
tagcolumn to website_event - Creates tag indexes
08_add_utm_clid
08_add_utm_clid
Marketing attribution:
- UTM parameters (utm_source, utm_medium, utm_campaign, utm_content, utm_term)
- Click IDs (gclid, fbclid, msclkid, ttclid, li_fat_id, twclid)
- Indexes for attribution queries
09_update_hostname_region
09_update_hostname_region
Geographic and hostname tracking:
- Hostname field for multi-domain tracking
- Region/subdivision tracking
- Geographic indexes
10_add_distinct_id
10_add_distinct_id
User identification:
- Adds
distinct_idfor user tracking across sessions - Indexes for user-level analytics
11_revenue_links_pixels
11_revenue_links_pixels
Additional features:
- Revenue tracking table
- URL shortener (links)
- Tracking pixels
- Segment definitions
ClickHouse Migrations
Located in/db/clickhouse/migrations/:
| Migration | Description |
|---|---|
01_edit_keys.sql | Schema key adjustments |
02_add_visit_id.sql | Visit tracking support |
03_session_data.sql | Session data table |
04_add_tag.sql | Event tag support |
05_add_utm_clid.sql | UTM and click ID columns |
06_update_subdivision.sql | Geographic subdivision tracking |
07_add_distinct_id.sql | User identification |
08_update_hostname_view.sql | Materialized view updates |
Migration Safety
Backup Before Migration
- PostgreSQL
- Docker PostgreSQL
- ClickHouse
Test Migrations
Test migrations in a development environment first:Viewing Migration Status
PostgreSQL
Check which migrations have been applied:ClickHouse
ClickHouse doesn’t have a built-in migration tracking system. Check schema version:Rollback Strategies
Restore from Backup
The safest rollback method:Manual Rollback
For simple migrations, manually reverse the changes:Data Migrations
Some migrations include data transformations. These are in/db/postgresql/data-migrations/:
populate-revenue-table.sql
Populates the revenue table from event data:convert-utm-clid-columns.sql
Migrates UTM and click ID data from event_data to dedicated columns:Data migrations may take considerable time on large databases. Run during low-traffic periods.
Troubleshooting Migrations
Migration fails with constraint error
Migration fails with constraint error
Usually caused by existing data violating new constraints.
- Check the error message for the specific constraint
- Identify problematic data:
- Fix or remove problematic data
- Retry migration
Migration timeout
Migration timeout
Large migrations may timeout:
- Increase timeout in Prisma:
- Or run migration directly with psql:
Migration already applied error
Migration already applied error
If migration tracking is out of sync:
Schema drift detected
Schema drift detected
Manual changes to the database caused drift:
Best Practices
Always Backup
Create backups before running migrations, especially in production.
Test First
Test migrations on a copy of production data before applying.
Monitor Progress
Watch logs during migration for errors or warnings.
Plan Downtime
Large migrations may require application downtime.
Migration Checklist
Pre-Migration Checklist
Pre-Migration Checklist
- Backup database
- Test migration in staging environment
- Check disk space (migrations may temporarily double space)
- Review migration SQL for expected changes
- Plan maintenance window if needed
- Notify users of potential downtime
- Have rollback plan ready
During Migration
During Migration
- Monitor migration logs
- Watch database performance metrics
- Check for lock conflicts
- Verify migration completes successfully
Post-Migration
Post-Migration
- Verify application functionality
- Check migration status
- Review database logs for errors
- Test critical user workflows
- Monitor performance for issues
- Keep backup until stability confirmed
Skipping Migrations
In some scenarios, you may want to skip automatic migrations:Creating Custom Migrations
If you’re modifying Umami’s source:Custom migrations are for development only. Production deployments should use official migrations.
Next Steps
PostgreSQL
Configure PostgreSQL database
ClickHouse
Set up ClickHouse for scale
Upgrading
Update Umami to new versions
Troubleshooting
Solve migration issues