架构
一套 Semaphore 部署有三个必需的部分:一个服务器进程、一个数据库, 以及任务执行的地方。其余的一切——运行器、Redis、反向代理、身份提供方—— 都是可选的,只在出现特定需求时才加入。
组成部分
服务器
一个单独的 Go 二进制文件。它内嵌了编译好的 Web 界面,因此一个进程同时提供
UI、REST API,以及位于 /api/ws 的 WebSocket 端点,用于把任务输出推送到已打开的浏览器。
它默认监听 3000 端口。
在这个进程内部同时运行着若干部分:
| 部分 | 职责 |
|---|---|
| HTTP API 与 UI | 浏览器和 API 客户端调用的一切。 |
| 任务池 | 任务队列、并发限制及其状态。 |
| 调度器 | 按定时计划启动模板。 |
| 本地执行器 | 当没有远程运行器接管时,在服务器本身上运行任务。 |
| 通知器 | 任务结束时发送告警。 |
数据库
SQLite、MySQL 或 PostgreSQL,通过 dialect 选项选择。它保存项目、模板、清单、
定时计划、用户、角色、任务历史,以及密钥库的加密内容。它是唯一必须备份的东西:
其余一切都可以重建。
SQLite 是默认选项,适合单台服务器。当有多个人依赖该服务时请使用 PostgreSQL 或 MySQL, 运行多于一个节点时则必须使用它们。
文件缓存
tmp_path 指向的目录(默认为 /tmp/semaphore)保存克隆下来的仓库和每次运行的工作目录。
它是缓存,不是存储:删除它的代价只是每个项目多克隆一次。项目设置中的清除缓存
做的正是这件事。
执行任务的那台机器会保留这份缓存——任务在本地运行时是服务器,否则就是各个运行器。