Consolidate database schema into two files: init migrations table and complete schema
Since there is no existing installed base, we can consolidate all migrations into a single complete schema file plus the migrations table initialization. This simplifies the database setup for new installations.
This commit is contained in:
6
internal/database/migrations/001_init_migrations.sql
Normal file
6
internal/database/migrations/001_init_migrations.sql
Normal file
@@ -0,0 +1,6 @@
|
||||
-- Initialize migrations table for tracking applied migrations
|
||||
CREATE TABLE IF NOT EXISTS migrations (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
@@ -1,7 +1,8 @@
|
||||
-- Initial schema for upaas
|
||||
-- Complete schema for upaas (consolidated)
|
||||
-- This represents the final state of all migrations applied
|
||||
|
||||
-- Users table (single admin user)
|
||||
CREATE TABLE users (
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL,
|
||||
@@ -9,7 +10,7 @@ CREATE TABLE users (
|
||||
);
|
||||
|
||||
-- Apps table
|
||||
CREATE TABLE apps (
|
||||
CREATE TABLE IF NOT EXISTS apps (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
repo_url TEXT NOT NULL,
|
||||
@@ -18,18 +19,19 @@ CREATE TABLE apps (
|
||||
webhook_secret TEXT NOT NULL,
|
||||
ssh_private_key TEXT NOT NULL,
|
||||
ssh_public_key TEXT NOT NULL,
|
||||
container_id TEXT,
|
||||
image_id TEXT,
|
||||
previous_image_id TEXT,
|
||||
status TEXT DEFAULT 'pending',
|
||||
docker_network TEXT,
|
||||
ntfy_topic TEXT,
|
||||
slack_webhook TEXT,
|
||||
webhook_secret_hash TEXT NOT NULL DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- App environment variables
|
||||
CREATE TABLE app_env_vars (
|
||||
CREATE TABLE IF NOT EXISTS app_env_vars (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
key TEXT NOT NULL,
|
||||
@@ -38,7 +40,7 @@ CREATE TABLE app_env_vars (
|
||||
);
|
||||
|
||||
-- App labels
|
||||
CREATE TABLE app_labels (
|
||||
CREATE TABLE IF NOT EXISTS app_labels (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
key TEXT NOT NULL,
|
||||
@@ -47,7 +49,7 @@ CREATE TABLE app_labels (
|
||||
);
|
||||
|
||||
-- App volume mounts
|
||||
CREATE TABLE app_volumes (
|
||||
CREATE TABLE IF NOT EXISTS app_volumes (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
host_path TEXT NOT NULL,
|
||||
@@ -55,13 +57,24 @@ CREATE TABLE app_volumes (
|
||||
readonly INTEGER DEFAULT 0
|
||||
);
|
||||
|
||||
-- App port mappings
|
||||
CREATE TABLE IF NOT EXISTS app_ports (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
host_port INTEGER NOT NULL,
|
||||
container_port INTEGER NOT NULL,
|
||||
protocol TEXT NOT NULL DEFAULT 'tcp' CHECK(protocol IN ('tcp', 'udp')),
|
||||
UNIQUE(host_port, protocol)
|
||||
);
|
||||
|
||||
-- Webhook events log
|
||||
CREATE TABLE webhook_events (
|
||||
CREATE TABLE IF NOT EXISTS webhook_events (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
event_type TEXT NOT NULL,
|
||||
branch TEXT NOT NULL,
|
||||
commit_sha TEXT,
|
||||
commit_url TEXT,
|
||||
payload TEXT,
|
||||
matched INTEGER NOT NULL,
|
||||
processed INTEGER DEFAULT 0,
|
||||
@@ -69,13 +82,13 @@ CREATE TABLE webhook_events (
|
||||
);
|
||||
|
||||
-- Deployments log
|
||||
CREATE TABLE deployments (
|
||||
CREATE TABLE IF NOT EXISTS deployments (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
webhook_event_id INTEGER REFERENCES webhook_events(id),
|
||||
commit_sha TEXT,
|
||||
commit_url TEXT,
|
||||
image_id TEXT,
|
||||
container_id TEXT,
|
||||
status TEXT NOT NULL,
|
||||
logs TEXT,
|
||||
started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -83,12 +96,14 @@ CREATE TABLE deployments (
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_apps_status ON apps(status);
|
||||
CREATE INDEX idx_apps_webhook_secret ON apps(webhook_secret);
|
||||
CREATE INDEX idx_app_env_vars_app_id ON app_env_vars(app_id);
|
||||
CREATE INDEX idx_app_labels_app_id ON app_labels(app_id);
|
||||
CREATE INDEX idx_app_volumes_app_id ON app_volumes(app_id);
|
||||
CREATE INDEX idx_webhook_events_app_id ON webhook_events(app_id);
|
||||
CREATE INDEX idx_webhook_events_created_at ON webhook_events(created_at);
|
||||
CREATE INDEX idx_deployments_app_id ON deployments(app_id);
|
||||
CREATE INDEX idx_deployments_started_at ON deployments(started_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_apps_status ON apps(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_apps_webhook_secret ON apps(webhook_secret);
|
||||
CREATE INDEX IF NOT EXISTS idx_apps_webhook_secret_hash ON apps(webhook_secret_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_app_env_vars_app_id ON app_env_vars(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_app_labels_app_id ON app_labels(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_app_volumes_app_id ON app_volumes(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_app_ports_app_id ON app_ports(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_webhook_events_app_id ON webhook_events(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_webhook_events_created_at ON webhook_events(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_deployments_app_id ON deployments(app_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_deployments_started_at ON deployments(started_at);
|
||||
@@ -1,44 +0,0 @@
|
||||
-- Remove container_id from apps table
|
||||
-- Container is now looked up via Docker label (upaas.id) instead of stored in database
|
||||
|
||||
-- SQLite doesn't support DROP COLUMN before version 3.35.0 (2021-03-12)
|
||||
-- Use table rebuild for broader compatibility
|
||||
|
||||
-- Create new table without container_id
|
||||
CREATE TABLE apps_new (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
repo_url TEXT NOT NULL,
|
||||
branch TEXT NOT NULL DEFAULT 'main',
|
||||
dockerfile_path TEXT DEFAULT 'Dockerfile',
|
||||
webhook_secret TEXT NOT NULL,
|
||||
ssh_private_key TEXT NOT NULL,
|
||||
ssh_public_key TEXT NOT NULL,
|
||||
image_id TEXT,
|
||||
status TEXT DEFAULT 'pending',
|
||||
docker_network TEXT,
|
||||
ntfy_topic TEXT,
|
||||
slack_webhook TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Copy data (excluding container_id)
|
||||
INSERT INTO apps_new (
|
||||
id, name, repo_url, branch, dockerfile_path, webhook_secret,
|
||||
ssh_private_key, ssh_public_key, image_id, status,
|
||||
docker_network, ntfy_topic, slack_webhook, created_at, updated_at
|
||||
)
|
||||
SELECT
|
||||
id, name, repo_url, branch, dockerfile_path, webhook_secret,
|
||||
ssh_private_key, ssh_public_key, image_id, status,
|
||||
docker_network, ntfy_topic, slack_webhook, created_at, updated_at
|
||||
FROM apps;
|
||||
|
||||
-- Drop old table and rename new one
|
||||
DROP TABLE apps;
|
||||
ALTER TABLE apps_new RENAME TO apps;
|
||||
|
||||
-- Recreate indexes
|
||||
CREATE INDEX idx_apps_status ON apps(status);
|
||||
CREATE INDEX idx_apps_webhook_secret ON apps(webhook_secret);
|
||||
@@ -1,12 +0,0 @@
|
||||
-- Add port mappings for apps
|
||||
|
||||
CREATE TABLE app_ports (
|
||||
id INTEGER PRIMARY KEY,
|
||||
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
||||
host_port INTEGER NOT NULL,
|
||||
container_port INTEGER NOT NULL,
|
||||
protocol TEXT NOT NULL DEFAULT 'tcp' CHECK(protocol IN ('tcp', 'udp')),
|
||||
UNIQUE(host_port, protocol)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_app_ports_app_id ON app_ports(app_id);
|
||||
@@ -1,3 +0,0 @@
|
||||
-- Add commit_url column to webhook_events and deployments tables
|
||||
ALTER TABLE webhook_events ADD COLUMN commit_url TEXT;
|
||||
ALTER TABLE deployments ADD COLUMN commit_url TEXT;
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Add webhook_secret_hash column for constant-time secret lookup
|
||||
ALTER TABLE apps ADD COLUMN webhook_secret_hash TEXT NOT NULL DEFAULT '';
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Add previous_image_id to apps for deployment rollback support
|
||||
ALTER TABLE apps ADD COLUMN previous_image_id TEXT;
|
||||
Reference in New Issue
Block a user