No description
Find a file
2026-10-08 19:38:15 +08:00
deploy init 2026-10-08 19:38:15 +08:00
internal init 2026-10-08 19:38:15 +08:00
web init 2026-10-08 19:38:15 +08:00
.dockerignore init 2026-10-08 19:38:15 +08:00
.env.example init 2026-10-08 19:38:15 +08:00
.gitignore init 2026-10-08 19:38:15 +08:00
docker-compose.yml init 2026-10-08 19:38:15 +08:00
Dockerfile init 2026-10-08 19:38:15 +08:00
go.mod init 2026-10-08 19:38:15 +08:00
go.sum init 2026-10-08 19:38:15 +08:00
main.go init 2026-10-08 19:38:15 +08:00
Makefile init 2026-10-08 19:38:15 +08:00
plan.md init 2026-10-08 19:38:15 +08:00
README.md init 2026-10-08 19:38:15 +08:00

港湾

多用户的 Clash 配置中心。每个用户可以维护多份配置,Clash 通过固定地址订阅:

{BASE_PATH}/api/config/{username}/{config_name}?sk={sk}

BASE_PATH 默认为空,服务就在网站根路径。要挂到子路径时写成 /clash 这样的前缀,详见下方「子路径」。

配置有两种:

  • 静态配置:YAML 由用户编写,服务原样下发。
  • 远端配置:关联一个或多个订阅地址。服务提取代理节点(Clash proxies,或 ss / vmess / vless / trojan / hysteria2 / tuic / socks 分享链接)以及 hosts。订阅里的规则、DNS、策略组一律丢弃。多份订阅的 hosts 按添加顺序合并,同名项以后一份为准;分流规则里写的同名项会覆盖远端。域名到域名的别名会写进对应节点的 server,避免 fake-ip 把别名解析成 198.18.0.0/15。分流使用内置规则,也可以自己改。服务会按间隔重新拉取节点。

默认分流

内置规则使用 Loyalsoldier/clash-rules 的白名单,服务分类使用 MetaCubeX/meta-rules-dat 的域名列表。未命中任何规则的流量走「漏网之鱼」,这一组默认是 PROXY。编辑器里可以一键换成黑名单模式(漏网之鱼默认直连),或整段改写。

客户端里可以单独切换这些策略组:

名称 默认 覆盖
PROXY 手动选择,包含 AUTO、FALLBACK、DIRECT 和全部节点 其它服务组未单独指定时跟着它
AUTO url-test 自动测速 全部节点
FALLBACK 故障转移 全部节点
AI PROXY OpenAI、Anthropic
电报消息 PROXY Telegram 域名和 IP
Google / YouTube / Netflix PROXY 各自的域名
国外媒体 PROXY Disney、Spotify、Twitter、TikTok、巴哈姆特
GitHub / Steam PROXY 各自的域名
微软服务 / 苹果服务 DIRECT Microsoft、Apple、iCloud
全球直连 DIRECT 国内域名和中国 IP
广告拦截 REJECT 广告域名
漏网之鱼 白名单为 PROXY,黑名单为 DIRECT 没有命中前面规则的流量

如果在分流 YAML 里自己写 proxy-groups,它们会替换上面这组策略。列表中的 __PROXIES__ 会展开为全部节点名。规则里写到的策略组必须存在,并且需要有名为 PROXY 的策略。

运行

make build
./bin/clash-config-center

开发时可以分两个进程:go run .,以及在 web/ 里 npm install && npm run dev(Vite 会把 /api 代理到 127.0.0.1:8080)。

浏览器打开 http://127.0.0.1:8080,注册第一个账户即可。注册完成后可以把 ALLOW_REGISTER=false 写进环境变量再启动,避免继续开放注册。

Docker Compose

cp .env.example .env
docker compose up -d --build

make up 和 make down 是同样的两条命令。浏览器打开 http://127.0.0.1:8080(宿主机端口由 .env 里的 PORT 决定)。注册完第一个账户后,把 .env 中的 ALLOW_REGISTER 改为 false,再执行 docker compose up -d。

数据库在命名卷 harbor-data 里,容器内路径是 /data/harbor.db。docker compose down 会停掉容器并保留这个卷;加上 -v 会把数据一起删掉。

JWT_SECRET 留空时,密钥由服务生成并保存在数据库中。若希望重建数据卷之后已签发的登录令牌仍然有效,在 .env 里写一个固定值。

容器需要访问外网,才能拉取远端订阅。镜像里带有 CA 证书。

子路径

BASE_PATH=/clash 时,浏览器里的页面、接口和订阅地址都带这个前缀:

https://example.com/clash/api/config/{username}/{config_name}?sk={sk}

改 .env 后执行 docker compose up -d --build。容器自己仍在 / 提供接口。反向代理用 handle_path 去掉前缀再转发,服务不会把请求跳回 /clash,否则会和 handle_path 形成重定向循环。

handle_path /clash {
    reverse_proxy localhost:8085
}

handle_path /clash/* {
    reverse_proxy localhost:8085
}

宿主机端口要和 reverse_proxy 后面的端口一致。Compose 默认把容器的 8080 映到宿主机 8085,.env 里的 PORT 会覆盖这个端口。

变量 默认 含义
ADDR :8080 监听地址
DATA_DIR data SQLite 数据库目录
JWT_SECRET 自动生成并保存在数据库 登录令牌签名密钥
ALLOW_REGISTER true 设为 false 关闭注册
DIST_DIR web/dist 前端构建产物
BASE_PATH 空 浏览器中的子路径,例如 /clash

技术栈:SQLite、Go、Gin、GORM、React、React Router、JWT。

能登录的用户可以让服务去请求任意 http/https 订阅地址。请只把账户发给信任的人。