Refactor project to transition from Rust backend to Node.js with Fastify; update Dockerfile and Docker configurations for new build process; enhance local development instructions in CONTRIBUTING.md; implement health checks in Docker Compose; update pnpm-lock.yaml with new dependencies for API and shared packages; revise README.md to reflect new stack and development setup.
Build, Test, and Push CFDM Docker Image / test (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / build-and-push (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / create-release (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / update-wiki (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / test (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / build-and-push (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / create-release (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / update-wiki (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
CREATE TABLE groups (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
slug TEXT NOT NULL UNIQUE,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE TABLE services (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
slug TEXT NOT NULL UNIQUE,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE TABLE domains (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
group_id INTEGER REFERENCES groups(id) ON DELETE SET NULL,
|
||||
zone_name TEXT NOT NULL UNIQUE,
|
||||
cf_zone_id TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
last_synced_at TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_domains_cf_zone_id ON domains(cf_zone_id);
|
||||
CREATE INDEX idx_domains_group_id ON domains(group_id);
|
||||
|
||||
CREATE TABLE subdomains (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
domain_id INTEGER NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
fqdn TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
UNIQUE(domain_id, name)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_subdomains_domain_id ON subdomains(domain_id);
|
||||
|
||||
CREATE TABLE dns_records (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
domain_id INTEGER NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
||||
cf_record_id TEXT,
|
||||
record_type TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
ttl INTEGER NOT NULL DEFAULT 1,
|
||||
proxied INTEGER NOT NULL DEFAULT 0,
|
||||
priority INTEGER,
|
||||
sync_status TEXT NOT NULL DEFAULT 'pending_push',
|
||||
origin TEXT NOT NULL DEFAULT 'local',
|
||||
last_error TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_dns_records_domain_type_name ON dns_records(domain_id, record_type, name);
|
||||
CREATE INDEX idx_dns_records_sync_status ON dns_records(sync_status);
|
||||
|
||||
CREATE TABLE domain_services (
|
||||
domain_id INTEGER NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
||||
service_id INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (domain_id, service_id)
|
||||
);
|
||||
|
||||
CREATE TABLE subdomain_services (
|
||||
subdomain_id INTEGER NOT NULL REFERENCES subdomains(id) ON DELETE CASCADE,
|
||||
service_id INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (subdomain_id, service_id)
|
||||
);
|
||||
|
||||
CREATE TABLE certificates (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
domain_id INTEGER NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
||||
subdomain_id INTEGER REFERENCES subdomains(id) ON DELETE SET NULL,
|
||||
hostname TEXT NOT NULL UNIQUE,
|
||||
expires_at TEXT,
|
||||
last_checked_at TEXT,
|
||||
last_error TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'unknown',
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_certificates_status_expires ON certificates(status, expires_at);
|
||||
|
||||
CREATE TABLE sync_jobs (
|
||||
id TEXT PRIMARY KEY,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
domain_id INTEGER REFERENCES domains(id) ON DELETE SET NULL,
|
||||
message TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
finished_at TEXT
|
||||
);
|
||||
|
||||
INSERT INTO groups (name, slug) VALUES
|
||||
('Local', 'local'),
|
||||
('VPN', 'vpn'),
|
||||
('External', 'external');
|
||||
|
||||
INSERT INTO services (name, slug) VALUES
|
||||
('DNS', 'dns'),
|
||||
('BGP', 'bgp'),
|
||||
('CDN', 'cdn'),
|
||||
('Mail', 'mail');
|
||||
@@ -0,0 +1,23 @@
|
||||
PRAGMA foreign_keys = OFF;
|
||||
|
||||
CREATE TABLE service_bindings (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
domain_id INTEGER NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
||||
service_id INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE,
|
||||
hostname TEXT NOT NULL DEFAULT '@',
|
||||
dns_record_id INTEGER REFERENCES dns_records(id) ON DELETE SET NULL,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
UNIQUE(domain_id, service_id, hostname)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_service_bindings_domain_id ON service_bindings(domain_id);
|
||||
CREATE INDEX idx_service_bindings_service_id ON service_bindings(service_id);
|
||||
|
||||
INSERT INTO service_bindings (domain_id, service_id, hostname, created_at, updated_at)
|
||||
SELECT domain_id, service_id, '@', datetime('now'), datetime('now')
|
||||
FROM domain_services;
|
||||
|
||||
DROP TABLE domain_services;
|
||||
|
||||
PRAGMA foreign_keys = ON;
|
||||
@@ -0,0 +1,40 @@
|
||||
PRAGMA foreign_keys = OFF;
|
||||
|
||||
CREATE TABLE service_ips (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
service_id INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE,
|
||||
ip TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
UNIQUE(service_id, ip)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_service_ips_service_id ON service_ips(service_id);
|
||||
|
||||
CREATE TABLE service_binding_records (
|
||||
binding_id INTEGER NOT NULL REFERENCES service_bindings(id) ON DELETE CASCADE,
|
||||
dns_record_id INTEGER NOT NULL REFERENCES dns_records(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (binding_id, dns_record_id)
|
||||
);
|
||||
|
||||
INSERT INTO service_ips (service_id, ip, created_at)
|
||||
SELECT DISTINCT sb.service_id, dr.content, datetime('now')
|
||||
FROM service_bindings sb
|
||||
JOIN dns_records dr ON dr.id = sb.dns_record_id
|
||||
WHERE dr.record_type = 'A'
|
||||
AND dr.content IS NOT NULL
|
||||
AND TRIM(dr.content) != ''
|
||||
ON CONFLICT(service_id, ip) DO NOTHING;
|
||||
|
||||
INSERT INTO service_binding_records (binding_id, dns_record_id)
|
||||
SELECT sb.id, sb.dns_record_id
|
||||
FROM service_bindings sb
|
||||
WHERE sb.dns_record_id IS NOT NULL
|
||||
ON CONFLICT(binding_id, dns_record_id) DO NOTHING;
|
||||
|
||||
INSERT INTO services (name, slug) VALUES
|
||||
('VPN Panel', 'vpn-panel'),
|
||||
('VPN Node', 'vpn-node'),
|
||||
('Home Assistant', 'home-assistant')
|
||||
ON CONFLICT(slug) DO NOTHING;
|
||||
|
||||
PRAGMA foreign_keys = ON;
|
||||
@@ -0,0 +1,29 @@
|
||||
PRAGMA foreign_keys = OFF;
|
||||
|
||||
CREATE TABLE service_groups (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'custom',
|
||||
icon TEXT,
|
||||
domain TEXT,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
ALTER TABLE services ADD COLUMN service_group_id INTEGER REFERENCES service_groups(id) ON DELETE SET NULL;
|
||||
ALTER TABLE services ADD COLUMN subdomain TEXT;
|
||||
ALTER TABLE services ADD COLUMN enabled INTEGER NOT NULL DEFAULT 0;
|
||||
|
||||
UPDATE services SET subdomain = slug WHERE subdomain IS NULL;
|
||||
|
||||
INSERT INTO service_groups (name, type, enabled) VALUES
|
||||
('VPN', 'vpn', 1),
|
||||
('Сеть', 'network', 1),
|
||||
('Интернет', 'internet', 1);
|
||||
|
||||
UPDATE services
|
||||
SET service_group_id = (SELECT id FROM service_groups WHERE type = 'vpn' LIMIT 1)
|
||||
WHERE slug IN ('vpn-panel', 'vpn-node');
|
||||
|
||||
PRAGMA foreign_keys = ON;
|
||||
@@ -0,0 +1,25 @@
|
||||
CREATE TABLE service_binding_ips (
|
||||
binding_id INTEGER NOT NULL REFERENCES service_bindings(id) ON DELETE CASCADE,
|
||||
ip TEXT NOT NULL,
|
||||
PRIMARY KEY (binding_id, ip)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_service_binding_ips_binding_id ON service_binding_ips(binding_id);
|
||||
|
||||
INSERT INTO service_binding_ips (binding_id, ip)
|
||||
SELECT sbr.binding_id, dr.content
|
||||
FROM service_binding_records sbr
|
||||
JOIN dns_records dr ON dr.id = sbr.dns_record_id
|
||||
WHERE dr.record_type = 'A'
|
||||
AND dr.content IS NOT NULL
|
||||
AND TRIM(dr.content) != ''
|
||||
ON CONFLICT(binding_id, ip) DO NOTHING;
|
||||
|
||||
INSERT INTO service_binding_ips (binding_id, ip)
|
||||
SELECT sb.id, dr.content
|
||||
FROM service_bindings sb
|
||||
JOIN dns_records dr ON dr.id = sb.dns_record_id
|
||||
WHERE dr.record_type = 'A'
|
||||
AND dr.content IS NOT NULL
|
||||
AND TRIM(dr.content) != ''
|
||||
ON CONFLICT(binding_id, ip) DO NOTHING;
|
||||
@@ -0,0 +1,7 @@
|
||||
CREATE TABLE service_group_dns_records (
|
||||
group_id INTEGER NOT NULL REFERENCES service_groups(id) ON DELETE CASCADE,
|
||||
dns_record_id INTEGER NOT NULL REFERENCES dns_records(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (group_id, dns_record_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_service_group_dns_records_group_id ON service_group_dns_records(group_id);
|
||||
@@ -0,0 +1 @@
|
||||
CREATE INDEX IF NOT EXISTS idx_dns_records_domain_cf_id ON dns_records(domain_id, cf_record_id);
|
||||
Reference in New Issue
Block a user