-- OCDP Backend PostgreSQL 数据库初始化脚本 -- 创建数据库和必要的表结构 -- ===== Users 表 ===== CREATE TABLE IF NOT EXISTS users ( id VARCHAR(36) PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password_hash TEXT NOT NULL, email VARCHAR(255) NOT NULL, revoked_after TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:00', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_users_username ON users(username); CREATE INDEX IF NOT EXISTS idx_users_revoked_after ON users(revoked_after); COMMENT ON TABLE users IS '用户表'; COMMENT ON COLUMN users.id IS '用户 ID (UUID)'; COMMENT ON COLUMN users.username IS '用户名(唯一)'; COMMENT ON COLUMN users.password_hash IS '密码哈希'; COMMENT ON COLUMN users.email IS '邮箱'; -- ===== Clusters 表 ===== CREATE TABLE IF NOT EXISTS clusters ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, host TEXT NOT NULL, ca_data TEXT, cert_data TEXT, key_data TEXT, token TEXT, description TEXT, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_clusters_name ON clusters(name); COMMENT ON TABLE clusters IS 'Kubernetes 集群表'; COMMENT ON COLUMN clusters.id IS '集群 ID (UUID)'; COMMENT ON COLUMN clusters.name IS '集群名称(唯一)'; COMMENT ON COLUMN clusters.host IS 'Kubernetes API Server URL'; COMMENT ON COLUMN clusters.ca_data IS 'CA 证书(加密存储)'; COMMENT ON COLUMN clusters.cert_data IS '客户端证书(加密存储)'; COMMENT ON COLUMN clusters.key_data IS '客户端密钥(加密存储)'; COMMENT ON COLUMN clusters.token IS 'Bearer Token(加密存储)'; -- ===== Registries 表 ===== CREATE TABLE IF NOT EXISTS registries ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, url TEXT NOT NULL, description TEXT, username VARCHAR(255), password TEXT, insecure BOOLEAN DEFAULT FALSE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_registries_name ON registries(name); COMMENT ON TABLE registries IS 'OCI Registry 表'; COMMENT ON COLUMN registries.id IS 'Registry ID (UUID)'; COMMENT ON COLUMN registries.name IS 'Registry 名称(唯一)'; COMMENT ON COLUMN registries.url IS 'Registry URL'; COMMENT ON COLUMN registries.username IS '认证用户名'; COMMENT ON COLUMN registries.password IS '认证密码(加密存储)'; COMMENT ON COLUMN registries.insecure IS '是否跳过 TLS 验证'; -- ===== Instances 表 ===== CREATE TABLE IF NOT EXISTS instances ( id VARCHAR(36) PRIMARY KEY, cluster_id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, namespace VARCHAR(255) NOT NULL, registry_id VARCHAR(36) NOT NULL, repository TEXT NOT NULL, chart VARCHAR(255) NOT NULL, version VARCHAR(255) NOT NULL, description TEXT, values JSONB, values_yaml TEXT, status VARCHAR(50) NOT NULL, status_reason TEXT, last_operation VARCHAR(50), last_error TEXT, revision INTEGER NOT NULL DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_cluster FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE, CONSTRAINT fk_registry FOREIGN KEY (registry_id) REFERENCES registries(id) ON DELETE CASCADE, CONSTRAINT unique_cluster_name UNIQUE (cluster_id, name, namespace) ); CREATE INDEX IF NOT EXISTS idx_instances_cluster ON instances(cluster_id); CREATE INDEX IF NOT EXISTS idx_instances_registry ON instances(registry_id); CREATE INDEX IF NOT EXISTS idx_instances_name ON instances(name); CREATE INDEX IF NOT EXISTS idx_instances_status ON instances(status); COMMENT ON TABLE instances IS 'Helm 应用实例表'; COMMENT ON COLUMN instances.id IS '实例 ID (UUID)'; COMMENT ON COLUMN instances.cluster_id IS '所属集群 ID'; COMMENT ON COLUMN instances.name IS 'Helm Release 名称'; COMMENT ON COLUMN instances.namespace IS 'Kubernetes 命名空间'; COMMENT ON COLUMN instances.registry_id IS '所属 Registry ID'; COMMENT ON COLUMN instances.repository IS 'OCI Repository'; COMMENT ON COLUMN instances.chart IS 'Chart 名称'; COMMENT ON COLUMN instances.version IS 'Chart 版本'; COMMENT ON COLUMN instances.values IS 'Helm Values (JSON 格式)'; COMMENT ON COLUMN instances.values_yaml IS 'Helm Values (YAML 格式)'; COMMENT ON COLUMN instances.status IS '实例状态'; COMMENT ON COLUMN instances.status_reason IS '状态说明'; COMMENT ON COLUMN instances.last_operation IS '最后一次操作类型'; COMMENT ON COLUMN instances.last_error IS '最近一次错误信息'; COMMENT ON COLUMN instances.revision IS 'Helm Release Revision'; -- ===== 数据库版本表 ===== CREATE TABLE IF NOT EXISTS schema_migrations ( version VARCHAR(50) PRIMARY KEY, applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); COMMENT ON TABLE schema_migrations IS '数据库迁移版本记录'; -- 插入初始版本 INSERT INTO schema_migrations (version) VALUES ('v1.0.0') ON CONFLICT (version) DO NOTHING;