| deploy | ||
| internal | ||
| web | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| Makefile | ||
| plan.md | ||
| README.md | ||
港湾
多用户的 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 订阅地址。请只把账户发给信任的人。