feat: create standalone native fnOS repository
This commit is contained in:
@@ -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
|
||||
);
|
||||
@@ -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'))
|
||||
);
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_ddns_configs_domain_record
|
||||
ON ddns_configs(root_domain, record_name);
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE certificates ADD COLUMN acme_ca TEXT NOT NULL DEFAULT 'letsencrypt';
|
||||
@@ -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 '[]';
|
||||
@@ -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);
|
||||
@@ -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 '{}';
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE proxy_rules ADD COLUMN nginx_mode TEXT NOT NULL DEFAULT 'auto';
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
@@ -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'))
|
||||
);
|
||||
@@ -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'))
|
||||
);
|
||||
@@ -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);
|
||||
@@ -0,0 +1,2 @@
|
||||
-- Cloudflare API Token(cfat_...):用于连接验证与后续云端同步,与隧道 Token 分开存储。
|
||||
ALTER TABLE cf_settings ADD COLUMN api_token_enc TEXT NOT NULL DEFAULT '';
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user