收起左侧

统一网关版Vsocde的Docker版本

0
回复
18
查看
[ 复制链接 ]

6

主题

64

回帖

0

牛值

系统先锋体验团🛩️

说明

最近官方出了统一网关,经过一段时间的探索,也是有了一些简单的认识,可以将第三方应用适配成 http://192.168.1.10:5666/app/{appname}这种格式,也就是不走tcp没有端口号,而是生成Unix Socket文件来监听,这个文件是程序自己生成的,每次启动都会删除旧的socket文件,然后生成新的socket给飞牛的统一网关来监听转发,同时这个也支持了websocket这种方式,避免了长轮询这种落后方式,本来是想做一版用systemctl或docker的code-server的适配,但是遇到的坑太多就放弃了。

过程

刚开始时我也觉得很简单,它的code-server有一个--socket参数只要指定路径,然后用飞牛的统一网关加载一下就可以,然后就报GET http://192.168.x.xxx:5666/app/coder 404(Not Found)的错误,查问了Ai好久终于得到原因是:code-serv它默认认为自己运行在/目录下,所以加载的前面加了个app/coder就找不到静态文件了,然后用一个中间层socket来转发,代码如下:

const http = require("http");
const httpProxy = require("http-proxy");
const fs = require("fs");

const BASE_PATH = '/app/coder';
const GATEWAY_SOCKET ="/var/apps/coder/target/gateway.sock";
const CODESERVER_SOCKET ="/var/apps/coder/target/code-server.sock";

// 如果旧socket存在则删除
if (fs.existsSync(GATEWAY_SOCKET)) {
    fs.unlinkSync(GATEWAY_SOCKET);
}

//创建代理对象,把收到的请求转发给 code-server.sock
const proxy = httpProxy.createProxyServer({
  target: { socketPath: CODESERVER_SOCKET },
  ws: true
});

//创建HTTP Server
const server = http.createServer((req, res) => {
    // 解析 URL
    const parsedUrl = new URL(req.url, 'http://localhost');
    let pathname;
    try {
        pathname = decodeURIComponent(parsedUrl.pathname);
    } catch (e) {
        res.writeHead(400, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify({ error: 'URL解码失败' }));
        return;
    }

    // 路径规范化
    if (pathname === BASE_PATH) {
        res.writeHead(301, { 'Location': BASE_PATH + '/' });
        res.end();
        return;
    }
    console.log(`[coder] 收到请求: ${pathname}`);

    if (pathname.startsWith(BASE_PATH)) {
        req.url = pathname.substring(BASE_PATH.length) || '/';
        console.log(`[coder] 去掉前缀后路径: ${ req.url}`);
    }

    proxy.web(req, res);//转发 HTTP 到code-server.sock
});


// 监听文件路径而非端口
server.listen(GATEWAY_SOCKET, () => {
    // 赋予权限
    fs.chmodSync(GATEWAY_SOCKET, '0666');
    console.log(`Server listening on ${GATEWAY_SOCKET}`);
});

成功的解决了静态文件加载失败的问题,然而code-server用的大多是websocket,然后就出现了下面的情况,有页面但是websocket连接不了,可以是我菜的问题,问了ai半天都不能解决,连接始终不成功,如下所示:

PixPin_2026-05-15_02-30-27.png

后面我又找到了openvscode,官网是https://github.com/gitpod-io/openvscode-server,它与code-server类似,它支持base-path也就是运行目录可以改变--socket-path xxx.sock与--server-base-path /app/openvscode这样就可以跑通了。

成果

可以在这https://github.com/ctllo-bit/openvscode的build目录下载fpk,这是一个docker版本,将宿主机的target目录映射给容器,然后容器在这目录写入socket文件,目前只可以target目录,其实我觉得如果映射给target\server目录下更方便一点,这样子就可以用到飞牛的统一网关了,在不登录的情况下,就如下图所示:

PixPin_2026-05-15_03-11-10.png

登陆成功,就和官方应用一样同用5556端口了

PixPin_2026-05-15_03-12-53.png

完。。

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则