Files
DoGaMa-serv/migrations/0005_backups_imports.sql
T

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);