feat: create standalone native fnOS repository

This commit is contained in:
2026-10-02 15:19:09 +08:00
parent 69f3c30fab
commit 6725fc131d
492 changed files with 94023 additions and 3 deletions
+36
View File
@@ -0,0 +1,36 @@
CREATE TABLE IF NOT EXISTS schema_migrations (
version INTEGER PRIMARY KEY,
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS admins (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS sessions (
id TEXT PRIMARY KEY,
admin_id INTEGER NOT NULL REFERENCES admins(id) ON DELETE CASCADE,
expires_at TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at);
CREATE TABLE IF NOT EXISTS proxy_rules (
id INTEGER PRIMARY KEY AUTOINCREMENT,
domain TEXT NOT NULL UNIQUE COLLATE NOCASE,
upstream TEXT NOT NULL,
https_enabled INTEGER NOT NULL DEFAULT 1 CHECK (https_enabled IN (0, 1)),
http_redirect INTEGER NOT NULL DEFAULT 1 CHECK (http_redirect IN (0, 1)),
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
+31
View File
@@ -0,0 +1,31 @@
CREATE TABLE IF NOT EXISTS ddns_configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
provider TEXT NOT NULL DEFAULT 'cloudflare',
root_domain TEXT NOT NULL,
record_name TEXT NOT NULL,
ipv4_enabled INTEGER NOT NULL DEFAULT 1 CHECK (ipv4_enabled IN (0, 1)),
ipv6_enabled INTEGER NOT NULL DEFAULT 0 CHECK (ipv6_enabled IN (0, 1)),
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
api_token_enc TEXT,
last_ipv4 TEXT,
last_ipv6 TEXT,
last_status TEXT NOT NULL DEFAULT 'unknown',
last_error TEXT,
last_updated_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS certificates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
domain TEXT NOT NULL UNIQUE,
wildcard INTEGER NOT NULL DEFAULT 0 CHECK (wildcard IN (0, 1)),
cert_path TEXT,
key_path TEXT,
expires_at TEXT,
last_renew_at TEXT,
status TEXT NOT NULL DEFAULT 'pending',
last_error TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
+2
View File
@@ -0,0 +1,2 @@
CREATE UNIQUE INDEX IF NOT EXISTS idx_ddns_configs_domain_record
ON ddns_configs(root_domain, record_name);
+1
View File
@@ -0,0 +1 @@
ALTER TABLE certificates ADD COLUMN acme_ca TEXT NOT NULL DEFAULT 'letsencrypt';
+1
View File
@@ -0,0 +1 @@
ALTER TABLE certificates ADD COLUMN domains TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,50 @@
CREATE TEMP TABLE proxy_domain_backup AS
SELECT id, domain FROM proxy_rules;
CREATE TABLE proxy_rules_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
upstream TEXT NOT NULL,
listen_port INTEGER NOT NULL DEFAULT 80 CHECK (listen_port > 0 AND listen_port <= 65535),
listen_ipv4 INTEGER NOT NULL DEFAULT 1 CHECK (listen_ipv4 IN (0, 1)),
listen_ipv6 INTEGER NOT NULL DEFAULT 0 CHECK (listen_ipv6 IN (0, 1)),
https_enabled INTEGER NOT NULL DEFAULT 1 CHECK (https_enabled IN (0, 1)),
http_redirect INTEGER NOT NULL DEFAULT 1 CHECK (http_redirect IN (0, 1)),
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
INSERT INTO proxy_rules_new (id, upstream, listen_port, listen_ipv4, listen_ipv6, https_enabled, http_redirect, enabled, created_at, updated_at)
SELECT
id,
upstream,
CASE WHEN https_enabled = 1 THEN 443 ELSE 80 END,
1,
0,
https_enabled,
http_redirect,
enabled,
created_at,
updated_at
FROM proxy_rules;
DROP TABLE proxy_rules;
ALTER TABLE proxy_rules_new RENAME TO proxy_rules;
CREATE TABLE IF NOT EXISTS proxy_hosts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rule_id INTEGER NOT NULL REFERENCES proxy_rules(id) ON DELETE CASCADE,
hostname TEXT NOT NULL COLLATE NOCASE,
listen_port INTEGER CHECK (listen_port IS NULL OR (listen_port > 0 AND listen_port <= 65535)),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(hostname)
);
CREATE INDEX IF NOT EXISTS idx_proxy_hosts_rule_id ON proxy_hosts(rule_id);
INSERT INTO proxy_hosts (rule_id, hostname, listen_port)
SELECT id, domain, NULL
FROM proxy_domain_backup
WHERE domain IS NOT NULL AND TRIM(domain) != '';
DROP TABLE proxy_domain_backup;
@@ -0,0 +1,5 @@
ALTER TABLE ddns_configs ADD COLUMN record_names TEXT NOT NULL DEFAULT '[]';
UPDATE ddns_configs
SET record_names = json_array(record_name)
WHERE record_names = '[]' OR record_names IS NULL OR record_names = '';
@@ -0,0 +1 @@
ALTER TABLE ddns_configs ADD COLUMN domain_records TEXT NOT NULL DEFAULT '[]';
+6
View File
@@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS proxy_traffic (
host TEXT PRIMARY KEY,
upload_bytes INTEGER NOT NULL DEFAULT 0,
download_bytes INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
@@ -0,0 +1,22 @@
UPDATE proxy_hosts
SET listen_port = (
SELECT listen_port FROM proxy_rules WHERE proxy_rules.id = proxy_hosts.rule_id
)
WHERE listen_port IS NULL;
CREATE TABLE proxy_hosts_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rule_id INTEGER NOT NULL REFERENCES proxy_rules(id) ON DELETE CASCADE,
hostname TEXT NOT NULL COLLATE NOCASE,
listen_port INTEGER NOT NULL CHECK (listen_port > 0 AND listen_port <= 65535),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(hostname, listen_port)
);
INSERT INTO proxy_hosts_new (id, rule_id, hostname, listen_port, created_at)
SELECT id, rule_id, hostname, listen_port, created_at FROM proxy_hosts;
DROP TABLE proxy_hosts;
ALTER TABLE proxy_hosts_new RENAME TO proxy_hosts;
CREATE INDEX IF NOT EXISTS idx_proxy_hosts_rule_id ON proxy_hosts(rule_id);
+1
View File
@@ -0,0 +1 @@
ALTER TABLE proxy_rules ADD COLUMN remark TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,7 @@
ALTER TABLE proxy_rules RENAME COLUMN remark TO name;
ALTER TABLE proxy_rules ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0;
UPDATE proxy_rules SET sort_order = id;
CREATE INDEX IF NOT EXISTS idx_proxy_rules_sort_order ON proxy_rules(sort_order);
@@ -0,0 +1 @@
ALTER TABLE proxy_rules ADD COLUMN security_json TEXT NOT NULL DEFAULT '{}';
+1
View File
@@ -0,0 +1 @@
ALTER TABLE proxy_rules ADD COLUMN nginx_mode TEXT NOT NULL DEFAULT 'auto';
+44
View File
@@ -0,0 +1,44 @@
CREATE TABLE IF NOT EXISTS frp_servers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE COLLATE NOCASE,
server_addr TEXT NOT NULL,
server_port INTEGER NOT NULL CHECK (server_port > 0 AND server_port <= 65535),
auth_token_enc TEXT,
tls_enabled INTEGER NOT NULL DEFAULT 1 CHECK (tls_enabled IN (0, 1)),
tls_server_name TEXT NOT NULL DEFAULT '',
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS frp_proxies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL REFERENCES frp_servers(id) ON DELETE CASCADE,
name TEXT NOT NULL COLLATE NOCASE,
type TEXT NOT NULL CHECK (type IN ('tcp', 'http', 'https')),
local_ip TEXT NOT NULL DEFAULT '127.0.0.1',
local_port INTEGER NOT NULL CHECK (local_port > 0 AND local_port <= 65535),
remote_port INTEGER CHECK (remote_port IS NULL OR (remote_port > 0 AND remote_port <= 65535)),
custom_domains_json TEXT NOT NULL DEFAULT '[]',
host_header_rewrite TEXT NOT NULL DEFAULT '',
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
remark TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(server_id, name)
);
CREATE TABLE IF NOT EXISTS frp_runtime_status (
server_id INTEGER PRIMARY KEY REFERENCES frp_servers(id) ON DELETE CASCADE,
status TEXT NOT NULL DEFAULT 'stopped',
pid INTEGER,
frpc_version TEXT NOT NULL DEFAULT '',
last_started_at TEXT,
last_reloaded_at TEXT,
last_error TEXT NOT NULL DEFAULT '',
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_frp_proxies_tcp_remote_port
ON frp_proxies(server_id, remote_port)
WHERE type = 'tcp' AND remote_port IS NOT NULL;
@@ -0,0 +1,2 @@
ALTER TABLE frp_servers ADD COLUMN config_json TEXT NOT NULL DEFAULT '{}';
ALTER TABLE frp_servers ADD COLUMN oidc_client_secret_enc TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,11 @@
CREATE TABLE IF NOT EXISTS frp_server_diagnostics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL REFERENCES frp_servers(id) ON DELETE CASCADE,
checked_at TEXT NOT NULL DEFAULT (datetime('now')),
available INTEGER NOT NULL DEFAULT 0 CHECK (available IN (0, 1)),
latency_ms INTEGER,
error TEXT NOT NULL DEFAULT ''
);
CREATE INDEX IF NOT EXISTS idx_frp_server_diagnostics_server_time
ON frp_server_diagnostics(server_id, checked_at);
@@ -0,0 +1 @@
ALTER TABLE frp_proxies ADD COLUMN config_json TEXT NOT NULL DEFAULT '{}';
@@ -0,0 +1,18 @@
ALTER TABLE frp_runtime_status ADD COLUMN desired_state TEXT NOT NULL DEFAULT 'stopped';
ALTER TABLE frp_runtime_status ADD COLUMN process_state TEXT NOT NULL DEFAULT 'stopped';
ALTER TABLE frp_runtime_status ADD COLUMN connection_state TEXT NOT NULL DEFAULT 'unknown';
ALTER TABLE frp_runtime_status ADD COLUMN state_source TEXT NOT NULL DEFAULT 'legacy';
ALTER TABLE frp_runtime_status ADD COLUMN process_pid INTEGER;
ALTER TABLE frp_runtime_status ADD COLUMN exit_code INTEGER;
ALTER TABLE frp_runtime_status ADD COLUMN last_connected_at TEXT;
ALTER TABLE frp_runtime_status ADD COLUMN last_disconnected_at TEXT;
UPDATE frp_runtime_status
SET desired_state = CASE WHEN status IN ('running', 'starting') THEN 'running' ELSE 'stopped' END,
process_state = CASE WHEN status IN ('running', 'starting') THEN 'unknown' ELSE 'stopped' END,
connection_state = CASE WHEN status = 'running' THEN 'unknown' ELSE 'unknown' END,
state_source = 'migration'
WHERE desired_state = 'stopped' AND status IN ('running', 'starting');
CREATE INDEX IF NOT EXISTS idx_frp_runtime_process_state
ON frp_runtime_status(process_state, connection_state);
+1
View File
@@ -0,0 +1 @@
ALTER TABLE frp_servers ADD COLUMN dashboard_password_enc TEXT;
@@ -0,0 +1,42 @@
-- FRP 规则类型与端口约束修正(文档 FRP_CROSS_MODULE_IMPLEMENTATION_PLAN.md 23.2)
-- 原 014_frp.sql 的 type CHECK 只有 tcp/http/https,但校验器与前端已支持
-- udp/tcpmux/stcp/sudp/xtcp:这些类型会在校验通过后因 SQLite CHECK 约束插入失败。
-- SQLite 无法 ALTER CHECK 约束,这里重建 frp_proxies 表并统一约束。
CREATE TABLE IF NOT EXISTS frp_proxies_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL REFERENCES frp_servers(id) ON DELETE CASCADE,
name TEXT NOT NULL COLLATE NOCASE,
type TEXT NOT NULL CHECK (type IN ('tcp', 'udp', 'http', 'https', 'tcpmux', 'stcp', 'sudp', 'xtcp')),
local_ip TEXT NOT NULL DEFAULT '127.0.0.1',
local_port INTEGER NOT NULL CHECK (local_port > 0 AND local_port <= 65535),
remote_port INTEGER CHECK (
remote_port IS NULL
OR (remote_port > 0 AND remote_port <= 65535 AND type IN ('tcp', 'udp'))
),
custom_domains_json TEXT NOT NULL DEFAULT '[]',
host_header_rewrite TEXT NOT NULL DEFAULT '',
config_json TEXT NOT NULL DEFAULT '{}',
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
remark TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(server_id, name)
);
INSERT INTO frp_proxies_new
(id, server_id, name, type, local_ip, local_port, remote_port, custom_domains_json, host_header_rewrite, config_json, enabled, remark, created_at, updated_at)
SELECT
id, server_id, name, type, local_ip, local_port, remote_port, custom_domains_json, host_header_rewrite, COALESCE(config_json, '{}'), enabled, remark, created_at, updated_at
FROM frp_proxies;
DROP TABLE frp_proxies;
ALTER TABLE frp_proxies_new RENAME TO frp_proxies;
-- tcp 与 udp 的远程端口在同一 server_id 内分别查重(原索引混用两种协议)
DROP INDEX IF EXISTS idx_frp_proxies_tcp_remote_port;
CREATE UNIQUE INDEX IF NOT EXISTS idx_frp_proxies_tcp_remote_port
ON frp_proxies(server_id, remote_port)
WHERE type = 'tcp' AND remote_port IS NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS idx_frp_proxies_udp_remote_port
ON frp_proxies(server_id, remote_port)
WHERE type = 'udp' AND remote_port IS NOT NULL;
@@ -0,0 +1,3 @@
-- DDNS 支持自定义 IP:填写后更新记录时直接使用该 IP(如公网服务器 IP),不填则检测本机公网 IP。
ALTER TABLE ddns_configs ADD COLUMN custom_ipv4 TEXT NOT NULL DEFAULT '';
ALTER TABLE ddns_configs ADD COLUMN custom_ipv6 TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,9 @@
-- 公网 havline-agent 远程管理配置
ALTER TABLE frp_servers ADD COLUMN agent_url TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_token_enc TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN ssh_host TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN ssh_port INTEGER NOT NULL DEFAULT 22;
ALTER TABLE frp_servers ADD COLUMN ssh_user TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN ssh_auth TEXT NOT NULL DEFAULT 'key';
ALTER TABLE frp_servers ADD COLUMN ssh_secret_enc TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN mgmt_enabled INTEGER NOT NULL DEFAULT 0 CHECK (mgmt_enabled IN (0, 1));
@@ -0,0 +1,14 @@
-- 手动(custom)Nginx 规则的监听占用:custom 配置的正本在文件系统(rules.nginx_mode 只记开关),
-- 本表只存解析出的 (域名, 端口),专供保存时做「同域名 + 同端口」冲突校验;
-- 不参与配置生成、流量统计与前端表单预填(那些是 proxy_hosts 的语义)。
CREATE TABLE IF NOT EXISTS proxy_custom_endpoints (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rule_id INTEGER NOT NULL REFERENCES proxy_rules(id) ON DELETE CASCADE,
hostname TEXT NOT NULL COLLATE NOCASE,
listen_port INTEGER NOT NULL CHECK (listen_port > 0 AND listen_port <= 65535),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(rule_id, hostname, listen_port)
);
CREATE INDEX IF NOT EXISTS idx_proxy_custom_endpoints_rule_id ON proxy_custom_endpoints(rule_id);
CREATE INDEX IF NOT EXISTS idx_proxy_custom_endpoints_binding ON proxy_custom_endpoints(hostname, listen_port);
+12
View File
@@ -0,0 +1,12 @@
-- API Token:给无法保存会话 cookie 的调用方(脚本 / HomeAssistant / 手机快捷指令)用。
-- token_hash 是明文令牌的 SHA-256:明文只在创建响应里返回一次,库里不留。
-- scope: read = 只允许 GET/HEAD,write = 与登录会话同权。
CREATE TABLE IF NOT EXISTS api_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
token_hash TEXT NOT NULL UNIQUE,
scope TEXT NOT NULL DEFAULT 'read',
expires_at TEXT,
last_used_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
+14
View File
@@ -0,0 +1,14 @@
-- 反代规则健康状态变更记录:只存「状态变化」(up / down / unknown),
-- 可用率与不可用区间由变更序列推导——避免每 2 分钟一行原始采样把表撑大。
-- unknown 表示「frps 管理接口不可用、判不出来」,与 down 严格区分(判不了不等于不通)。
CREATE TABLE IF NOT EXISTS route_health_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL,
domain TEXT NOT NULL,
state TEXT NOT NULL,
reason TEXT,
detail TEXT,
at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_route_health_events_lookup ON route_health_events(server_id, domain, at);
@@ -0,0 +1,12 @@
-- 指标历史:按 (scope, metric) 纵向存点,避免「每加一个指标就改一次表结构」。
-- scope 形如 host / server:3 / route:3:example.com;采样跟随巡检轮次(2 分钟)。
-- 行量很小(本机 3 条指标约每天 2160 行),因此不做降采样表,查询时按桶取平均。
CREATE TABLE IF NOT EXISTS metrics_samples (
id INTEGER PRIMARY KEY AUTOINCREMENT,
scope TEXT NOT NULL,
metric TEXT NOT NULL,
value REAL NOT NULL,
at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_metrics_samples_lookup ON metrics_samples(scope, metric, at);
@@ -0,0 +1,7 @@
-- Agent 传输安全:默认支持 SSH 隧道回环访问,保留 http 作为升级兼容模式。
ALTER TABLE frp_servers ADD COLUMN agent_transport TEXT NOT NULL DEFAULT 'http';
ALTER TABLE frp_servers ADD COLUMN agent_local_port INTEGER NOT NULL DEFAULT 0;
ALTER TABLE frp_servers ADD COLUMN agent_tls_pin TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_listen_addr TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_transport_state TEXT NOT NULL DEFAULT 'unknown';
ALTER TABLE frp_servers ADD COLUMN agent_transport_error TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,5 @@
-- Agent TLS 轮换与主机防火墙辅助状态。
ALTER TABLE frp_servers ADD COLUMN agent_tls_pin_prev TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_tls_pin_prev_until TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_tls_not_after TEXT NOT NULL DEFAULT '';
ALTER TABLE frp_servers ADD COLUMN agent_firewall_state TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,20 @@
-- Cloudflare Tunnel(cloudflared)独立模块:每条隧道一份本地配置 + 子进程 + 日志。
CREATE TABLE IF NOT EXISTS cf_tunnels (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
mode TEXT NOT NULL DEFAULT 'token-local',
tunnel_id TEXT NOT NULL DEFAULT '',
account_tag TEXT NOT NULL DEFAULT '',
credentials_enc TEXT NOT NULL DEFAULT '',
cert_pem_enc TEXT NOT NULL DEFAULT '',
config_path TEXT NOT NULL DEFAULT '',
creds_path TEXT NOT NULL DEFAULT '',
log_path TEXT NOT NULL DEFAULT '',
network_json TEXT NOT NULL DEFAULT '{}',
status TEXT NOT NULL DEFAULT 'stopped',
last_error TEXT NOT NULL DEFAULT '',
metrics_port INTEGER NOT NULL DEFAULT 0,
auto_start INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
+9
View File
@@ -0,0 +1,9 @@
-- Cloudflare 隧道模块的应用级配置:默认 Token、下载镜像与默认网络设置。
CREATE TABLE IF NOT EXISTS cf_settings (
id INTEGER PRIMARY KEY CHECK (id = 1),
default_token_enc TEXT NOT NULL DEFAULT '',
mirror TEXT NOT NULL DEFAULT 'official',
network_json TEXT NOT NULL DEFAULT '{}',
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
INSERT OR IGNORE INTO cf_settings(id) VALUES (1);
+2
View File
@@ -0,0 +1,2 @@
-- Cloudflare API Token(cfat_...):用于连接验证与后续云端同步,与隧道 Token 分开存储。
ALTER TABLE cf_settings ADD COLUMN api_token_enc TEXT NOT NULL DEFAULT '';
+2
View File
@@ -0,0 +1,2 @@
-- Cloudflare 账号 ID:与 API Token 一起用于创建与管理隧道。
ALTER TABLE cf_settings ADD COLUMN account_id TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,2 @@
-- Cloudflare 隧道全局托管开关:关闭后停止所有隧道,且应用重启不再自动拉起。
ALTER TABLE cf_settings ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1;
+19
View File
@@ -0,0 +1,19 @@
-- 服务发布规则出口:默认仍走本机 Nginx,保持旧数据行为不变。
ALTER TABLE proxy_rules ADD COLUMN exits_json TEXT NOT NULL DEFAULT '["local"]';
ALTER TABLE proxy_rules ADD COLUMN cf_tunnel_id INTEGER NOT NULL DEFAULT 0;
-- 托管隧道标记:只有托管隧道才从反向代理规则派生 ingress,避免覆盖手工隧道。
ALTER TABLE cf_tunnels ADD COLUMN managed INTEGER NOT NULL DEFAULT 0;
-- 记录 Havline 自动创建或接管的 Cloudflare DNS 记录,删除时只清理自己管理的记录。
CREATE TABLE IF NOT EXISTS cf_dns_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tunnel_id INTEGER NOT NULL,
zone_id TEXT NOT NULL,
record_id TEXT NOT NULL,
hostname TEXT NOT NULL UNIQUE,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_cf_dns_records_tunnel ON cf_dns_records(tunnel_id);
+13
View File
@@ -0,0 +1,13 @@
-- Cloudflare 隧道健康事件:只记录状态变化,供巡检通知与公开状态页计算 24h 可用率。
CREATE TABLE IF NOT EXISTS cf_health_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tunnel_id INTEGER NOT NULL,
domain TEXT NOT NULL,
state TEXT NOT NULL,
reason TEXT NOT NULL DEFAULT '',
detail TEXT NOT NULL DEFAULT '',
at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_cf_health_events_lookup ON cf_health_events(tunnel_id, domain, id);
CREATE INDEX IF NOT EXISTS idx_cf_health_events_at ON cf_health_events(at);