-- Schema only, inspected on us3 on 2026-09-29. No production data. CREATE TABLE admins ( id INTEGER PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE TABLE admin_sessions ( id TEXT PRIMARY KEY, admin_id INTEGER NOT NULL, session_hash TEXT NOT NULL UNIQUE, expires_at TEXT NOT NULL, created_at TEXT NOT NULL, last_seen_at TEXT NOT NULL, FOREIGN KEY (admin_id) REFERENCES admins(id) ON DELETE CASCADE ); CREATE TABLE hy2_users ( id INTEGER PRIMARY KEY AUTOINCREMENT, auth_id TEXT NOT NULL UNIQUE, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, enabled INTEGER NOT NULL DEFAULT 1, expires_at TEXT, traffic_limit_bytes INTEGER, used_tx_bytes INTEGER NOT NULL DEFAULT 0, used_rx_bytes INTEGER NOT NULL DEFAULT 0, notes TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL, updated_at TEXT NOT NULL , is_admin INTEGER NOT NULL DEFAULT 0, auth_secret_encrypted TEXT, subscription_token TEXT, subscription_label TEXT NOT NULL DEFAULT ''); CREATE TABLE hy2_nodes ( id INTEGER PRIMARY KEY AUTOINCREMENT, slug TEXT NOT NULL UNIQUE, name TEXT NOT NULL, auth_token TEXT NOT NULL, traffic_stats_url TEXT NOT NULL, traffic_stats_secret TEXT NOT NULL, enabled INTEGER NOT NULL DEFAULT 1, poll_interval_seconds INTEGER NOT NULL DEFAULT 15, last_polled_at TEXT, last_sync_ok_at TEXT, last_error_at TEXT, last_error_message TEXT, last_online_users INTEGER NOT NULL DEFAULT 0, last_stream_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL, updated_at TEXT NOT NULL , server_host TEXT NOT NULL DEFAULT '', server_port INTEGER NOT NULL DEFAULT 443, client_name TEXT NOT NULL DEFAULT '', bandwidth_up_mbps INTEGER NOT NULL DEFAULT 30, bandwidth_down_mbps INTEGER NOT NULL DEFAULT 30, skip_cert_verify INTEGER NOT NULL DEFAULT 0, sni TEXT, traffic_stats_listen TEXT NOT NULL DEFAULT ':9999', hy2_listen TEXT NOT NULL DEFAULT ':443', node_type TEXT NOT NULL DEFAULT 'hy2', custom_config_yaml TEXT NOT NULL DEFAULT ''); CREATE TABLE traffic_ledgers ( id INTEGER PRIMARY KEY AUTOINCREMENT, node_id INTEGER NOT NULL, user_id INTEGER, auth_id TEXT NOT NULL, tx_bytes INTEGER NOT NULL, rx_bytes INTEGER NOT NULL, window_started_at TEXT NOT NULL, window_ended_at TEXT NOT NULL, created_at TEXT NOT NULL, FOREIGN KEY (node_id) REFERENCES hy2_nodes(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES hy2_users(id) ON DELETE SET NULL ); CREATE TABLE node_sync_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, node_id INTEGER NOT NULL, started_at TEXT NOT NULL, finished_at TEXT NOT NULL, ok INTEGER NOT NULL, traffic_entries INTEGER NOT NULL DEFAULT 0, online_users INTEGER NOT NULL DEFAULT 0, stream_count INTEGER NOT NULL DEFAULT 0, kicked_auth_ids TEXT NOT NULL DEFAULT '', error_message TEXT, created_at TEXT NOT NULL, FOREIGN KEY (node_id) REFERENCES hy2_nodes(id) ON DELETE CASCADE ); CREATE TABLE auth_audits ( id INTEGER PRIMARY KEY AUTOINCREMENT, node_id INTEGER, user_id INTEGER, auth_id TEXT, username TEXT, addr TEXT, requested_tx INTEGER, ok INTEGER NOT NULL, reason TEXT NOT NULL, created_at TEXT NOT NULL, FOREIGN KEY (node_id) REFERENCES hy2_nodes(id) ON DELETE SET NULL, FOREIGN KEY (user_id) REFERENCES hy2_users(id) ON DELETE SET NULL ); CREATE TABLE node_user_presence ( node_id INTEGER NOT NULL, user_id INTEGER, auth_id TEXT NOT NULL, connections INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL, PRIMARY KEY (node_id, auth_id), FOREIGN KEY (node_id) REFERENCES hy2_nodes(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES hy2_users(id) ON DELETE SET NULL ); CREATE INDEX idx_hy2_users_auth_id ON hy2_users(auth_id); CREATE INDEX idx_hy2_users_username ON hy2_users(username); CREATE INDEX idx_hy2_nodes_enabled ON hy2_nodes(enabled); CREATE INDEX idx_traffic_ledgers_auth_id ON traffic_ledgers(auth_id); CREATE INDEX idx_traffic_ledgers_created_at ON traffic_ledgers(created_at); CREATE INDEX idx_node_sync_records_node_id ON node_sync_records(node_id, created_at DESC); CREATE INDEX idx_auth_audits_created_at ON auth_audits(created_at DESC); CREATE TABLE user_sessions ( id TEXT PRIMARY KEY, user_id INTEGER NOT NULL, session_hash TEXT NOT NULL UNIQUE, expires_at TEXT NOT NULL, created_at TEXT NOT NULL, last_seen_at TEXT NOT NULL, FOREIGN KEY (user_id) REFERENCES hy2_users(id) ON DELETE CASCADE ); CREATE TABLE app_settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE UNIQUE INDEX idx_hy2_users_subscription_token ON hy2_users(subscription_token); CREATE INDEX idx_user_sessions_user_id ON user_sessions(user_id); PRAGMA user_version = 4;