Xray 代理

初始化配置

### 3. 服务端后台操作步骤

容器启动后(`docker-compose up -d`),你需要按以下步骤操作:
1.  **初次进入后台**:访问 `http://服务器IP:2053`(如果没配 Nginx 且开了防火墙)或者通过你配好的域名访问。
2.  **修改面板路径**:在“面板设置”里,将**面板根路径**设置为 `/admin/`(与 Nginx 配置对应),然后重启面板。
3.  **添加代理节点**:
    *   点击 **入站列表** -> **添加入站**。
    *   **协议**: `vless` 或 `vmess`。
    *   **端口**: `12345`(必须与 Nginx `proxy_pass` 一致)。
    *   **传输**: `ws` (WebSocket)。
    *   **路径**: `/graphql`(必须与 Nginx `location` 一致)。
    *   **开启 TLS**: 选 `false`(因为 TLS 由 Nginx 处理了)。


### 4. 客户端配置

在 PC 端(Clash Verge Rev)或手机端(小火箭)导入时,配置应如下:
| 配置项 | 值 |
| :--- | :--- |
| **地址 (Address)** | `vpn.yourdomain.com` |
| **端口 (Port)** | `80` (或 `443` 如果你配置了 SSL) |
| **传输方式** | `WebSocket` |
| **路径 (Path)** | `/graphql` |
| **TLS** | 如果 Nginx 开了 HTTPS 选 `true`,否则 `false` |

docker-compose.yml

services:
  3xui:
    image: ghcr.io/mhsanaei/3x-ui:26.5.3
    container_name: 3xui
    volumes:
      - ./data/db:/etc/xray-ui
      - ./data/cert:/root/cert
    environment:
      - XRAY_VMESS_AEAD_FORCED=false	# 默认admin/admin
      - XUI_ENABLE_FAIL2BAN: "true"
    restart: unless-stopped
    tty: true
    networks:
      - ghost_net  # 加入你的已有网络, 2053为管理后台,12345为websocket监听

networks:
  ghost_net:
    external: true     # 声明这是一个外部已存在的网络

proxy.conf

server {
    listen 80;
    server_name vpn.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2; # 开启 SSL 和 HTTP/2
    server_name vpn.yourdomain.com;

    # SSL 证书配置 (请确保路径与 Docker 映射路径一致)
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 推荐的安全优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;

    # A. 代理管理后台 (Web UI)
    location /admin/ {
        proxy_pass http://3xui:2053/admin/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # B. 代理加密通讯流量 (WebSocket)
    location /graphql { 
        if ($http_upgrade != "websocket") {
            return 404;
        }
        proxy_redirect off;
        proxy_pass http://3xui:12345; # 对应 3X-UI 里的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 可选:伪装站点。如果访问根目录,显示一个简单的 HTML 页面或跳转
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}