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

This commit is contained in:
Denozordec
2026-06-19 12:06:32 +07:00
parent 0a0a1a92f1
commit d11414666f
2065 changed files with 15782 additions and 16699 deletions
+110
View File
@@ -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);