73 lines
3.1 KiB
SQL
73 lines
3.1 KiB
SQL
ALTER TABLE instance_operations RENAME TO instance_operations_v4;
|
|
|
|
CREATE TABLE instance_operations (
|
|
id TEXT PRIMARY KEY,
|
|
instance_id TEXT NOT NULL REFERENCES instances(id) ON DELETE RESTRICT,
|
|
kind TEXT NOT NULL CHECK (kind IN ('install', 'start', 'stop', 'restart', 'delete_container', 'reconcile', 'backup', 'restore', 'import')),
|
|
state TEXT NOT NULL CHECK (state IN ('running', 'succeeded', 'failed', 'intervention_required')),
|
|
phase TEXT NOT NULL,
|
|
error_code TEXT,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
completed_at TEXT
|
|
);
|
|
|
|
INSERT INTO instance_operations(id, instance_id, kind, state, phase, error_code, created_at, updated_at, completed_at)
|
|
SELECT id, instance_id, kind, state, phase, error_code, created_at, updated_at, completed_at
|
|
FROM instance_operations_v4;
|
|
|
|
DROP TABLE instance_operations_v4;
|
|
|
|
CREATE UNIQUE INDEX instance_operation_active_idx ON instance_operations(instance_id) WHERE state = 'running';
|
|
CREATE INDEX instance_operation_history_idx ON instance_operations(instance_id, created_at DESC);
|
|
|
|
CREATE TABLE backup_policies (
|
|
instance_id TEXT PRIMARY KEY REFERENCES instances(id) ON DELETE CASCADE,
|
|
enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
|
|
cron_expression TEXT,
|
|
timezone TEXT NOT NULL DEFAULT 'UTC',
|
|
retention_count INTEGER NOT NULL DEFAULT 7 CHECK (retention_count BETWEEN 1 AND 1000),
|
|
next_run_at TEXT,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE backups (
|
|
id TEXT PRIMARY KEY,
|
|
instance_id TEXT NOT NULL REFERENCES instances(id) ON DELETE RESTRICT,
|
|
operation_id TEXT REFERENCES instance_operations(id) ON DELETE SET NULL,
|
|
origin TEXT NOT NULL CHECK (origin IN ('manual', 'scheduled', 'pre_update', 'pre_restore', 'idle_shutdown', 'imported', 'system')),
|
|
status TEXT NOT NULL CHECK (status IN ('creating', 'available', 'failed', 'deleted')),
|
|
relative_path TEXT,
|
|
size_bytes INTEGER CHECK (size_bytes IS NULL OR size_bytes >= 0),
|
|
sha256 TEXT CHECK (sha256 IS NULL OR length(sha256) = 64),
|
|
manifest_json TEXT,
|
|
error_code TEXT,
|
|
created_by TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TEXT NOT NULL,
|
|
completed_at TEXT,
|
|
deleted_at TEXT
|
|
);
|
|
|
|
CREATE INDEX backups_instance_created_idx ON backups(instance_id, created_at DESC);
|
|
CREATE INDEX backups_retention_idx ON backups(instance_id, origin, status, created_at);
|
|
|
|
CREATE TABLE imports (
|
|
id TEXT PRIMARY KEY,
|
|
requested_by TEXT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
|
|
instance_id TEXT REFERENCES instances(id) ON DELETE CASCADE,
|
|
status TEXT NOT NULL CHECK (status IN ('staging', 'validated', 'attached', 'failed', 'expired')),
|
|
format TEXT NOT NULL,
|
|
relative_stage_path TEXT NOT NULL,
|
|
detected_type TEXT,
|
|
confidence TEXT CHECK (confidence IS NULL OR confidence IN ('confirmed', 'probable', 'recognized_unknown_version', 'unrecognized')),
|
|
file_count INTEGER NOT NULL DEFAULT 0,
|
|
expanded_size_bytes INTEGER NOT NULL DEFAULT 0,
|
|
error_code TEXT,
|
|
created_at TEXT NOT NULL,
|
|
expires_at TEXT NOT NULL,
|
|
completed_at TEXT
|
|
);
|
|
|
|
CREATE INDEX imports_expiry_idx ON imports(status, expires_at);
|