Files
yuan-lab-llm--clawmanager/backend/internal/db/migrations/001_init_schema.sql
T
wehub-resource-sync 6d978fe483
Build / Frontend Build (push) Has been cancelled
Build / Backend Build (push) Has been cancelled
Build / Docker Build (push) Has been cancelled
Build / Kubernetes Deploy Smoke Test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:24 +08:00

170 lines
6.2 KiB
SQL

-- Initial schema for ClawReef
-- Created: 2026-03-15
-- Users table
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(320) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role ENUM('admin', 'user') DEFAULT 'user',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
last_login TIMESTAMP,
INDEX idx_username (username),
INDEX idx_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Instances table
CREATE TABLE IF NOT EXISTS instances (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
type ENUM('openclaw', 'ubuntu', 'debian', 'centos', 'custom', 'webtop', 'hermes') DEFAULT 'ubuntu',
runtime_type ENUM('desktop', 'shell') NOT NULL DEFAULT 'desktop',
status ENUM('creating', 'running', 'stopped', 'error', 'deleting') DEFAULT 'creating',
cpu_cores INT NOT NULL,
memory_gb INT NOT NULL,
disk_gb INT NOT NULL,
gpu_enabled BOOLEAN DEFAULT FALSE,
gpu_type VARCHAR(100),
gpu_count INT DEFAULT 0,
os_type VARCHAR(50) NOT NULL,
os_version VARCHAR(50) NOT NULL,
image_registry VARCHAR(255),
image_tag VARCHAR(100),
environment_overrides_json LONGTEXT,
storage_class VARCHAR(50) DEFAULT 'standard',
mount_path VARCHAR(255) DEFAULT '/data',
pod_name VARCHAR(255),
pod_namespace VARCHAR(255),
pod_ip VARCHAR(45),
access_url VARCHAR(500),
access_token VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
started_at TIMESTAMP,
stopped_at TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_type (type),
UNIQUE KEY uk_user_instance_name (user_id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Persistent volumes table
CREATE TABLE IF NOT EXISTS persistent_volumes (
id INT AUTO_INCREMENT PRIMARY KEY,
instance_id INT NOT NULL,
pvc_name VARCHAR(255) UNIQUE NOT NULL,
pvc_namespace VARCHAR(255) NOT NULL,
storage_size_gb INT NOT NULL,
storage_class VARCHAR(50),
mount_path VARCHAR(255),
status ENUM('pending', 'bound', 'released', 'failed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE,
INDEX idx_instance_id (instance_id),
UNIQUE KEY uk_pvc_name_namespace (pvc_name, pvc_namespace)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Backups table
CREATE TABLE IF NOT EXISTS backups (
id INT AUTO_INCREMENT PRIMARY KEY,
instance_id INT NOT NULL,
backup_name VARCHAR(255) NOT NULL,
backup_size_gb INT,
backup_path VARCHAR(500),
status ENUM('creating', 'completed', 'failed', 'deleted') DEFAULT 'creating',
backup_type ENUM('manual', 'scheduled') DEFAULT 'manual',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP,
expires_at TIMESTAMP,
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE,
INDEX idx_instance_id (instance_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Backup schedules table
CREATE TABLE IF NOT EXISTS backup_schedules (
id INT AUTO_INCREMENT PRIMARY KEY,
instance_id INT NOT NULL,
schedule_name VARCHAR(255),
cron_expression VARCHAR(100) NOT NULL,
retention_days INT DEFAULT 30,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE,
INDEX idx_instance_id (instance_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- User quotas table
CREATE TABLE IF NOT EXISTS user_quotas (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
max_instances INT DEFAULT 10,
max_cpu_cores INT DEFAULT 40,
max_memory_gb INT DEFAULT 100,
max_storage_gb INT DEFAULT 500,
max_gpu_count INT DEFAULT 2,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Instance usage table
CREATE TABLE IF NOT EXISTS instance_usage (
id INT AUTO_INCREMENT PRIMARY KEY,
instance_id INT NOT NULL,
cpu_usage_percent DECIMAL(5,2),
memory_usage_gb DECIMAL(10,2),
disk_usage_gb DECIMAL(10,2),
gpu_usage_percent DECIMAL(5,2),
uptime_seconds INT,
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE,
INDEX idx_instance_recorded (instance_id, recorded_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Audit logs table
CREATE TABLE IF NOT EXISTS audit_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
action VARCHAR(100) NOT NULL,
resource_type VARCHAR(50) NOT NULL,
resource_id INT,
details JSON,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_action (action),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Insert default admin user (password: admin123)
INSERT INTO users (username, email, password_hash, role, is_active)
SELECT 'admin', 'admin@clawreef.local', '$2a$10$pbenze514mwv3pvQySQBVOsF5J4DBXL2kVo1hLa8JFhQu5x3AKvBi', 'admin', TRUE
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM users
WHERE username = 'admin' OR email = 'admin@clawreef.local'
);
-- Insert default quota for admin
INSERT INTO user_quotas (user_id, max_instances, max_cpu_cores, max_memory_gb, max_storage_gb, max_gpu_count)
SELECT users.id, 100, 200, 1000, 5000, 10
FROM users
WHERE username = 'admin'
AND NOT EXISTS (
SELECT 1
FROM user_quotas
WHERE user_quotas.user_id = users.id
);