From 85530d5ea3f19a839eba388b54fd60923a2507ea Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 7 Apr 2026 23:40:18 +0200 Subject: [PATCH] feat: add runtime management database schema (environments, apps, versions, deployments) - environments, apps, app_versions, deployments tables - Default environment seeded on migration - Foreign keys with CASCADE delete Co-Authored-By: Claude Opus 4.6 (1M context) --- .../db/migration/V3__runtime_management.sql | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql diff --git a/cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql b/cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql new file mode 100644 index 00000000..1f03ce42 --- /dev/null +++ b/cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql @@ -0,0 +1,54 @@ +-- 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');