170 lines
6.2 KiB
SQL
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
|
|
);
|