-- V3__runtime_management.sql -- Runtime management: environments, apps, app versions, deployments CREATE TABLE environments ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), slug VARCHAR(100) NOT NULL UNIQUE, display_name VARCHAR(255) NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE apps ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), environment_id UUID NOT NULL REFERENCES environments(id) ON DELETE CASCADE, slug VARCHAR(100) NOT NULL, display_name VARCHAR(255) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(environment_id, slug) ); CREATE INDEX idx_apps_environment_id ON apps(environment_id); CREATE TABLE app_versions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), app_id UUID NOT NULL REFERENCES apps(id) ON DELETE CASCADE, version INTEGER NOT NULL, jar_path VARCHAR(500) NOT NULL, jar_checksum VARCHAR(64) NOT NULL, jar_filename VARCHAR(255), jar_size_bytes BIGINT, uploaded_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(app_id, version) ); CREATE INDEX idx_app_versions_app_id ON app_versions(app_id); CREATE TABLE deployments ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), app_id UUID NOT NULL REFERENCES apps(id) ON DELETE CASCADE, app_version_id UUID NOT NULL REFERENCES app_versions(id), environment_id UUID NOT NULL REFERENCES environments(id), status VARCHAR(20) NOT NULL DEFAULT 'STARTING', container_id VARCHAR(100), container_name VARCHAR(255), error_message TEXT, deployed_at TIMESTAMPTZ, stopped_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_deployments_app_id ON deployments(app_id); CREATE INDEX idx_deployments_env_id ON deployments(environment_id); -- Default environment (standalone mode always has at least one) INSERT INTO environments (slug, display_name) VALUES ('default', 'Default');