09a561086f5b4f25523f4400f86313e529ee9103
GoTunnel Official Plugins
GoTunnel 官方插件仓库,所有插件均经过官方签名验证。
安装插件
方式一:Web 控制台
- 打开 GoTunnel Web 控制台
- 进入「扩展商店」标签页
- 浏览可用插件,点击「安装」
- 选择目标客户端完成安装
方式二:客户端管理页面
- 进入客户端详情页
- 点击「从商店安装」按钮
- 选择插件直接安装
可用插件
| 插件 | 版本 | 类型 | 说明 |
|---|---|---|---|
| file-manager | 1.0.0 | app | 文件管理器,远程浏览和管理文件 |
插件开发
目录结构
gotunnel-plugins/
├── icons/ # 插件图标目录
│ └── your-plugin.svg # SVG 格式图标
├── plugins/
│ └── your-plugin/
│ ├── plugin.js # 插件源码 (必须)
│ ├── plugin.js.sig # 签名文件 (CI 自动生成)
│ └── manifest.json # 插件元数据 (必须)
└── store.json # 插件商店索引
manifest.json 格式
{
"name": "your-plugin",
"version": "1.0.0",
"type": "app",
"description": "插件描述",
"author": "Your Name",
"icon": "icons/your-plugin.svg",
"homepage": "https://github.com/...",
"config_schema": [
{
"key": "port",
"label": "端口",
"type": "number",
"default": "8080"
}
]
}
plugin.js 基本结构
// 定义插件元数据
function metadata() {
return {
name: "your-plugin",
version: "1.0.0",
type: "app",
description: "插件描述",
author: "Your Name"
};
}
// 插件启动
function start() {
log("Plugin started");
}
// 处理连接 (必须实现)
function handleConn(conn) {
// 处理逻辑
conn.Close();
}
// 插件停止
function stop() {
log("Plugin stopped");
}
API 参考
基础 API
| 函数 | 说明 | 示例 |
|---|---|---|
log(msg) |
输出日志 | log("Hello") |
config(key) |
获取配置 | config("port") |
连接 API (conn)
| 方法 | 说明 | 返回值 |
|---|---|---|
conn.Read(size) |
读取数据 | []byte 或 null |
conn.Write(data) |
写入数据 | 写入字节数 |
conn.Close() |
关闭连接 | - |
文件系统 API (fs)
| 方法 | 说明 |
|---|---|
fs.readFile(path) |
读取文件 → {data, error} |
fs.writeFile(path, content) |
写入文件 → {ok, error} |
fs.readDir(path) |
读取目录 → {entries, error} |
fs.stat(path) |
文件信息 → {name, size, isDir, modTime, error} |
fs.exists(path) |
是否存在 → {exists, error} |
fs.mkdir(path) |
创建目录 → {ok, error} |
fs.remove(path) |
删除文件 → {ok, error} |
HTTP API (http)
| 方法 | 说明 |
|---|---|
http.serve(conn, handler) |
处理 HTTP 请求 |
http.json(data) |
对象转 JSON 字符串 |
http.sendFile(conn, path) |
发送文件响应 |
HTTP Handler 示例:
function handleConn(conn) {
http.serve(conn, function(req) {
// req: {method, path, body}
return {
status: 200,
contentType: "application/json",
body: http.json({message: "OK"})
};
});
}
示例插件
Echo 服务
function metadata() {
return { name: "echo", version: "1.0.0", type: "app" };
}
function handleConn(conn) {
var data = conn.Read(4096);
if (data) conn.Write(data);
conn.Close();
}
HTTP API 服务
function metadata() {
return { name: "api", version: "1.0.0", type: "app" };
}
function handleConn(conn) {
http.serve(conn, function(req) {
if (req.path === "/health") {
return { status: 200, body: '{"status":"ok"}' };
}
return { status: 404, body: '{"error":"not found"}' };
});
}
提交插件
步骤
- Fork 本仓库
- 在
plugins/下创建插件目录 - 添加
plugin.js和manifest.json - 更新
store.json添加插件信息 - 提交 Pull Request
store.json 格式
[
{
"name": "your-plugin",
"version": "1.0.0",
"type": "app",
"description": "插件描述",
"author": "Your Name",
"icon": "icons/your-plugin.svg",
"download_url": "https://raw.githubusercontent.com/.../plugin.js"
}
]
图标规范
- 格式: SVG (推荐) 或 PNG
- 尺寸: 24x24 或 48x48
- 位置:
icons/目录下 - 命名: 与插件名称一致,如
your-plugin.svg
SVG 图标示例:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2">
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
</svg>
CI 自动化
- PR 提交后自动验证插件格式
- 合并后自动签名并更新
store.json
签名机制
所有插件必须经过官方签名才能在 GoTunnel 中运行。
- 签名算法:Ed25519
- 公钥内置于 GoTunnel 客户端
- 签名文件:
plugin.js.sig
沙箱限制
| 限制项 | 默认值 |
|---|---|
| 最大读取文件 | 10 MB |
| 最大写入文件 | 10 MB |
| 文件访问路径 | 插件数据目录 |
许可证
MIT License
Description
Languages
JavaScript
68.8%
Go
22.8%
Shell
7.6%
Standard ML
0.8%