-- Reference schema only. Runtime schema is managed by dao/sqlite.go migrations. CREATE TABLE schema_migrations ( version TEXT PRIMARY KEY, applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE config ( id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE DEFAULT '', value TEXT NOT NULL DEFAULT '', remark TEXT NOT NULL DEFAULT '', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX config_key_index ON config (key); CREATE TABLE admin_user ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE DEFAULT '', password_hash TEXT NOT NULL DEFAULT '', status INTEGER NOT NULL DEFAULT 1, force_password_change INTEGER NOT NULL DEFAULT 0, last_login_at INTEGER NOT NULL DEFAULT 0, password_changed_at INTEGER NOT NULL DEFAULT 0, token_version INTEGER NOT NULL DEFAULT 1, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX admin_user_username_index ON admin_user (username); CREATE TABLE peer ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE DEFAULT '', remark TEXT NOT NULL DEFAULT '', auth_id TEXT NOT NULL UNIQUE DEFAULT '', secret_digest TEXT NOT NULL UNIQUE DEFAULT '', secret_ciphertext TEXT NOT NULL DEFAULT '', quota_bytes INTEGER NOT NULL DEFAULT 0, download_bytes INTEGER NOT NULL DEFAULT 0, upload_bytes INTEGER NOT NULL DEFAULT 0, expires_at INTEGER NOT NULL DEFAULT 0, max_devices INTEGER NOT NULL DEFAULT 3, disabled INTEGER NOT NULL DEFAULT 0, banned_until INTEGER NOT NULL DEFAULT 0, last_connection_at INTEGER NOT NULL DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX peer_name_index ON peer (name); CREATE INDEX peer_auth_id_index ON peer (auth_id); CREATE INDEX peer_secret_digest_index ON peer (secret_digest); CREATE TABLE traffic_sample ( id INTEGER PRIMARY KEY AUTOINCREMENT, peer_id INTEGER NOT NULL, auth_id TEXT NOT NULL, rx_bytes INTEGER NOT NULL DEFAULT 0, tx_bytes INTEGER NOT NULL DEFAULT 0, sampled_at INTEGER NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_traffic_sample_time ON traffic_sample(sampled_at); CREATE INDEX idx_traffic_sample_peer_time ON traffic_sample(peer_id, sampled_at); CREATE TABLE traffic_aggregate_hourly ( peer_id INTEGER NOT NULL, hour_start INTEGER NOT NULL, rx_bytes INTEGER NOT NULL DEFAULT 0, tx_bytes INTEGER NOT NULL DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(peer_id, hour_start) ); CREATE INDEX idx_traffic_hourly_hour_start ON traffic_aggregate_hourly(hour_start); CREATE TABLE traffic_aggregate_daily ( peer_id INTEGER NOT NULL, day_start INTEGER NOT NULL, rx_bytes INTEGER NOT NULL DEFAULT 0, tx_bytes INTEGER NOT NULL DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(peer_id, day_start) ); CREATE INDEX idx_traffic_daily_day_start ON traffic_aggregate_daily(day_start); CREATE TABLE metric_sample ( id INTEGER PRIMARY KEY AUTOINCREMENT, sampled_at INTEGER NOT NULL, cpu_percent REAL NOT NULL DEFAULT 0, load1 REAL NOT NULL DEFAULT 0, mem_used_bytes INTEGER NOT NULL DEFAULT 0, mem_total_bytes INTEGER NOT NULL DEFAULT 0, mem_percent REAL NOT NULL DEFAULT 0, disk_path TEXT NOT NULL DEFAULT '/', disk_used_bytes INTEGER NOT NULL DEFAULT 0, disk_total_bytes INTEGER NOT NULL DEFAULT 0, disk_percent REAL NOT NULL DEFAULT 0, hysteria_running INTEGER NOT NULL DEFAULT 0, online_peers INTEGER NOT NULL DEFAULT 0, online_devices INTEGER NOT NULL DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_metric_sample_time ON metric_sample(sampled_at);