This commit is contained in:
Ember Moth
2026-07-05 20:27:58 +08:00
commit 2744c70c5c
837 changed files with 53059 additions and 0 deletions
+494
View File
@@ -0,0 +1,494 @@
-- migrate:up
-- 000001_init_schema.up.sql
CREATE TABLE IF NOT EXISTS "ads"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"title" varchar(255) NOT NULL DEFAULT '',
"type" varchar(255) NOT NULL DEFAULT '',
"content" text,
"target_url" varchar(512) DEFAULT '',
"start_time" TIMESTAMP DEFAULT NULL,
"end_time" TIMESTAMP DEFAULT NULL,
"status" SMALLINT DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "announcement"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"title" varchar(255) NOT NULL DEFAULT '',
"content" text,
"show" BOOLEAN NOT NULL DEFAULT false,
"pinned" BOOLEAN NOT NULL DEFAULT false,
"popup" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "application"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(255) NOT NULL DEFAULT '',
"icon" text NOT NULL,
"description" text,
"subscribe_type" varchar(50) NOT NULL DEFAULT '',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "application_config"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"app_id" bigint NOT NULL DEFAULT '0',
"encryption_key" text,
"encryption_method" varchar(255) DEFAULT NULL,
"domains" text,
"startup_picture" text,
"startup_picture_skip_time" bigint NOT NULL DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "application_version"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"url" varchar(255) NOT NULL DEFAULT '',
"version" varchar(255) NOT NULL DEFAULT '',
"platform" varchar(50) NOT NULL DEFAULT '',
"is_default" BOOLEAN NOT NULL DEFAULT false,
"description" text,
"application_id" bigint DEFAULT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "application_version_fk_application_application_versions" ON "application_version" ("application_id");
CREATE TABLE IF NOT EXISTS "auth_method"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"method" varchar(255) NOT NULL DEFAULT '',
"config" text NOT NULL,
"enabled" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_auth_method" UNIQUE ("method")
);
CREATE TABLE IF NOT EXISTS "coupon"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(255) NOT NULL DEFAULT '',
"code" varchar(255) NOT NULL DEFAULT '',
"count" bigint NOT NULL DEFAULT '0',
"type" SMALLINT NOT NULL DEFAULT '1',
"discount" bigint NOT NULL DEFAULT '0',
"start_time" bigint NOT NULL DEFAULT '0',
"expire_time" bigint NOT NULL DEFAULT '0',
"user_limit" bigint NOT NULL DEFAULT '0',
"subscribe" varchar(255) NOT NULL DEFAULT '',
"used_count" bigint NOT NULL DEFAULT '0',
"enable" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_coupon_code" UNIQUE ("code")
);
CREATE TABLE IF NOT EXISTS "document"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"title" varchar(255) NOT NULL DEFAULT '',
"content" text,
"tags" varchar(255) NOT NULL DEFAULT '',
"show" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "message_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"type" varchar(50) NOT NULL DEFAULT 'email',
"platform" varchar(50) NOT NULL DEFAULT 'smtp',
"to" text NOT NULL,
"subject" varchar(255) NOT NULL DEFAULT '',
"content" text,
"status" SMALLINT NOT NULL DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "order"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"parent_id" bigint DEFAULT NULL,
"user_id" bigint NOT NULL DEFAULT '0',
"order_no" varchar(255) NOT NULL DEFAULT '',
"type" SMALLINT NOT NULL DEFAULT '1',
"quantity" bigint NOT NULL DEFAULT '1',
"price" bigint NOT NULL DEFAULT '0',
"amount" bigint NOT NULL DEFAULT '0',
"gift_amount" bigint NOT NULL DEFAULT '0',
"discount" bigint NOT NULL DEFAULT '0',
"coupon" varchar(255) DEFAULT NULL,
"coupon_discount" bigint NOT NULL DEFAULT '0',
"commission" bigint NOT NULL DEFAULT '0',
"payment_id" bigint NOT NULL DEFAULT '-1',
"method" varchar(255) NOT NULL DEFAULT '',
"fee_amount" bigint NOT NULL DEFAULT '0',
"trade_no" varchar(255) DEFAULT NULL,
"status" SMALLINT NOT NULL DEFAULT '1',
"subscribe_id" bigint NOT NULL DEFAULT '0',
"subscribe_token" varchar(255) DEFAULT NULL,
"is_new" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_order_order_no" UNIQUE ("order_no")
);
CREATE TABLE IF NOT EXISTS "payment"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"platform" varchar(100) NOT NULL,
"description" text,
"icon" varchar(255) DEFAULT '',
"domain" varchar(255) DEFAULT '',
"config" text NOT NULL,
"fee_mode" SMALLINT NOT NULL DEFAULT '0',
"fee_percent" bigint DEFAULT '0',
"fee_amount" bigint DEFAULT '0',
"enable" BOOLEAN NOT NULL DEFAULT false,
"token" varchar(255) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_payment_token" UNIQUE ("token")
);
CREATE TABLE IF NOT EXISTS "server"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"tags" varchar(128) NOT NULL DEFAULT '',
"country" varchar(128) NOT NULL DEFAULT '',
"city" varchar(128) NOT NULL DEFAULT '',
"latitude" varchar(128) NOT NULL DEFAULT '',
"longitude" varchar(128) NOT NULL DEFAULT '',
"server_addr" varchar(100) NOT NULL DEFAULT '',
"relay_mode" varchar(20) NOT NULL DEFAULT 'none',
"relay_node" text,
"speed_limit" bigint NOT NULL DEFAULT '0',
"traffic_ratio" decimal(4, 2) NOT NULL DEFAULT '0.00',
"group_id" bigint DEFAULT NULL,
"protocol" varchar(20) NOT NULL DEFAULT '',
"config" text,
"enable" SMALLINT NOT NULL DEFAULT '1',
"sort" bigint NOT NULL DEFAULT '0',
"last_reported_at" TIMESTAMP(3) DEFAULT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "server_idx_group_id" ON "server" ("group_id");
CREATE TABLE IF NOT EXISTS "server_group"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"description" varchar(255) DEFAULT '',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
-- if "sms" not exist, create it
CREATE TABLE IF NOT EXISTS "sms"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"content" text,
"platform" varchar(64) DEFAULT NULL,
"area_code" varchar(64) DEFAULT NULL,
"telephone" varchar(64) DEFAULT NULL,
"status" SMALLINT DEFAULT '1',
"created_at" timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "subscribe"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(255) NOT NULL DEFAULT '',
"description" text,
"unit_price" bigint NOT NULL DEFAULT '0',
"unit_time" varchar(255) NOT NULL DEFAULT '',
"discount" text,
"replacement" bigint NOT NULL DEFAULT '0',
"inventory" bigint NOT NULL DEFAULT '0',
"traffic" bigint NOT NULL DEFAULT '0',
"speed_limit" bigint NOT NULL DEFAULT '0',
"device_limit" bigint NOT NULL DEFAULT '0',
"quota" bigint NOT NULL DEFAULT '0',
"group_id" bigint DEFAULT NULL,
"server_group" varchar(255) DEFAULT NULL,
"server" varchar(255) DEFAULT NULL,
"show" BOOLEAN NOT NULL DEFAULT false,
"sell" BOOLEAN NOT NULL DEFAULT false,
"sort" bigint NOT NULL DEFAULT '0',
"deduction_ratio" bigint DEFAULT '0',
"allow_deduction" BOOLEAN DEFAULT true,
"reset_cycle" bigint DEFAULT '0',
"renewal_reset" BOOLEAN DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "subscribe_group"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(255) NOT NULL DEFAULT '',
"description" text,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "subscribe_type"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(50) NOT NULL DEFAULT '',
"mark" varchar(255) NOT NULL DEFAULT '',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "system"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"category" varchar(100) NOT NULL DEFAULT '',
"key" varchar(100) NOT NULL DEFAULT '',
"value" text NOT NULL,
"type" varchar(50) NOT NULL DEFAULT '',
"desc" text NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_system_key" UNIQUE ("key")
);
CREATE INDEX IF NOT EXISTS "system_index_key" ON "system" ("key");
CREATE TABLE IF NOT EXISTS "ticket"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"title" varchar(255) NOT NULL DEFAULT '',
"description" text,
"user_id" bigint NOT NULL DEFAULT '0',
"status" SMALLINT NOT NULL DEFAULT '1',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "ticket_follow"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"ticket_id" bigint NOT NULL DEFAULT '0',
"from" varchar(255) NOT NULL DEFAULT '',
"type" SMALLINT NOT NULL DEFAULT '1',
"content" text,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "traffic_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"server_id" bigint NOT NULL,
"user_id" bigint NOT NULL,
"subscribe_id" bigint NOT NULL,
"download" bigint DEFAULT '0',
"upload" bigint DEFAULT '0',
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "traffic_log_idx_subscribe_id" ON "traffic_log" ("subscribe_id");
CREATE INDEX IF NOT EXISTS "traffic_log_idx_server_id" ON "traffic_log" ("server_id");
CREATE INDEX IF NOT EXISTS "traffic_log_idx_user_id" ON "traffic_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"password" varchar(100) NOT NULL,
"avatar" text,
"balance" bigint DEFAULT '0',
"telegram" bigint DEFAULT NULL,
"refer_code" varchar(20) DEFAULT '',
"referer_id" bigint DEFAULT NULL,
"commission" bigint DEFAULT '0',
"gift_amount" bigint DEFAULT '0',
"enable" BOOLEAN NOT NULL DEFAULT true,
"is_admin" BOOLEAN NOT NULL DEFAULT false,
"valid_email" SMALLINT NOT NULL DEFAULT '0',
"enable_email_notify" SMALLINT NOT NULL DEFAULT '0',
"enable_telegram_notify" SMALLINT NOT NULL DEFAULT '0',
"enable_balance_notify" BOOLEAN NOT NULL DEFAULT false,
"enable_login_notify" BOOLEAN NOT NULL DEFAULT false,
"enable_subscribe_notify" BOOLEAN NOT NULL DEFAULT false,
"enable_trade_notify" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
"deleted_at" TIMESTAMP(3) DEFAULT NULL,
"is_del" BIGINT DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_idx_referer" ON "user" ("referer_id");
CREATE TABLE IF NOT EXISTS "user_auth_methods"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"auth_type" varchar(255) NOT NULL,
"auth_identifier" varchar(255) NOT NULL,
"verified" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "idx_auth_identifier" UNIQUE ("auth_identifier")
);
CREATE INDEX IF NOT EXISTS "user_auth_methods_idx_user_id" ON "user_auth_methods" ("user_id");
CREATE TABLE IF NOT EXISTS "user_balance_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"amount" bigint NOT NULL,
"type" SMALLINT NOT NULL,
"order_id" bigint DEFAULT NULL,
"balance" bigint NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_balance_log_idx_user_id" ON "user_balance_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_commission_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"order_no" varchar(191) DEFAULT NULL,
"amount" bigint NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_commission_log_idx_user_id" ON "user_commission_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_device"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"subscribe_id" bigint DEFAULT NULL,
"ip" varchar(191) DEFAULT NULL,
"identifier" varchar(191) DEFAULT NULL,
"user_agent" varchar(64) DEFAULT NULL,
"online" BOOLEAN NOT NULL DEFAULT false,
"enabled" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_device_idx_user_id" ON "user_device" ("user_id");
CREATE TABLE IF NOT EXISTS "user_gift_amount_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"user_subscribe_id" bigint DEFAULT NULL,
"order_no" varchar(191) DEFAULT NULL,
"type" SMALLINT NOT NULL,
"amount" bigint NOT NULL,
"balance" bigint NOT NULL,
"remark" varchar(255) DEFAULT '',
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_gift_amount_log_idx_user_id" ON "user_gift_amount_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_login_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"login_ip" varchar(255) NOT NULL,
"user_agent" text NOT NULL,
"success" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_login_log_idx_user_id" ON "user_login_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_subscribe"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"order_id" bigint NOT NULL,
"subscribe_id" bigint NOT NULL,
"start_time" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
"expire_time" TIMESTAMP(3) DEFAULT NULL,
"traffic" bigint DEFAULT '0',
"download" bigint DEFAULT '0',
"upload" bigint DEFAULT '0',
"token" varchar(255) DEFAULT '',
"uuid" varchar(255) DEFAULT '',
"status" SMALLINT DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_user_subscribe_token" UNIQUE ("token"),
CONSTRAINT "uni_user_subscribe_uuid" UNIQUE ("uuid")
);
CREATE INDEX IF NOT EXISTS "user_subscribe_idx_user_id" ON "user_subscribe" ("user_id");
CREATE INDEX IF NOT EXISTS "user_subscribe_idx_order_id" ON "user_subscribe" ("order_id");
CREATE INDEX IF NOT EXISTS "user_subscribe_idx_subscribe_id" ON "user_subscribe" ("subscribe_id");
CREATE INDEX IF NOT EXISTS "user_subscribe_idx_token" ON "user_subscribe" ("token");
CREATE INDEX IF NOT EXISTS "user_subscribe_idx_uuid" ON "user_subscribe" ("uuid");
CREATE TABLE IF NOT EXISTS "user_subscribe_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"user_subscribe_id" bigint NOT NULL,
"token" varchar(255) NOT NULL,
"ip" varchar(255) NOT NULL,
"user_agent" text NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_subscribe_log_idx_user_id" ON "user_subscribe_log" ("user_id");
CREATE INDEX IF NOT EXISTS "user_subscribe_log_idx_user_subscribe_id" ON "user_subscribe_log" ("user_subscribe_id");
CREATE TABLE IF NOT EXISTS "server_rule_group"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"icon" text,
"tags" text,
"description" varchar(255) DEFAULT '',
"enable" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "unique_name" UNIQUE ("name")
);
-- migrate:down
-- 000001_init_schema.down.sql
DROP TABLE IF EXISTS "user_subscribe_log";
DROP TABLE IF EXISTS "user_subscribe";
DROP TABLE IF EXISTS "user_login_log";
DROP TABLE IF EXISTS "user_gift_amount_log";
DROP TABLE IF EXISTS "user_device";
DROP TABLE IF EXISTS "user_commission_log";
DROP TABLE IF EXISTS "user_balance_log";
DROP TABLE IF EXISTS "user_auth_methods";
DROP TABLE IF EXISTS "user";
DROP TABLE IF EXISTS "traffic_log";
DROP TABLE IF EXISTS "ticket_follow";
DROP TABLE IF EXISTS "ticket";
DROP TABLE IF EXISTS "system";
DROP TABLE IF EXISTS "subscribe_type";
DROP TABLE IF EXISTS "subscribe_group";
DROP TABLE IF EXISTS "subscribe";
DROP TABLE IF EXISTS "sms";
DROP TABLE IF EXISTS "server_rule_group";
DROP TABLE IF EXISTS "server_group";
DROP TABLE IF EXISTS "server";
DROP TABLE IF EXISTS "payment";
DROP TABLE IF EXISTS "order";
DROP TABLE IF EXISTS "message_log";
DROP TABLE IF EXISTS "document";
DROP TABLE IF EXISTS "coupon";
DROP TABLE IF EXISTS "auth_method";
DROP TABLE IF EXISTS "application_version";
DROP TABLE IF EXISTS "application_config";
DROP TABLE IF EXISTS "application";
DROP TABLE IF EXISTS "announcement";
DROP TABLE IF EXISTS "ads";
@@ -0,0 +1,135 @@
-- migrate:up
-- 000002_init_data.up.sql
-- auth_method
INSERT INTO "auth_method" ("id", "method", "config", "enabled", "created_at", "updated_at")
VALUES
(1, 'email', '{"platform":"smtp","platform_config":{"host":"","port":0,"user":"","pass":"","from":"","ssl":false},"enable_verify":false,"enable_notify":false,"enable_domain_suffix":false,"domain_suffix_list":"","verify_email_template":"","expiration_email_template":"","maintenance_email_template":"","traffic_exceed_email_template":""}', true, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(2, 'mobile', '{"platform":"AlibabaCloud","platform_config":{"access":"","secret":"","sign_name":"","endpoint":"","template_code":""},"enable_whitelist":false,"whitelist":[]}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(3, 'apple', '{"team_id":"","key_id":"","client_id":"","client_secret":"","redirect_url":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(4, 'google', '{"client_id":"","client_secret":"","redirect_url":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(5, 'github', '{"client_id":"","client_secret":"","redirect_url":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(6, 'facebook', '{"client_id":"","client_secret":"","redirect_url":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(7, 'telegram', '{"bot_token":"","enable_notify":false,"webhook_domain":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642'),
(8, 'device', '{"show_ads":false,"only_real_device":false,"enable_security":false,"security_secret":""}', false, '2025-04-22 14:25:16.642', '2025-04-22 14:25:16.642');
-- payment
INSERT INTO "payment" ("id", "name", "platform", "description", "icon", "domain", "config", "fee_mode",
"fee_percent", "fee_amount", "enable", "token")
VALUES
(-1, 'Balance', 'balance', '', '', '', '', 0, 0, 0, true, '');
-- subscribe_type
INSERT INTO "subscribe_type" ("id", "name", "mark", "created_at", "updated_at")
VALUES (1, 'Clash', 'Clash', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(2, 'Hiddify', 'Hiddify', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(3, 'Loon', 'Loon', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(4, 'NekoBox', 'NekoBox', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(5, 'NekoRay', 'NekoRay', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(6, 'Netch', 'Netch', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(7, 'Quantumult', 'Quantumult', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(8, 'Shadowrocket', 'Shadowrocket', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(9, 'SingBox', ' SingBox', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(10, 'Surfboard', 'Surfboard', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(11, 'Surge', 'Surge', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(12, 'V2box', 'V2box', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(13, 'V2rayN', 'V2rayN', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648'),
(14, 'V2rayNg', 'V2rayNg', '2025-04-22 14:25:16.648', '2025-04-22 14:25:16.648');
-- system
INSERT INTO "system" ("id", "category", "key", "value", "type", "desc", "created_at", "updated_at")
VALUES (1, 'site', 'SiteLogo', '/favicon.svg', 'string', 'Site Logo', '2025-04-22 14:25:16.637',
'2025-04-22 14:25:16.637'),
(2, 'site', 'SiteName', 'Perfect Panel', 'string', 'Site Name', '2025-04-22 14:25:16.637',
'2025-04-22 14:25:16.637'),
(3, 'site', 'SiteDesc',
'PPanel is a pure, professional, and perfect open-source proxy panel tool, designed to be your ideal choice for learning and practical use.',
'string', 'Site Description', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
(4, 'site', 'Host', '', 'string', 'Site Host', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
(5, 'site', 'Keywords', 'Perfect Panel,PPanel', 'string', 'Site Keywords', '2025-04-22 14:25:16.637',
'2025-04-22 14:25:16.637'),
(6, 'site', 'CustomHTML', '', 'string', 'Custom HTML', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
(7, 'tos', 'TosContent', 'Welcome to use Perfect Panel', 'string', 'Terms of Service', '2025-04-22 14:25:16.637',
'2025-04-22 14:25:16.637'),
(8, 'tos', 'PrivacyPolicy', '', 'string', 'PrivacyPolicy', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
(9, 'ad', 'WebAD', 'false', 'bool', 'Display ad on the web', '2025-04-22 14:25:16.637',
'2025-04-22 14:25:16.637'),
(10, 'subscribe', 'SingleModel', 'false', 'bool', '是否单订阅模式', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(11, 'subscribe', 'SubscribePath', '/api/subscribe', 'string', '订阅路径', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(12, 'subscribe', 'SubscribeDomain', '', 'string', '订阅域名', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(13, 'subscribe', 'PanDomain', 'false', 'bool', '是否使用泛域名', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(14, 'verify', 'TurnstileSiteKey', '', 'string', 'TurnstileSiteKey', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(15, 'verify', 'TurnstileSecret', '', 'string', 'TurnstileSecret', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(16, 'verify', 'EnableLoginVerify', 'false', 'bool', 'is enable login verify', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(17, 'verify', 'EnableRegisterVerify', 'false', 'bool', 'is enable register verify', '2025-04-22 14:25:16.639',
'2025-04-22 14:25:16.639'),
(18, 'verify', 'EnableResetPasswordVerify', 'false', 'bool', 'is enable reset password verify',
'2025-04-22 14:25:16.639', '2025-04-22 14:25:16.639'),
(19, 'server', 'NodeSecret', '12345678', 'string', 'node secret', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(20, 'server', 'NodePullInterval', '10', 'int', 'node pull interval', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(21, 'server', 'NodePushInterval', '60', 'int', 'node push interval', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(22, 'server', 'NodeMultiplierConfig', '[]', 'string', 'node multiplier config', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(23, 'invite', 'ForcedInvite', 'false', 'bool', 'Forced invite', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(24, 'invite', 'ReferralPercentage', '20', 'int', 'Referral percentage', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(25, 'invite', 'OnlyFirstPurchase', 'false', 'bool', 'Only first purchase', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(26, 'register', 'StopRegister', 'false', 'bool', 'is stop register', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(27, 'register', 'EnableTrial', 'false', 'bool', 'is enable trial', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(28, 'register', 'TrialSubscribe', '', 'int', 'Trial subscription', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(29, 'register', 'TrialTime', '24', 'int', 'Trial time', '2025-04-22 14:25:16.640', '2025-04-22 14:25:16.640'),
(30, 'register', 'TrialTimeUnit', 'Hour', 'string', 'Trial time unit', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(31, 'register', 'EnableIpRegisterLimit', 'false', 'bool', 'is enable IP register limit',
'2025-04-22 14:25:16.640', '2025-04-22 14:25:16.640'),
(32, 'register', 'IpRegisterLimit', '3', 'int', 'IP Register Limit', '2025-04-22 14:25:16.640',
'2025-04-22 14:25:16.640'),
(33, 'register', 'IpRegisterLimitDuration', '64', 'int', 'IP Register Limit Duration (minutes)',
'2025-04-22 14:25:16.640', '2025-04-22 14:25:16.640'),
(34, 'currency', 'Currency', 'USD', 'string', 'Currency', '2025-04-22 14:25:16.641', '2025-04-22 14:25:16.641'),
(35, 'currency', 'CurrencySymbol', '$', 'string', 'Currency Symbol', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(36, 'currency', 'CurrencyUnit', 'USD', 'string', 'Currency Unit', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(37, 'currency', 'AccessKey', '', 'string', 'Exchangerate Access Key', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(38, 'verify_code', 'VerifyCodeExpireTime', '300', 'int', 'Verify code expire time', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(39, 'verify_code', 'VerifyCodeLimit', '15', 'int', 'limits of verify code', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(40, 'verify_code', 'VerifyCodeInterval', '60', 'int', 'Interval of verify code', '2025-04-22 14:25:16.641',
'2025-04-22 14:25:16.641'),
(41, 'system', 'Version', '0.2.0(02002)', 'string', 'System Version', '2025-04-22 14:25:16.642',
'2025-04-22 14:25:16.642');
SELECT setval(pg_get_serial_sequence('"auth_method"', 'id'), COALESCE((SELECT MAX("id") FROM "auth_method"), 1), true);
SELECT setval(pg_get_serial_sequence('"subscribe_type"', 'id'), COALESCE((SELECT MAX("id") FROM "subscribe_type"), 1), true);
SELECT setval(pg_get_serial_sequence('"system"', 'id'), COALESCE((SELECT MAX("id") FROM "system"), 1), true);
-- migrate:down
-- 000002_init_data.down.sql
DELETE
FROM "auth_method"
WHERE "id" IN (1, 2, 3, 4, 5, 6, 7, 8);
DELETE
FROM "payment"
WHERE "id" = -1;
DELETE
FROM "subscribe_type"
WHERE "id" IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
DELETE
FROM "system"
WHERE "id" IN
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41);
@@ -0,0 +1,15 @@
-- migrate:up
-- PostgreSQL version of payment/order compatibility migration.
ALTER TABLE "order" ADD COLUMN IF NOT EXISTS "payment_id" BIGINT NOT NULL DEFAULT -1;
ALTER TABLE "payment" ADD COLUMN IF NOT EXISTS "platform" VARCHAR(100) NOT NULL DEFAULT '';
ALTER TABLE "payment" DROP COLUMN IF EXISTS "mark";
ALTER TABLE "payment" ADD COLUMN IF NOT EXISTS "description" TEXT;
ALTER TABLE "payment" ADD COLUMN IF NOT EXISTS "token" VARCHAR(255) DEFAULT NULL;
-- migrate:down
ALTER TABLE "order" DROP COLUMN IF EXISTS "payment_id";
ALTER TABLE "payment" DROP COLUMN IF EXISTS "platform";
ALTER TABLE "payment" DROP COLUMN IF EXISTS "description";
ALTER TABLE "payment" DROP COLUMN IF EXISTS "token";
ALTER TABLE "payment" ADD COLUMN IF NOT EXISTS "mark" VARCHAR(255) DEFAULT NULL;
@@ -0,0 +1,27 @@
-- migrate:up
-- migrations/02003_rebuild_rule.up.sql
-- Purpose: rebuilding server rule table
-- Author: PPanel Team, 2025-04-21
DROP TABLE IF EXISTS "server_rule_group";
CREATE TABLE "server_rule_group"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" VARCHAR(64) NOT NULL DEFAULT '',
"icon" VARCHAR(255),
"tags" TEXT,
"rules" TEXT,
"enable" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3),
"updated_at" TIMESTAMP(3),
PRIMARY KEY ("id"),
CONSTRAINT "uni_server_rule_group_name" UNIQUE ("name")
);
CREATE INDEX IF NOT EXISTS "server_rule_group_idx_enable" ON "server_rule_group" ("enable");
-- migrate:down
-- migrations/02003_rebuild_rule.up.sql
-- Purpose: Back rebuilding server rule table
-- Author: PPanel Team, 2025-04-21
DROP TABLE IF EXISTS server_rule_group;
@@ -0,0 +1,23 @@
-- migrate:up
CREATE TABLE IF NOT EXISTS "user_device_online_record"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"user_id" BIGINT NOT NULL,
"identifier" VARCHAR(255) NOT NULL,
"online_time" TIMESTAMP,
"offline_time" TIMESTAMP,
"online_seconds" BIGINT,
"duration_days" BIGINT,
"created_at" TIMESTAMP
);
ALTER TABLE "user_subscribe" ADD COLUMN IF NOT EXISTS "finished_at" TIMESTAMP NULL;
ALTER TABLE "application_config" ADD COLUMN IF NOT EXISTS "invitation_link" TEXT NULL DEFAULT NULL;
ALTER TABLE "application_config" ADD COLUMN IF NOT EXISTS "kr_website_id" VARCHAR(255) NULL DEFAULT NULL;
-- migrate:down
DROP TABLE IF EXISTS "user_device_online_record";
ALTER TABLE "user_subscribe" DROP COLUMN IF EXISTS "finished_at";
ALTER TABLE "application_config" DROP COLUMN IF EXISTS "invitation_link";
ALTER TABLE "application_config" DROP COLUMN IF EXISTS "kr_website_id";
@@ -0,0 +1,24 @@
-- migrate:up
-- migrations/02008_create_user_reset_subscribe_log.up.sql
-- Purpose: Create user_reset_subscribe_log table
-- Author: PPanel Team, 2025-04-22
CREATE TABLE IF NOT EXISTS "user_reset_subscribe_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
"user_id" BIGINT NOT NULL,
"type" SMALLINT NOT NULL,
"order_no" VARCHAR(255) DEFAULT NULL,
"user_subscribe_id" BIGINT NOT NULL,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS "user_reset_subscribe_log_idx_user_id" ON "user_reset_subscribe_log" ("user_id");
CREATE INDEX IF NOT EXISTS "user_reset_subscribe_log_idx_user_subscribe_id" ON "user_reset_subscribe_log" ("user_subscribe_id");
-- migrate:down
-- migrations/02008_create_user_reset_subscribe_log.down.sql
-- Purpose: Drop user_reset_subscribe_log table
-- Author: PPanel Team, 2025-04-22
DROP TABLE IF EXISTS "user_reset_subscribe_log";
+10
View File
@@ -0,0 +1,10 @@
-- migrate:up
ALTER TABLE "server_rule_group"
ADD COLUMN "default" BOOLEAN NOT NULL DEFAULT false,
ADD COLUMN "type" VARCHAR(100) NOT NULL DEFAULT '';
-- migrate:down
ALTER TABLE "server_rule_group"
DROP COLUMN "default",
DROP COLUMN "type";
+26
View File
@@ -0,0 +1,26 @@
-- migrate:up
DROP TABLE IF EXISTS "email_task";
CREATE TABLE "email_task" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"subject" varchar(255) NOT NULL,
"content" text NOT NULL,
"recipient" text NOT NULL,
"scope" varchar(50) NOT NULL,
"register_start_time" TIMESTAMP(3) DEFAULT NULL,
"register_end_time" TIMESTAMP(3) DEFAULT NULL,
"additional" text,
"scheduled" TIMESTAMP(3) NOT NULL,
"interval" SMALLINT NOT NULL,
"limit" BIGINT NOT NULL,
"status" SMALLINT NOT NULL,
"errors" text NOT NULL,
"total" BIGINT NOT NULL DEFAULT '0',
"current" BIGINT NOT NULL DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
-- migrate:down
DROP TABLE IF EXISTS "email_task";
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
-- migrate:up
INSERT INTO "system" ("id", "category", "key", "value", "type", "desc", "created_at", "updated_at")
VALUES
(42, 'subscribe', 'UserAgentLimit', 'false', 'bool', 'User Agent Limit', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
(43, 'subscribe', 'UserAgentList', '', 'string', 'User Agent List', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637') ON CONFLICT DO NOTHING;
SELECT setval(pg_get_serial_sequence('"system"', 'id'), COALESCE((SELECT MAX("id") FROM "system"), 1), true);
-- migrate:down
@@ -0,0 +1,7 @@
-- migrate:up
DROP TABLE IF EXISTS "application";
DROP TABLE IF EXISTS "application_version";
DROP TABLE IF EXISTS "application_config";
-- migrate:down
+108
View File
@@ -0,0 +1,108 @@
-- migrate:up
DROP TABLE IF EXISTS "user_balance_log";
DROP TABLE IF EXISTS "user_commission_log";
DROP TABLE IF EXISTS "user_gift_amount_log";
DROP TABLE IF EXISTS "user_login_log";
DROP TABLE IF EXISTS "user_reset_subscribe_log";
DROP TABLE IF EXISTS "user_subscribe_log";
DROP TABLE IF EXISTS "message_log";
DROP TABLE IF EXISTS "system_logs";
CREATE TABLE "system_logs" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"type" SMALLINT NOT NULL DEFAULT '0',
"date" varchar(20) DEFAULT NULL,
"object_id" bigint NOT NULL DEFAULT '0',
"content" text NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "system_logs_idx_type" ON "system_logs" ("type");
CREATE INDEX IF NOT EXISTS "system_logs_idx_object_id" ON "system_logs" ("object_id");
-- migrate:down
CREATE TABLE IF NOT EXISTS "user_balance_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"amount" bigint NOT NULL,
"type" SMALLINT NOT NULL,
"order_id" bigint DEFAULT NULL,
"balance" bigint NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_balance_log_idx_user_id" ON "user_balance_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_commission_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"order_no" varchar(191) DEFAULT NULL,
"amount" bigint NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_commission_log_idx_user_id" ON "user_commission_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_gift_amount_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"user_subscribe_id" bigint DEFAULT NULL,
"order_no" varchar(191) DEFAULT NULL,
"type" SMALLINT NOT NULL,
"amount" bigint NOT NULL,
"balance" bigint NOT NULL,
"remark" varchar(255) DEFAULT '',
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_gift_amount_log_idx_user_id" ON "user_gift_amount_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_login_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"login_ip" varchar(255) NOT NULL,
"user_agent" text NOT NULL,
"success" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_login_log_idx_user_id" ON "user_login_log" ("user_id");
CREATE TABLE IF NOT EXISTS "user_reset_subscribe_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
"user_id" BIGINT NOT NULL,
"type" SMALLINT NOT NULL,
"order_no" VARCHAR(255) DEFAULT NULL,
"user_subscribe_id" BIGINT NOT NULL,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS "user_reset_subscribe_log_idx_user_id" ON "user_reset_subscribe_log" ("user_id");
CREATE INDEX IF NOT EXISTS "user_reset_subscribe_log_idx_user_subscribe_id" ON "user_reset_subscribe_log" ("user_subscribe_id");
CREATE TABLE IF NOT EXISTS "user_subscribe_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" bigint NOT NULL,
"user_subscribe_id" bigint NOT NULL,
"token" varchar(255) NOT NULL,
"ip" varchar(255) NOT NULL,
"user_agent" text NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "user_subscribe_log_idx_user_id" ON "user_subscribe_log" ("user_id");
CREATE INDEX IF NOT EXISTS "user_subscribe_log_idx_user_subscribe_id" ON "user_subscribe_log" ("user_subscribe_id");
CREATE TABLE IF NOT EXISTS "message_log"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"type" varchar(50) NOT NULL DEFAULT 'email',
"platform" varchar(50) NOT NULL DEFAULT 'smtp',
"to" text NOT NULL,
"subject" varchar(255) NOT NULL DEFAULT '',
"content" text,
"status" SMALLINT NOT NULL DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
DROP TABLE IF EXISTS "system_logs";
+33
View File
@@ -0,0 +1,33 @@
-- migrate:up
CREATE TABLE IF NOT EXISTS "servers" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"country" varchar(128) NOT NULL DEFAULT '',
"city" varchar(128) NOT NULL DEFAULT '',
"ratio" decimal(4,2) NOT NULL DEFAULT '0.00',
"address" varchar(100) NOT NULL DEFAULT '',
"sort" bigint NOT NULL DEFAULT '0',
"protocols" text,
"last_reported_at" TIMESTAMP(3) DEFAULT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "nodes" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"tags" varchar(255) NOT NULL DEFAULT '',
"port" INTEGER NOT NULL DEFAULT '0',
"address" varchar(255) NOT NULL DEFAULT '',
"server_id" bigint NOT NULL DEFAULT '0',
"protocol" varchar(100) NOT NULL DEFAULT '',
"enabled" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
-- migrate:down
DROP TABLE IF EXISTS "nodes";
DROP TABLE IF EXISTS "servers";
+15
View File
@@ -0,0 +1,15 @@
-- migrate:up
ALTER TABLE "subscribe"
ADD COLUMN "nodes" VARCHAR(255) NOT NULL DEFAULT '' ,
ADD COLUMN "node_tags" VARCHAR(255) NOT NULL DEFAULT '' ,
DROP COLUMN "server",
DROP COLUMN "server_group";
DROP TABLE IF EXISTS "server_rule_group";
-- migrate:down
ALTER TABLE "subscribe"
DROP COLUMN "nodes",
DROP COLUMN "node_tags",
ADD COLUMN "server" VARCHAR(255) NOT NULL DEFAULT '' ,
ADD COLUMN "server_group" VARCHAR(255) NOT NULL DEFAULT '';
@@ -0,0 +1,8 @@
-- migrate:up
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
VALUES
('log', 'AutoClear', 'true', 'bool', 'Auto Clear Log', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637'),
('log', 'ClearDays', '7', 'int', 'Clear Days', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637') ON CONFLICT DO NOTHING;
-- migrate:down
@@ -0,0 +1,10 @@
-- migrate:up
ALTER TABLE "user"
ADD COLUMN "referral_percentage" SMALLINT NOT NULL DEFAULT 0,
ADD COLUMN "only_first_purchase" BOOLEAN NOT NULL DEFAULT true;
-- migrate:down
ALTER TABLE "user"
DROP COLUMN "referral_percentage",
DROP COLUMN "only_first_purchase";
+8
View File
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "nodes"
ADD COLUMN "sort" INTEGER NOT NULL DEFAULT 0;
-- migrate:down
ALTER TABLE "nodes"
DROP COLUMN "sort";
@@ -0,0 +1,6 @@
-- migrate:up
CREATE INDEX idx_traffic_log_time_user_sub ON traffic_log (timestamp, user_id, subscribe_id);
-- migrate:down
DROP INDEX IF EXISTS "idx_traffic_log_time_user_sub";
@@ -0,0 +1,8 @@
-- migrate:up
DROP TABLE IF EXISTS "subscribe_type";
DROP TABLE IF EXISTS "sms";
-- migrate:down
DROP TABLE IF EXISTS "subscribe_type";
DROP TABLE IF EXISTS "sms";
+8
View File
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "subscribe"
DROP COLUMN "group_id",
ADD COLUMN "language" VARCHAR(255) NOT NULL DEFAULT '';
DROP TABLE IF EXISTS "subscribe_group";
-- migrate:down
+18
View File
@@ -0,0 +1,18 @@
-- migrate:up
DROP TABLE IF EXISTS "email_task";
CREATE TABLE "task" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"type" SMALLINT NOT NULL,
"scope" text,
"content" text,
"status" SMALLINT NOT NULL DEFAULT '0',
"errors" text,
"total" BIGINT NOT NULL DEFAULT '0',
"current" BIGINT NOT NULL DEFAULT '0',
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
-- migrate:down
+10
View File
@@ -0,0 +1,10 @@
-- migrate:up
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
VALUES ('server', 'TrafficReportThreshold', '0', 'int', 'Traffic report threshold', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637'),
('server', 'IPStrategy', '', 'string', 'IP Strategy', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637'),
('server', 'DNS', '', 'string', 'DNS', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637'),
('server', 'Block', '', 'string', 'Block', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637'),
('server', 'Outbound', '', 'string', 'Proxy Outbound', '2025-04-22 14:25:16.637','2025-04-22 14:25:16.637') ON CONFLICT DO NOTHING;
-- migrate:down
+5
View File
@@ -0,0 +1,5 @@
-- migrate:up
ALTER TABLE "ads" ADD COLUMN IF NOT EXISTS "description" VARCHAR(255) DEFAULT '';
-- migrate:down
+8
View File
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "user" ADD COLUMN IF NOT EXISTS "algo" VARCHAR(20) NOT NULL DEFAULT 'default';
ALTER TABLE "user" ADD COLUMN IF NOT EXISTS "salt" VARCHAR(20) NOT NULL DEFAULT 'default';
-- migrate:down
ALTER TABLE "user" DROP COLUMN IF EXISTS "algo";
ALTER TABLE "user" DROP COLUMN IF EXISTS "salt";
@@ -0,0 +1,18 @@
-- migrate:up
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
SELECT 'site', 'CustomData', '{
"kr_website_id": ""
}', 'string', 'Custom Data', '2025-04-22 14:25:16.637', '2025-10-14 15:47:19.187'
WHERE NOT EXISTS (
SELECT 1 FROM "system" WHERE "category" = 'site' AND "key" = 'CustomData'
);
-- migrate:down
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
SELECT 'site', 'CustomData', '{
"kr_website_id": ""
}', 'string', 'Custom Data', '2025-04-22 14:25:16.637', '2025-10-14 15:47:19.187'
WHERE NOT EXISTS (
SELECT 1 FROM "system" WHERE "category" = 'site' AND "key" = 'CustomData'
);
@@ -0,0 +1,6 @@
-- migrate:up
CREATE INDEX IF NOT EXISTS "idx_timestamp" ON "traffic_log" ("timestamp");
-- migrate:down
DROP INDEX IF EXISTS "idx_timestamp";
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "user_subscribe"
ADD COLUMN "note" VARCHAR(500) NOT NULL DEFAULT '';
-- migrate:down
ALTER TABLE "user_subscribe"
DROP COLUMN "note";
+8
View File
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "user"
ADD COLUMN "rules" TEXT NULL;
-- migrate:down
ALTER TABLE "user"
DROP COLUMN IF EXISTS "rules";
@@ -0,0 +1,23 @@
-- migrate:up
CREATE TABLE IF NOT EXISTS "withdrawals" (
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"user_id" BIGINT NOT NULL,
"amount" BIGINT NOT NULL,
"content" TEXT,
"status" SMALLINT NOT NULL DEFAULT 0,
"reason" VARCHAR(500) NOT NULL DEFAULT '',
"created_at" TIMESTAMP NOT NULL,
"updated_at" TIMESTAMP NOT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "withdrawals_idx_user_id" ON "withdrawals" ("user_id");
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
VALUES
('invite', 'WithdrawalMethod', '', 'string', 'withdrawal method', '2025-04-22 14:25:16.637', '2025-04-22 14:25:16.637') ON CONFLICT DO NOTHING;
-- migrate:down
DROP TABLE IF EXISTS "withdrawals";
DELETE FROM "system"
WHERE "category" = 'invite'
AND "key" = 'WithdrawalMethod';
+30
View File
@@ -0,0 +1,30 @@
-- migrate:up
DROP TABLE IF EXISTS "server";
-- migrate:down
CREATE TABLE IF NOT EXISTS "server"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"name" varchar(100) NOT NULL DEFAULT '',
"tags" varchar(128) NOT NULL DEFAULT '',
"country" varchar(128) NOT NULL DEFAULT '',
"city" varchar(128) NOT NULL DEFAULT '',
"latitude" varchar(128) NOT NULL DEFAULT '',
"longitude" varchar(128) NOT NULL DEFAULT '',
"server_addr" varchar(100) NOT NULL DEFAULT '',
"relay_mode" varchar(20) NOT NULL DEFAULT 'none',
"relay_node" text,
"speed_limit" bigint NOT NULL DEFAULT '0',
"traffic_ratio" decimal(4, 2) NOT NULL DEFAULT '0.00',
"group_id" bigint DEFAULT NULL,
"protocol" varchar(20) NOT NULL DEFAULT '',
"config" text,
"enable" SMALLINT NOT NULL DEFAULT '1',
"sort" bigint NOT NULL DEFAULT '0',
"last_reported_at" TIMESTAMP(3) DEFAULT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "server_idx_group_id" ON "server" ("group_id");
@@ -0,0 +1,8 @@
-- migrate:up
ALTER TABLE "subscribe"
ADD COLUMN "show_original_price" BOOLEAN NOT NULL DEFAULT false;
-- migrate:down
ALTER TABLE "subscribe"
DROP COLUMN "show_original_price";
@@ -0,0 +1,5 @@
-- migrate:up
DROP TABLE IF EXISTS "server_group";
-- migrate:down
@@ -0,0 +1,12 @@
-- migrate:up
-- Update the "subscribe" table to set "inventory" to -1 where it is currently 0
UPDATE "subscribe"
SET "inventory" = -1
WHERE "inventory" = 0;
-- migrate:down
-- This migration script reverts the inventory values in the 'subscribe' table
UPDATE "subscribe"
SET "inventory" = 0
WHERE "inventory" = -1;
@@ -0,0 +1,6 @@
-- migrate:up
CREATE INDEX idx_type_date ON system_logs (type, date);
-- migrate:down
DROP INDEX IF EXISTS "idx_type_date";
@@ -0,0 +1,64 @@
-- migrate:up
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX IF NOT EXISTS "idx_order_order_no_pattern" ON "order" ("order_no" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_order_trade_no_pattern" ON "order" ("trade_no" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_order_coupon_pattern" ON "order" ("coupon" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_user_refer_code_pattern" ON "user" ("refer_code" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_user_auth_identifier_pattern" ON "user_auth_methods" ("auth_identifier" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_coupon_name_pattern" ON "coupon" ("name" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_coupon_code_pattern" ON "coupon" ("code" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_payment_name_pattern" ON "payment" ("name" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_servers_name_pattern" ON "servers" ("name" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_servers_address_pattern" ON "servers" ("address" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_nodes_name_pattern" ON "nodes" ("name" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_nodes_address_pattern" ON "nodes" ("address" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_nodes_tags_pattern" ON "nodes" ("tags" text_pattern_ops);
CREATE INDEX IF NOT EXISTS "idx_nodes_port" ON "nodes" ("port");
CREATE INDEX IF NOT EXISTS "idx_ads_title_trgm" ON "ads" USING GIN ("title" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_ads_content_trgm" ON "ads" USING GIN ("content" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_announcement_title_trgm" ON "announcement" USING GIN ("title" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_announcement_content_trgm" ON "announcement" USING GIN ("content" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_document_title_trgm" ON "document" USING GIN ("title" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_document_content_trgm" ON "document" USING GIN ("content" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_subscribe_name_trgm" ON "subscribe" USING GIN ("name" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_subscribe_description_trgm" ON "subscribe" USING GIN ("description" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_ticket_title_trgm" ON "ticket" USING GIN ("title" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_ticket_description_trgm" ON "ticket" USING GIN ("description" gin_trgm_ops);
CREATE INDEX IF NOT EXISTS "idx_system_logs_content_trgm" ON "system_logs" USING GIN ("content" gin_trgm_ops);
-- migrate:down
DROP INDEX IF EXISTS "idx_system_logs_content_trgm";
DROP INDEX IF EXISTS "idx_ticket_description_trgm";
DROP INDEX IF EXISTS "idx_ticket_title_trgm";
DROP INDEX IF EXISTS "idx_subscribe_description_trgm";
DROP INDEX IF EXISTS "idx_subscribe_name_trgm";
DROP INDEX IF EXISTS "idx_document_content_trgm";
DROP INDEX IF EXISTS "idx_document_title_trgm";
DROP INDEX IF EXISTS "idx_announcement_content_trgm";
DROP INDEX IF EXISTS "idx_announcement_title_trgm";
DROP INDEX IF EXISTS "idx_ads_content_trgm";
DROP INDEX IF EXISTS "idx_ads_title_trgm";
DROP INDEX IF EXISTS "idx_nodes_port";
DROP INDEX IF EXISTS "idx_nodes_tags_pattern";
DROP INDEX IF EXISTS "idx_nodes_address_pattern";
DROP INDEX IF EXISTS "idx_nodes_name_pattern";
DROP INDEX IF EXISTS "idx_servers_address_pattern";
DROP INDEX IF EXISTS "idx_servers_name_pattern";
DROP INDEX IF EXISTS "idx_payment_name_pattern";
DROP INDEX IF EXISTS "idx_coupon_code_pattern";
DROP INDEX IF EXISTS "idx_coupon_name_pattern";
DROP INDEX IF EXISTS "idx_user_auth_identifier_pattern";
DROP INDEX IF EXISTS "idx_user_refer_code_pattern";
DROP INDEX IF EXISTS "idx_order_coupon_pattern";
DROP INDEX IF EXISTS "idx_order_trade_no_pattern";
DROP INDEX IF EXISTS "idx_order_order_no_pattern";
@@ -0,0 +1,18 @@
-- migrate:up
CREATE TABLE IF NOT EXISTS "server_config_overrides"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
"server_id" bigint NOT NULL,
"ip_strategy" varchar(32) DEFAULT NULL,
"dns" text DEFAULT NULL,
"block" text DEFAULT NULL,
"outbound" text DEFAULT NULL,
"created_at" TIMESTAMP(3) DEFAULT NULL,
"updated_at" TIMESTAMP(3) DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "uni_server_config_overrides_server_id" UNIQUE ("server_id")
);
-- migrate:down
DROP TABLE IF EXISTS "server_config_overrides";
@@ -0,0 +1,12 @@
-- migrate:up
ALTER TABLE "payment"
ADD COLUMN IF NOT EXISTS "sort" bigint NOT NULL DEFAULT 0;
UPDATE "payment"
SET "sort" = "id"
WHERE "sort" = 0;
-- migrate:down
ALTER TABLE "payment"
DROP COLUMN IF EXISTS "sort";
@@ -0,0 +1,10 @@
-- migrate:up
INSERT INTO "system" ("category", "key", "value", "type", "desc", "created_at", "updated_at")
SELECT 'subscribe', 'ShowTutorial', 'true', 'bool', 'Show tutorial section on the user document page', '2025-04-22 14:25:16.639', '2025-04-22 14:25:16.639'
WHERE NOT EXISTS (
SELECT 1 FROM "system" WHERE "category" = 'subscribe' AND "key" = 'ShowTutorial'
);
-- migrate:down
DELETE FROM "system" WHERE "category" = 'subscribe' AND "key" = 'ShowTutorial';
@@ -0,0 +1,10 @@
-- migrate:up
ALTER TABLE "servers"
ALTER COLUMN "last_reported_at" TYPE timestamptz
USING "last_reported_at" AT TIME ZONE 'UTC';
-- migrate:down
ALTER TABLE "servers"
ALTER COLUMN "last_reported_at" TYPE timestamp(3)
USING "last_reported_at" AT TIME ZONE 'UTC';