Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,24 @@ AUTO_MIGRATE=true
# 数据库连接字符串(仅用于本地开发或非 Docker Compose 部署)
DSN="postgres://user:password@host:port/db_name"

# PostgreSQL 连接池配置(postgres.js)
# 说明:
# - 这些值是“每个应用进程”的连接池上限;k8s 多副本时需要按副本数分摊
# - 默认值:生产环境 20,开发环境 10(可按需覆盖)
DB_POOL_MAX=20
DB_POOL_IDLE_TIMEOUT=20 # 空闲连接回收(秒)
DB_POOL_CONNECT_TIMEOUT=10 # 建立连接超时(秒)

# message_request 写入模式
# - async:异步批量写入(默认,降低 DB 写放大与连接占用)
# - sync:同步写入(兼容旧行为,但高并发下会增加请求尾部阻塞)
MESSAGE_REQUEST_WRITE_MODE=async

# message_request 异步批量参数(可选)
MESSAGE_REQUEST_ASYNC_FLUSH_INTERVAL_MS=250
MESSAGE_REQUEST_ASYNC_BATCH_SIZE=200
MESSAGE_REQUEST_ASYNC_MAX_PENDING=5000

# 数据库配置(Docker Compose 部署时使用)
DB_USER=postgres
DB_PASSWORD=your-secure-password_change-me
Expand Down
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,33 @@

---

## [v0.3.40](https://github.com/ding113/claude-code-hub/releases/tag/v0.3.40) - 2026-01-01

### 新增

- 供应商模型动态获取功能,支持从上游 API 动态获取允许的模型列表 (#491) [@NieiR](https://github.com/NieiR)
- Redis Pub/Sub 缓存失效通知机制,实现多实例间缓存同步 (#493)
- RPM 限流管理功能,支持每分钟请求数限制配置 (#499)

### 优化

- 供应商故障阈值配置优化,允许 failureThreshold 设置为 0 或超过 100 (#498) [@Tethys Plex](https://github.com/Privnode-HQ)
- Session 详情记录增强,补全请求和响应的完整 payload (#495)
- 排行榜输出速率计算优化,修复除以过小值导致的异常 (#497) [@NieiR](https://github.com/NieiR)
- 客户端模式匹配规范化,统一处理连字符和下划线 (c79b87c)

### 修复

- 修复 E2E 测试中 RPM 验证的测试用例 (ca0ada4)
- 移除新建用户时的默认限额配置,提供更清晰的配置体验 (#499)

### 其他

- 多语言翻译更新(英语/日语/俄语/简体中文/繁体中文)
- 代码格式化和 Biome lint 修复

---

## [v0.3.39](https://github.com/ding113/claude-code-hub/releases/tag/v0.3.39) - 2025-12-31

### 新增
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,13 @@ Docker Compose 是**首选部署方式**,自动配置数据库、Redis 和应
| ------------------------------------------ | ------------------------ | ---------------------------------------------------------------------------- |
| `ADMIN_TOKEN` | `change-me` | 后台登录令牌,部署前必须修改。 |
| `DSN` | - | PostgreSQL 连接串,如 `postgres://user:pass@host:5432/db`. |
| `DB_POOL_MAX` | 生产环境 `20` / 开发 `10` | PostgreSQL 连接池上限(每进程);高并发可提高,k8s 多副本需结合 `max_connections` 分摊。 |
| `DB_POOL_IDLE_TIMEOUT` | `20` | 空闲连接回收(秒);避免连接长期占用。 |
| `DB_POOL_CONNECT_TIMEOUT` | `10` | 建立连接超时(秒);避免网络异常时卡住连接获取。 |
| `MESSAGE_REQUEST_WRITE_MODE` | `async` | 请求日志写入模式:`async` 异步批量(默认);`sync` 同步写入(更实时但更慢)。 |
| `MESSAGE_REQUEST_ASYNC_FLUSH_INTERVAL_MS` | `250` | 异步批量写入 flush 间隔(毫秒)。 |
| `MESSAGE_REQUEST_ASYNC_BATCH_SIZE` | `200` | 单次批量写入最大条数(避免单条 SQL 过大)。 |
| `MESSAGE_REQUEST_ASYNC_MAX_PENDING` | `5000` | 内存队列上限(防止 DB 异常时无限增长;超限将丢弃最旧更新并告警)。 |
| `AUTO_MIGRATE` | `true` | 启动时自动执行 Drizzle 迁移;生产环境可关闭以人工控制。 |
| `REDIS_URL` | `redis://localhost:6379` | Redis 地址,支持 `rediss://` 用于 TLS。 |
| `REDIS_TLS_REJECT_UNAUTHORIZED` | `true` | 是否验证 Redis TLS 证书;设为 `false` 可跳过验证(用于自签/共享证书)。 |
Expand Down
53 changes: 53 additions & 0 deletions drizzle/0043_faithful_mother_askani.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
DO $$ BEGIN
CREATE TYPE "public"."notification_type" AS ENUM('circuit_breaker', 'daily_leaderboard', 'cost_alert');
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
DO $$ BEGIN
CREATE TYPE "public"."webhook_provider_type" AS ENUM('wechat', 'feishu', 'dingtalk', 'telegram', 'custom');
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "notification_target_bindings" (
"id" serial PRIMARY KEY NOT NULL,
"notification_type" "notification_type" NOT NULL,
"target_id" integer NOT NULL,
"is_enabled" boolean DEFAULT true NOT NULL,
"schedule_cron" varchar(100),
"schedule_timezone" varchar(50) DEFAULT 'Asia/Shanghai',
"template_override" jsonb,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "webhook_targets" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar(100) NOT NULL,
"provider_type" "webhook_provider_type" NOT NULL,
"webhook_url" varchar(1024),
"telegram_bot_token" varchar(256),
"telegram_chat_id" varchar(64),
"dingtalk_secret" varchar(256),
"custom_template" jsonb,
"custom_headers" jsonb,
"proxy_url" varchar(512),
"proxy_fallback_to_direct" boolean DEFAULT false,
"is_enabled" boolean DEFAULT true NOT NULL,
"last_test_at" timestamp with time zone,
"last_test_result" jsonb,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "notification_settings" ADD COLUMN "use_legacy_mode" boolean DEFAULT false NOT NULL;
EXCEPTION
WHEN duplicate_column THEN NULL;
END $$;--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "notification_target_bindings" ADD CONSTRAINT "notification_target_bindings_target_id_webhook_targets_id_fk" FOREIGN KEY ("target_id") REFERENCES "public"."webhook_targets"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
CREATE UNIQUE INDEX IF NOT EXISTS "unique_notification_target_binding" ON "notification_target_bindings" USING btree ("notification_type","target_id");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_notification_bindings_type" ON "notification_target_bindings" USING btree ("notification_type","is_enabled");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_notification_bindings_target" ON "notification_target_bindings" USING btree ("target_id","is_enabled");
Loading
Loading