171 lines
5.4 KiB
TypeScript
171 lines
5.4 KiB
TypeScript
import { BaseMigration } from './base-migration.ts';
|
|
import type { TQueryFunction } from '../types.ts';
|
|
|
|
export class Migration002TimestampsToReal extends BaseMigration {
|
|
readonly version = 2;
|
|
readonly description = 'Convert timestamp columns from INTEGER to REAL';
|
|
|
|
up(query: TQueryFunction): void {
|
|
// SSL certificates
|
|
query(`
|
|
CREATE TABLE ssl_certificates_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
domain TEXT NOT NULL UNIQUE,
|
|
cert_path TEXT NOT NULL,
|
|
key_path TEXT NOT NULL,
|
|
full_chain_path TEXT NOT NULL,
|
|
expiry_date REAL NOT NULL,
|
|
issuer TEXT NOT NULL,
|
|
created_at REAL NOT NULL,
|
|
updated_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO ssl_certificates_new SELECT * FROM ssl_certificates`);
|
|
query(`DROP TABLE ssl_certificates`);
|
|
query(`ALTER TABLE ssl_certificates_new RENAME TO ssl_certificates`);
|
|
|
|
// Services
|
|
query(`
|
|
CREATE TABLE services_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL UNIQUE,
|
|
image TEXT NOT NULL,
|
|
registry TEXT,
|
|
env_vars TEXT NOT NULL,
|
|
port INTEGER NOT NULL,
|
|
domain TEXT,
|
|
container_id TEXT,
|
|
status TEXT NOT NULL DEFAULT 'stopped',
|
|
created_at REAL NOT NULL,
|
|
updated_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO services_new SELECT * FROM services`);
|
|
query(`DROP TABLE services`);
|
|
query(`ALTER TABLE services_new RENAME TO services`);
|
|
|
|
// Registries
|
|
query(`
|
|
CREATE TABLE registries_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
url TEXT NOT NULL UNIQUE,
|
|
username TEXT NOT NULL,
|
|
password_encrypted TEXT NOT NULL,
|
|
created_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO registries_new SELECT * FROM registries`);
|
|
query(`DROP TABLE registries`);
|
|
query(`ALTER TABLE registries_new RENAME TO registries`);
|
|
|
|
// Nginx configs
|
|
query(`
|
|
CREATE TABLE nginx_configs_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
service_id INTEGER NOT NULL,
|
|
domain TEXT NOT NULL,
|
|
port INTEGER NOT NULL,
|
|
ssl_enabled INTEGER NOT NULL DEFAULT 0,
|
|
config_template TEXT NOT NULL,
|
|
created_at REAL NOT NULL,
|
|
updated_at REAL NOT NULL,
|
|
FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
|
|
)
|
|
`);
|
|
query(`INSERT INTO nginx_configs_new SELECT * FROM nginx_configs`);
|
|
query(`DROP TABLE nginx_configs`);
|
|
query(`ALTER TABLE nginx_configs_new RENAME TO nginx_configs`);
|
|
|
|
// DNS records
|
|
query(`
|
|
CREATE TABLE dns_records_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
domain TEXT NOT NULL UNIQUE,
|
|
type TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
cloudflare_id TEXT,
|
|
zone_id TEXT,
|
|
created_at REAL NOT NULL,
|
|
updated_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO dns_records_new SELECT * FROM dns_records`);
|
|
query(`DROP TABLE dns_records`);
|
|
query(`ALTER TABLE dns_records_new RENAME TO dns_records`);
|
|
|
|
// Metrics
|
|
query(`
|
|
CREATE TABLE metrics_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
service_id INTEGER NOT NULL,
|
|
timestamp REAL NOT NULL,
|
|
cpu_percent REAL NOT NULL,
|
|
memory_used INTEGER NOT NULL,
|
|
memory_limit INTEGER NOT NULL,
|
|
network_rx_bytes INTEGER NOT NULL,
|
|
network_tx_bytes INTEGER NOT NULL,
|
|
FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
|
|
)
|
|
`);
|
|
query(`INSERT INTO metrics_new SELECT * FROM metrics`);
|
|
query(`DROP TABLE metrics`);
|
|
query(`ALTER TABLE metrics_new RENAME TO metrics`);
|
|
query(`CREATE INDEX IF NOT EXISTS idx_metrics_service_timestamp ON metrics(service_id, timestamp DESC)`);
|
|
|
|
// Logs
|
|
query(`
|
|
CREATE TABLE logs_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
service_id INTEGER NOT NULL,
|
|
timestamp REAL NOT NULL,
|
|
message TEXT NOT NULL,
|
|
level TEXT NOT NULL,
|
|
source TEXT NOT NULL,
|
|
FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
|
|
)
|
|
`);
|
|
query(`INSERT INTO logs_new SELECT * FROM logs`);
|
|
query(`DROP TABLE logs`);
|
|
query(`ALTER TABLE logs_new RENAME TO logs`);
|
|
query(`CREATE INDEX IF NOT EXISTS idx_logs_service_timestamp ON logs(service_id, timestamp DESC)`);
|
|
|
|
// Users
|
|
query(`
|
|
CREATE TABLE users_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'user',
|
|
created_at REAL NOT NULL,
|
|
updated_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO users_new SELECT * FROM users`);
|
|
query(`DROP TABLE users`);
|
|
query(`ALTER TABLE users_new RENAME TO users`);
|
|
|
|
// Settings
|
|
query(`
|
|
CREATE TABLE settings_new (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
updated_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO settings_new SELECT * FROM settings`);
|
|
query(`DROP TABLE settings`);
|
|
query(`ALTER TABLE settings_new RENAME TO settings`);
|
|
|
|
// Migrations table itself
|
|
query(`
|
|
CREATE TABLE migrations_new (
|
|
version INTEGER PRIMARY KEY,
|
|
applied_at REAL NOT NULL
|
|
)
|
|
`);
|
|
query(`INSERT INTO migrations_new SELECT * FROM migrations`);
|
|
query(`DROP TABLE migrations`);
|
|
query(`ALTER TABLE migrations_new RENAME TO migrations`);
|
|
}
|
|
}
|