96 lines
2.6 KiB
PL/PgSQL
96 lines
2.6 KiB
PL/PgSQL
-- 代理池管理系统数据库初始化脚本
|
|
|
|
-- 创建枚举类型
|
|
CREATE TYPE proxy_protocol AS ENUM ('http', 'https', 'socks5');
|
|
CREATE TYPE proxy_status AS ENUM ('unknown', 'alive', 'dead');
|
|
|
|
-- 代理主表
|
|
CREATE TABLE proxies (
|
|
id uuid PRIMARY KEY,
|
|
|
|
protocol proxy_protocol NOT NULL,
|
|
host text NOT NULL,
|
|
port int NOT NULL CHECK (port > 0 AND port < 65536),
|
|
username text NOT NULL DEFAULT '',
|
|
password text NOT NULL DEFAULT '',
|
|
|
|
"group" text NOT NULL DEFAULT 'default',
|
|
tags text[] NOT NULL DEFAULT ARRAY[]::text[],
|
|
|
|
status proxy_status NOT NULL DEFAULT 'unknown',
|
|
score int NOT NULL DEFAULT 0,
|
|
latency_ms bigint NOT NULL DEFAULT 0,
|
|
last_check_at timestamptz,
|
|
|
|
fail_count int NOT NULL DEFAULT 0,
|
|
success_count int NOT NULL DEFAULT 0,
|
|
|
|
disabled boolean NOT NULL DEFAULT false,
|
|
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
|
|
CONSTRAINT uq_proxy UNIQUE (protocol, host, port, username)
|
|
);
|
|
|
|
-- 常用索引
|
|
CREATE INDEX idx_proxies_group_status_disabled
|
|
ON proxies ("group", status, disabled);
|
|
|
|
-- tags 查询索引
|
|
CREATE INDEX idx_proxies_tags_gin
|
|
ON proxies USING gin (tags);
|
|
|
|
-- 可用代理热点查询索引
|
|
CREATE INDEX idx_proxies_alive_fast
|
|
ON proxies ("group", disabled, score DESC, last_check_at DESC)
|
|
WHERE status = 'alive';
|
|
|
|
-- updated_at 自动维护触发器
|
|
CREATE OR REPLACE FUNCTION touch_updated_at()
|
|
RETURNS trigger AS $$
|
|
BEGIN
|
|
NEW.updated_at = now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trg_touch_updated_at
|
|
BEFORE UPDATE ON proxies
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION touch_updated_at();
|
|
|
|
-- RR 游标表
|
|
CREATE TABLE rr_cursors (
|
|
k text PRIMARY KEY,
|
|
v bigint NOT NULL DEFAULT 0,
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- 租约表
|
|
CREATE TABLE proxy_leases (
|
|
lease_id text PRIMARY KEY,
|
|
proxy_id uuid NOT NULL REFERENCES proxies(id),
|
|
expire_at timestamptz NOT NULL,
|
|
|
|
site text NOT NULL DEFAULT '',
|
|
"group" text NOT NULL DEFAULT 'default',
|
|
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_leases_expire ON proxy_leases(expire_at);
|
|
|
|
-- 测试日志表
|
|
CREATE TABLE proxy_test_logs (
|
|
id bigserial PRIMARY KEY,
|
|
proxy_id uuid NOT NULL REFERENCES proxies(id),
|
|
site text NOT NULL,
|
|
ok boolean NOT NULL,
|
|
latency_ms bigint NOT NULL,
|
|
error_text text NOT NULL DEFAULT '',
|
|
checked_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_test_logs_proxy_time ON proxy_test_logs(proxy_id, checked_at DESC);
|