Ctrl K
ComunidadGuías…

MIGRATION_SETUP.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Database Migration Setup

This project includes a separate migration container that gives you full control over when database migrations run.

Before the SQL stats upgrade, read [Upgrading stats storage](apps/docs/docs/self-hosting/upgrading-stats.md). Stats are rebuilt from retained heartbeats, the mixed legacy table is dropped, and rollback does not recover its history. The guide covers backups and optional SQLite disk-space reclamation.

## How it works

1. **Migration Container**: The project uses a dedicated migration container built from `Dockerfile.migrate`
2. **Migration Tool**: Uses the bun migration tool located in `apps/server/cmd/bun/`
3. **Separate Control**: Migrations run in their own container, separate from the application server
4. **Server Dependency**: The server waits for migrations to complete successfully before starting


## Manual Migration Commands

If you need to run migrations manually outside of Docker:

1. **Build the bun migration tool**:
   ```bash
   cd apps/server
   go build -o bun ./cmd/bun
   ```

2. **Run migrations**:
   ```bash
   ./bun db migrate
   ```

   On PostgreSQL, a migrate that starts while another one runs waits for it, up to 10 minutes. Change that with `./bun db migrate --lock-timeout 30m` or `MIGRATE_LOCK_TIMEOUT=30m`. A migrate that is killed doesn't block the next one. See [Migrate](apps/docs/docs/architecture/migrate.md#migration-locking).

3. **Check migration status**:
   ```bash
   ./bun db status
   ```

4. **Rollback last migration**:
   ```bash
   ./bun db rollback
   ```

5. **Import a MongoDB install** (MongoDB storage was removed) into a SQLite or PostgreSQL database that holds no data of its own, which `DB_TYPE` and the other `DB_*` variables name:
   ```bash
   ./bun db import-mongo --mongo-uri mongodb://localhost:27017 --mongo-db peekaping
   ```
   It applies the migrations first, then copies the data in one transaction, and refuses a database that holds users, monitors or history. It replaces the default settings of a first start with the install's. See [Move to SQLite or PostgreSQL](apps/docs/docs/self-hosting/docker-with-mongo.md#move-to-sqlite-or-postgresql) for the steps and what is copied.

### Creating New Migrations

For creating new migrations, use the bun tool:

1. **Build the bun tool**:
   ```bash
   cd apps/server
   go build -o bun ./cmd/bun
   ```

2. **Create new migration**:
   ```bash
   ./bun db create_tx_sql migration_name
   ```

## Migration Files

Migrations are stored in `apps/server/cmd/bun/migrations/` and follow the naming convention:
- `YYYYMMDDHHMMSS_description.tx.up.sql` - Migration to apply
- `YYYYMMDDHHMMSS_description.tx.down.sql` - Migration to rollback
- `YYYYMMDDHHMMSS_description.go` - Go migration (`./bun db create_go`), for data changes that should behave the same on every database, such as rebuilding stats from heartbeats

## Migration Container Details

- **Image**: Built from `apps/server/infra/Dockerfile.migrate`
- **Tool**: Uses bun migration tool (`./bun db migrate`)
- **Restart Policy**: `no` (runs once and exits)
- **Dependencies**: Waits for database to be healthy before running
- **Server Dependency**: Server waits for migration container to complete successfully

## Database Support

The migration system supports:
- PostgreSQL (recommended)
- MySQL
- SQLite

The startup script automatically detects the database type and waits appropriately.