背景
客户端: ClashX
服务端: xray
部署
创建目录并增加 docker compose 文件
1
2
|
mkdir -p apps/xray
vim apps/xray/docker-compose.yml
|
文件内容如下:
1
2
3
4
5
6
7
8
9
10
|
services:
xray:
image: ghcr.io/xtls/xray-core:25.10.15
container_name: xray
user: root
restart: unless-stopped
command: ["run", "-c", "/usr/local/etc/xray/config.json"]
volumes:
- ./config.json:/usr/local/etc/xray/config.json:ro
network_mode: host
|
增加配置文件 vim config.json
配置文件中几个动态参数需要替换一下。
生成 UUID 和随机前缀,注意这两个参数不能泄露!!!
执行两次,分别作为 id 和前缀,替换以下配置中的动态参数
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
|
{
"log": {
"loglevel": "info"
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": 6000,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "[填写 UUID]"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "/[随机前缀]"
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}
|
执行启动命令
可以检查容器是否启动成功,接下来做个反向代理。
反向代理
反向代理可以用 Nginx,Caddy2,Trarfik 等等,这里使用 Trarfik 完成反向代理。
第一步搞定域名解析。
创建目录和 compose 文件
1
2
|
mkdir -p apps/traefik
vim apps/traefik/docker-copmose.yml
|
写入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
|
services:
traefik:
image: traefik:v3.2
container_name: traefik
restart: unless-stopped
network_mode: host
volumes:
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./config:/config:ro
- ./letsencrypt:/letsencrypt
environment:
- TZ=Asia/Shanghai
|
编辑配置 vim traefik.yml,这里有个动态参数,填写你的邮箱
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
|
api:
dashboard: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
certificatesResolvers:
letsencrypt:
acme:
email: [邮箱]
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
providers:
file:
filename: /config/dynamic.yml
watch: true
log:
level: INFO
|
编辑反向代理配置
1
2
|
mkdir -p app/traefik/config
vim app/traefik/config/dynamic.yml
|
写入以下内容,这里有 2 个动态参数,填入第一步操作的域名,以及在 xray 配置中填写的前缀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
http:
routers:
# Xray WebSocket 代理
xray:
rule: "Host(`域名`) && PathPrefix(`/[前缀]`)"
service: xray
tls:
certResolver: letsencrypt
entryPoints:
- websecure
services:
# Xray 服务
xray:
loadBalancer:
servers:
- url: "http://127.0.0.1:6000"
|
执行启动命令,检查是否成功,服务端就部署完毕了。
ClashX
进入 「配置」-「打开配置文件夹」,快键键是 CMD+O
创建配置文件,比如 my.yaml,写入以下内容,这里有 3 个动态参数,替换域名,前缀,UUID,必须跟之前在服务端配置相同的参数。
保存并切换此配置,重载配置文件,上网试试。
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
|
proxies:
- name: "xx"
type: vless
server: [域名]
port: 443
uuid: [UUID]
tls: true
network: ws
ws-opts:
path: "/[前缀]"
headers:
Host: "[域名]"
udp: true
skip-cert-verify: false
proxy-groups:
- name: "PROXY"
type: select
proxies:
- "xx"
- "DIRECT"
rules:
- "GEOIP,CN,DIRECT"
- "MATCH,xx"
|
规则
可以从其他配置中拷贝规则,并替换匹配的 name 即可。
意外
最开始在容器里面监听了 443 端口,启动后提示以下错误 listen tcp 0.0.0.0:443: bind: permission denied, 给 compose 增加 user: root 后解决。
当然现在的版本已经不使用 443 端口了,同样 compose 里的相关配置可以删掉。
