跳转到内容

开发插件

你可以通过开发自定义插件来扩展 Web.Casa。插件是一个实现 Plugin 接口的 Go 包,编译到 Web.Casa 二进制文件中。

  • Go(版本需与 Web.Casa 的 go.mod 一致)
  • 熟悉 Gin Web 框架(用于路由)
  • React(用于前端组件)
  • 了解插件系统架构

在 plugins/(项目根目录)下创建以插件名命名的目录:

plugins/myplugin/
myplugin.go # 插件结构体和生命周期方法
handler.go # HTTP 处理器
service.go # 业务逻辑
model.go # 数据库模型

插件结构体必须实现以下生命周期方法:

type MyPlugin struct {
ctx *plugin.Context
db *gorm.DB
}
func (p *MyPlugin) Metadata() plugin.Metadata {
return plugin.Metadata{
Name: "myplugin",
Version: "1.0.0",
Description: "我的自定义插件",
Dependencies: []string{"docker"}, // 可选
}
}
func (p *MyPlugin) Init(ctx *plugin.Context) error {
p.ctx = ctx
p.db = ctx.DB
// 自动迁移数据库表
// 注册事件订阅
return nil
}
func (p *MyPlugin) Start() error {
// 启动后台进程
return nil
}
func (p *MyPlugin) Stop() error {
// 清理关闭
return nil
}

使用 CoreAPI 提供的 Gin 路由组注册路由。路由挂载在 /api/plugins/<plugin-name>/ 路径下:

func (p *MyPlugin) RegisterRoutes(group *gin.RouterGroup) {
group.GET("/items", p.handleListItems)
group.POST("/items", p.handleCreateItem)
group.GET("/items/:id", p.handleGetItem)
group.PUT("/items/:id", p.handleUpdateItem)
group.DELETE("/items/:id", p.handleDeleteItem)
}

认证和授权中间件会自动应用到插件路由。

在操作完成时通知其他插件:

p.ctx.EventBus.Publish("myplugin.item.created", map[string]interface{}{
"id": item.ID,
"name": item.Name,
})

响应其他插件或核心系统的事件:

p.ctx.EventBus.Subscribe("container.started", func(e plugin.Event) {
// 处理容器启动事件
})

常用事件订阅:

事件来源负载
container.startedDocker 插件容器 ID、名称
container.stoppedDocker 插件容器 ID、名称
host.created反向代理站点 ID、域名
backup.completed备份插件备份 ID、大小
project.deployed部署插件项目 ID、状态

使用 ConfigStore 持久化插件设置,无需直接访问数据库:

// 写入设置
p.ctx.ConfigStore.Set("myplugin", "api_url", "https://example.com")
// 读取设置
value := p.ctx.ConfigStore.Get("myplugin", "api_url")

存储在 ConfigStore 中的设置会自动在 Web.Casa 设置界面中显示,供用户配置。

插件 Context 提供对共享系统服务的访问:

服务访问方法用途
数据库ctx.DBGORM 数据库连接
事件总线ctx.EventBus发布和订阅事件
ConfigStorectx.ConfigStore作用域键值设置
日志记录器ctx.Logger结构化日志

开发完成后,在插件加载器中注册插件,使 Web.Casa 在启动时发现它:

// 在插件注册文件中
pluginManager.Register(&myplugin.MyPlugin{})
  • 为业务逻辑编写单元测试
  • 使用 Go 的 httptest 包测试 HTTP 处理器
  • 通过发布模拟事件测试事件订阅
  • 参考现有内置插件作为实现范例

提示: 参阅架构指南了解详细的代码结构规范、命名模式和最佳实践。