This commit is contained in:
2025-11-08 15:06:30 +08:00
parent 27614f695f
commit e28e885e66
14 changed files with 99 additions and 78 deletions

View File

@@ -1,5 +1,5 @@
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
registrations_remaining INTEGER DEFAULT 3,
@@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS invite_codes (
code VARCHAR(32) UNIQUE NOT NULL,
created_by INTEGER REFERENCES users(id),
used_by INTEGER REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
used_at TIMESTAMPTZ
);
@@ -57,7 +57,7 @@ CREATE TABLE IF NOT EXISTS dns_records (
value VARCHAR(1000) NOT NULL,
ttl INTEGER DEFAULT 3600,
priority INTEGER, -- For MX records
created_at TIMESTAMPTZ DEFAULT NOW()
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_dns_records_domain_type ON dns_records(domain_id, record_type);

View File

@@ -1,5 +1,5 @@
-- Make IP column optional for domains
ALTER TABLE domains ALTER COLUMN ip DROP NOT NULL;
ALTER TABLE domains MODIFY COLUMN ip VARCHAR(255) NULL;
-- Update DNS records constraint to only allow A, AAAA, CNAME, TXT
ALTER TABLE dns_records DROP CONSTRAINT IF EXISTS dns_records_record_type_check;

View File

@@ -1,10 +1,10 @@
-- Re-add NS record support and extend record types
ALTER TABLE dns_records DROP CONSTRAINT IF EXISTS dns_records_record_type_check;
ALTER TABLE dns_records DROP CONSTRAINT dns_records_record_type_check;
ALTER TABLE dns_records ADD CONSTRAINT dns_records_record_type_check
CHECK (record_type IN ('A', 'AAAA', 'CNAME', 'TXT', 'NS', 'MX'));
-- Add index for efficient NS record lookups during delegation
CREATE INDEX IF NOT EXISTS idx_dns_records_ns_lookup ON dns_records(record_type, name) WHERE record_type = 'NS';
CREATE INDEX idx_dns_records_ns_lookup ON dns_records(record_type, name) WHERE record_type = 'NS';
-- Add index for subdomain resolution optimization
CREATE INDEX IF NOT EXISTS idx_dns_records_subdomain_lookup ON dns_records(domain_id, name, record_type);
CREATE INDEX idx_dns_records_subdomain_lookup ON dns_records(domain_id, name, record_type);

View File

@@ -4,5 +4,5 @@ ALTER TABLE dns_records ADD CONSTRAINT dns_records_record_type_check
CHECK (record_type IN ('A', 'AAAA', 'CNAME', 'TXT', 'NS'));
-- Add indexes for efficient DNS lookups if they don't exist
CREATE INDEX IF NOT EXISTS idx_dns_records_ns_lookup ON dns_records(record_type, name) WHERE record_type = 'NS';
CREATE INDEX IF NOT EXISTS idx_dns_records_subdomain_lookup ON dns_records(domain_id, name, record_type);
CREATE INDEX idx_dns_records_ns_lookup ON dns_records(record_type, name);
CREATE INDEX idx_dns_records_subdomain_lookup ON dns_records(domain_id, name, record_type);

View File

@@ -1,18 +1,18 @@
-- Add certificate challenges table for CA functionality
CREATE TABLE IF NOT EXISTS certificate_challenges (
id SERIAL PRIMARY KEY,
id INT AUTO_INCREMENT PRIMARY KEY,
token VARCHAR(255) UNIQUE NOT NULL,
domain VARCHAR(255) NOT NULL,
challenge_type VARCHAR(20) NOT NULL CHECK (challenge_type IN ('dns')),
challenge_type VARCHAR(20) NOT NULL,
verification_data VARCHAR(500) NOT NULL,
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'valid', 'invalid', 'expired')),
created_at TIMESTAMPTZ DEFAULT NOW(),
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_certificate_challenges_token ON certificate_challenges(token);
CREATE INDEX IF NOT EXISTS idx_certificate_challenges_domain ON certificate_challenges(domain);
CREATE INDEX IF NOT EXISTS idx_certificate_challenges_expires_at ON certificate_challenges(expires_at);
CREATE INDEX idx_certificate_challenges_token ON certificate_challenges(token);
CREATE INDEX idx_certificate_challenges_domain ON certificate_challenges(domain);
CREATE INDEX idx_certificate_challenges_expires_at ON certificate_challenges(expires_at);
-- Add table to store issued certificates
CREATE TABLE IF NOT EXISTS issued_certificates (
@@ -21,13 +21,13 @@ CREATE TABLE IF NOT EXISTS issued_certificates (
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
certificate_pem TEXT NOT NULL,
private_key_pem TEXT NOT NULL,
issued_at TIMESTAMPTZ DEFAULT NOW(),
issued_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMPTZ NOT NULL,
revoked_at TIMESTAMPTZ,
serial_number VARCHAR(255) UNIQUE NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_issued_certificates_domain ON issued_certificates(domain);
CREATE INDEX IF NOT EXISTS idx_issued_certificates_user_id ON issued_certificates(user_id);
CREATE INDEX IF NOT EXISTS idx_issued_certificates_serial ON issued_certificates(serial_number);
CREATE INDEX IF NOT EXISTS idx_issued_certificates_expires_at ON issued_certificates(expires_at);
CREATE INDEX idx_issued_certificates_domain ON issued_certificates(domain);
CREATE INDEX idx_issued_certificates_user_id ON issued_certificates(user_id);
CREATE INDEX idx_issued_certificates_serial ON issued_certificates(serial_number);
CREATE INDEX idx_issued_certificates_expires_at ON issued_certificates(expires_at);

View File

@@ -2,6 +2,26 @@
DELETE FROM dns_records WHERE record_type NOT IN ('A', 'AAAA', 'CNAME', 'TXT');
-- Now apply the constraint
ALTER TABLE dns_records DROP CONSTRAINT IF EXISTS dns_records_record_type_check;
ALTER TABLE dns_records ADD CONSTRAINT dns_records_record_type_check
CHECK (record_type IN ('A', 'AAAA', 'CNAME', 'TXT'));
ALTER TABLE dns_records DROP CONSTRAINT dns_records_record_type_check;
-- MySQL doesn't support table-level CHECK constraints, using trigger instead
DELIMITER //
CREATE TRIGGER check_record_type_before_insert
BEFORE INSERT ON dns_records
FOR EACH ROW
BEGIN
IF NEW.record_type NOT IN ('A', 'AAAA', 'CNAME', 'TXT') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid record type';
END IF;
END;
//
CREATE TRIGGER check_record_type_before_update
BEFORE UPDATE ON dns_records
FOR EACH ROW
BEGIN
IF NEW.record_type NOT IN ('A', 'AAAA', 'CNAME', 'TXT') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid record type';
END IF;
END;
//
DELIMITER ;

View File

@@ -1,8 +1,8 @@
-- Add table to store CA certificate and key
CREATE TABLE IF NOT EXISTS ca_certificates (
id SERIAL PRIMARY KEY,
id INT AUTO_INCREMENT PRIMARY KEY,
ca_cert_pem TEXT NOT NULL,
ca_key_pem TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
is_active BOOLEAN DEFAULT TRUE
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_active TINYINT(1) DEFAULT 1
);

View File

@@ -1,2 +1,2 @@
-- Add CSR field to certificate challenges
ALTER TABLE certificate_challenges ADD COLUMN IF NOT EXISTS csr_pem TEXT;
ALTER TABLE certificate_challenges ADD COLUMN csr_pem TEXT;

View File

@@ -1,28 +1,25 @@
-- Search engine domain crawl status tracking
CREATE TABLE IF NOT EXISTS domain_crawl_status (
domain_id INTEGER PRIMARY KEY REFERENCES domains(id) ON DELETE CASCADE,
last_crawled_at TIMESTAMPTZ,
next_crawl_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
domain_id INT PRIMARY KEY, FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE,
last_crawled_at TIMESTAMP,
next_crawl_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
crawl_status VARCHAR(20) DEFAULT 'pending' CHECK (crawl_status IN ('pending', 'crawling', 'completed', 'failed', 'disabled')),
error_message TEXT,
pages_found INTEGER DEFAULT 0,
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_domain_crawl_status_next_crawl ON domain_crawl_status(next_crawl_at);
CREATE INDEX IF NOT EXISTS idx_domain_crawl_status_status ON domain_crawl_status(crawl_status);
-- Function to update the updated_at column
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Trigger for updated_at
DROP TRIGGER IF EXISTS update_domain_crawl_status_updated_at ON domain_crawl_status;
-- MySQL trigger to update updated_at column
DELIMITER //
CREATE TRIGGER update_domain_crawl_status_updated_at
BEFORE UPDATE ON domain_crawl_status
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
FOR EACH ROW
BEGIN
SET NEW.updated_at = CURRENT_TIMESTAMP;
END;
//
DELIMITER ;