1+ -- Create users table
2+ CREATE TABLE users (
3+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
4+ username VARCHAR (50 ) UNIQUE NOT NULL ,
5+ email VARCHAR (255 ) UNIQUE NOT NULL ,
6+ password_hash VARCHAR (255 ) NOT NULL ,
7+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
8+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
9+ last_login TIMESTAMPTZ ,
10+ is_active BOOLEAN NOT NULL DEFAULT true
11+ );
12+
13+ -- Create api_keys table
14+ CREATE TABLE api_keys (
15+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
16+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE ,
17+ name VARCHAR (100 ) NOT NULL ,
18+ description TEXT ,
19+ key_hash VARCHAR (255 ) NOT NULL ,
20+ key_prefix VARCHAR (20 ) NOT NULL ,
21+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
22+ expires_at TIMESTAMPTZ ,
23+ last_used TIMESTAMPTZ ,
24+ is_active BOOLEAN NOT NULL DEFAULT true
25+ );
26+
27+ -- Create deployments table
28+ CREATE TABLE deployments (
29+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
30+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE ,
31+ app_name VARCHAR (63 ) NOT NULL ,
32+ image VARCHAR (255 ) NOT NULL ,
33+ port INTEGER NOT NULL DEFAULT 80 ,
34+ env_vars JSONB NOT NULL DEFAULT ' {}' ,
35+ replicas INTEGER NOT NULL DEFAULT 1 ,
36+ resources JSONB NOT NULL DEFAULT ' {}' ,
37+ health_check JSONB,
38+ status VARCHAR (50 ) NOT NULL DEFAULT ' pending' ,
39+ url VARCHAR (255 ) NOT NULL ,
40+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
41+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
42+ deployed_at TIMESTAMPTZ ,
43+
44+ UNIQUE(user_id, app_name)
45+ );
46+
47+ -- Create domains table
48+ CREATE TABLE domains (
49+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
50+ deployment_id UUID NOT NULL REFERENCES deployments(id) ON DELETE CASCADE ,
51+ domain VARCHAR (253 ) NOT NULL UNIQUE,
52+ status VARCHAR (50 ) NOT NULL DEFAULT ' pending' ,
53+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
54+ verified_at TIMESTAMPTZ
55+ );
56+
57+ -- Create indexes for better performance
58+ CREATE INDEX idx_users_email ON users(email);
59+ CREATE INDEX idx_users_username ON users(username);
60+ CREATE INDEX idx_api_keys_user_id ON api_keys(user_id);
61+ CREATE INDEX idx_api_keys_key_prefix ON api_keys(key_prefix);
62+ CREATE INDEX idx_api_keys_active ON api_keys(is_active);
63+ CREATE INDEX idx_deployments_user_id ON deployments(user_id);
64+ CREATE INDEX idx_deployments_status ON deployments(status);
65+ CREATE INDEX idx_deployments_app_name ON deployments(app_name);
66+ CREATE INDEX idx_domains_deployment_id ON domains(deployment_id);
67+ CREATE INDEX idx_domains_domain ON domains(domain);
68+
69+ -- Add triggers to update updated_at automatically
70+ CREATE OR REPLACE FUNCTION update_updated_at_column ()
71+ RETURNS TRIGGER AS $$
72+ BEGIN
73+ NEW .updated_at = NOW();
74+ RETURN NEW;
75+ END;
76+ $$ language ' plpgsql' ;
77+
78+ CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
79+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
80+
81+ CREATE TRIGGER update_deployments_updated_at BEFORE UPDATE ON deployments
82+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
0 commit comments