/
dluchko
/
verta
Обзор
Документация
Войти
/
dluchko
/
verta
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
docker/postgres/init/01-schema.sql
243 строки
10 KB
dluchko
Initial commit: Verta Cloud Computer Platform MVP
06 июл 2026, 09:40
06 июл 2026, 09:40
89697a4
Код
Авторство
О чём код?
-- Verta Database Initialization Script -- Run automatically when container starts for the first time -- Create extension for UUID generation CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Create users table CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role VARCHAR(50) DEFAULT 'user' CHECK (role IN ('user', 'host_owner', 'admin', 'super_admin')), balance DECIMAL(10, 2) DEFAULT 0, is_active BOOLEAN DEFAULT true, last_login_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create user_profiles table CREATE TABLE IF NOT EXISTS user_profiles ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE, display_name VARCHAR(100), avatar_url TEXT, locale VARCHAR(10) DEFAULT 'ru', settings JSONB DEFAULT '{}'::jsonb, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create oauth_accounts table CREATE TABLE IF NOT EXISTS oauth_accounts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, provider VARCHAR(50) NOT NULL, provider_user_id VARCHAR(255) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, UNIQUE(user_id, provider), UNIQUE(provider, provider_user_id) ); -- Create plans table CREATE TABLE IF NOT EXISTS plans ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(50) UNIQUE NOT NULL CHECK (name IN ('free', 'lite', 'pro', 'ultimate')), price_monthly DECIMAL(10, 2) NOT NULL, price_hourly DECIMAL(10, 2) NOT NULL, features JSONB DEFAULT '{}'::jsonb, limits JSONB DEFAULT '{}'::jsonb, is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create subscriptions table CREATE TABLE IF NOT EXISTS subscriptions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, plan_id UUID NOT NULL REFERENCES plans(id), status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'cancelled', 'expired', 'suspended')), started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP WITH TIME ZONE, auto_renew BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create transactions table CREATE TABLE IF NOT EXISTS transactions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, type VARCHAR(50) NOT NULL CHECK (type IN ('deposit', 'subscription', 'hourly', 'refund', 'host_payout')), amount DECIMAL(10, 2) NOT NULL, status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'completed', 'failed')), payment_method JSONB, external_id VARCHAR(255), description TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create hosts table CREATE TABLE IF NOT EXISTS hosts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), owner_id UUID NOT NULL REFERENCES users(id), name VARCHAR(100) NOT NULL, status VARCHAR(20) DEFAULT 'offline' CHECK (status IN ('online', 'offline', 'busy', 'maintenance')), specs JSONB DEFAULT '{}'::jsonb, agent_version VARCHAR(50), last_seen_at TIMESTAMP WITH TIME ZONE, registered_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, is_verified BOOLEAN DEFAULT false, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create sessions table CREATE TABLE IF NOT EXISTS sessions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, host_id UUID NOT NULL REFERENCES hosts(id), status VARCHAR(20) DEFAULT 'queued' CHECK (status IN ('queued', 'starting', 'active', 'stopping', 'completed', 'failed')), plan_id UUID REFERENCES plans(id), billing_type VARCHAR(20) DEFAULT 'subscription' CHECK (billing_type IN ('subscription', 'hourly')), started_at TIMESTAMP WITH TIME ZONE, ended_at TIMESTAMP WITH TIME ZONE, duration_seconds INTEGER DEFAULT 0, cost DECIMAL(10, 2) DEFAULT 0, connection_info JSONB, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create session_stats table CREATE TABLE IF NOT EXISTS session_stats ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE, cpu_usage DECIMAL(5, 2), gpu_usage DECIMAL(5, 2), ram_usage DECIMAL(5, 2), network_rx BIGINT DEFAULT 0, network_tx BIGINT DEFAULT 0, fps INTEGER, latency_ms INTEGER, recorded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create queue_entries table CREATE TABLE IF NOT EXISTS queue_entries ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, session_id UUID REFERENCES sessions(id) ON DELETE CASCADE, position INTEGER NOT NULL, priority INTEGER DEFAULT 0, status VARCHAR(20) DEFAULT 'waiting' CHECK (status IN ('waiting', 'assigned', 'expired')), created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, assigned_at TIMESTAMP WITH TIME ZONE ); -- Create user_storage table CREATE TABLE IF NOT EXISTS user_storage ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE, total_bytes BIGINT DEFAULT 0, used_bytes BIGINT DEFAULT 0, plan_limit_bytes BIGINT DEFAULT 53687091200, -- 50GB default updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create admin_audit_log table CREATE TABLE IF NOT EXISTS admin_audit_log ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), admin_id UUID NOT NULL REFERENCES users(id), action VARCHAR(100) NOT NULL, target_type VARCHAR(50), target_id UUID, details JSONB, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create notifications table CREATE TABLE IF NOT EXISTS notifications ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, type VARCHAR(50) NOT NULL CHECK (type IN ('session_ready', 'session_ended', 'payment', 'queue', 'system')), title VARCHAR(255) NOT NULL, message TEXT, is_read BOOLEAN DEFAULT false, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create indexes CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_users_role ON users(role); CREATE INDEX idx_users_is_active ON users(is_active); CREATE INDEX idx_sessions_user_id ON sessions(user_id); CREATE INDEX idx_sessions_host_id ON sessions(host_id); CREATE INDEX idx_sessions_status ON sessions(status); CREATE INDEX idx_sessions_created_at ON sessions(created_at); CREATE INDEX idx_transactions_user_id ON transactions(user_id); CREATE INDEX idx_transactions_status ON transactions(status); CREATE INDEX idx_hosts_status ON hosts(status); CREATE INDEX idx_hosts_owner_id ON hosts(owner_id); CREATE INDEX idx_session_stats_session_id ON session_stats(session_id); CREATE INDEX idx_session_stats_recorded_at ON session_stats(recorded_at); CREATE INDEX idx_queue_entries_user_id ON queue_entries(user_id); CREATE INDEX idx_queue_entries_status ON queue_entries(status); CREATE INDEX idx_notifications_user_id ON notifications(user_id); CREATE INDEX idx_notifications_is_read ON notifications(is_read); -- Create function for updated_at trigger CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; -- Create triggers for updated_at CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_user_profiles_updated_at BEFORE UPDATE ON user_profiles FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_plans_updated_at BEFORE UPDATE ON plans FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_subscriptions_updated_at BEFORE UPDATE ON subscriptions FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_hosts_updated_at BEFORE UPDATE ON hosts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_user_storage_updated_at BEFORE UPDATE ON user_storage FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Insert default plans INSERT INTO plans (name, price_monthly, price_hourly, features, limits, is_active) VALUES ('free', 0, 0, '{"max_sessions": 1, "session_duration_minutes": 60, "auto_disconnect_minutes": 15, "gpu_priority": false}', '{"max_cpu_percent": 25, "max_ram_gb": 4, "max_disk_gb": 10}', true), ('lite', 9.99, 0.25, '{"max_sessions": 3, "session_duration_minutes": null, "auto_disconnect_minutes": 30, "gpu_priority": false}', '{"max_cpu_percent": 50, "max_ram_gb": 8, "max_disk_gb": 50}', true), ('pro', 24.99, 0.50, '{"max_sessions": 5, "session_duration_minutes": null, "auto_disconnect_minutes": 60, "gpu_priority": true}', '{"max_cpu_percent": 75, "max_ram_gb": 16, "max_disk_gb": 200}', true), ('ultimate', 49.99, 1.00, '{"max_sessions": 10, "session_duration_minutes": null, "auto_disconnect_minutes": null, "gpu_priority": true, "priority_queue": true}', '{"max_cpu_percent": 100, "max_ram_gb": 64, "max_disk_gb": 500}', true) ON CONFLICT (name) DO NOTHING;