A lightweight self-hosted personal serverless platform based on Docker.
轻量级、自建、基于 Docker 的个人 Serverless 平台。
Callit 允许你通过 Python 或 Node.js 编写 Worker,并通过 HTTP 路由触发执行,适合轻量 API、HTML 页面展示、个人自动化等服务。
不依赖 Docker、Kubernetes 等容器技术,提供开箱即用的 Serverless 体验
快速开发,支持热更新 Worker 函数
- 基于 HTTP 路由触发 Worker
- 支持 Python / Node.js 运行时
- 支持文件上传、文件返回、HTML 页面返回
- 支持全局依赖管理
- 内置 Admin 后台管理 Worker、配置和依赖
- 支持数据持久化相关操作,提供 KV,DB 相关 SDK 接口
- 通过 db 模块提供 SQLite3 数据库操作能力
- 通过 kv 模块提供简单的 KV(Redis) 存储能力
tips:
如果你需要一个更成熟、功能更丰富且适用于企业级的 Serverless 平台,应该考虑 OpenFaas、Fission、AWS Lambda、Cloudflare Workers 等解决方案。
Callit更适合个人开发者、轻量级使用场景。
services:
callit:
image: yangzxi/callit:latest
container_name: callit
environment:
- ADMIN_TOKEN= # 在生产环境中请设置一个强随机值
# - TZ=Asia/Shanghai
ports:
- "3100:3100"
volumes:
- ./data:/app/data
cap_add:
- SYS_ADMIN
security_opt:
- seccomp=unconfined
- apparmor=unconfined
- systempaths=unconfined
restart: unless-stopped
depends_on:
- redis
redis:
image: redis:7-alpine
container_name: callit-redis
restart: unless-stopped启动:
docker compose up -d启动后可访问:
- Router:
http://127.0.0.1:3100 - Admin:
http://127.0.0.1:3100/admin/
如果你希望在 AI agent 中通过自然语言的方式来管理 Callit Worker,可以安装 callit-skill,并确保配置了 callit-mcp MCP 服务。
在新的 session/thread 中将以下内容发送给你的 AI agent 来安装 callit-skill:
Fetch and follow instructions from https://raw.githubusercontent.com/YangZxi/Callit-skill/refs/heads/main/README.md to install the skill.
更多关于该 skill 的介绍请参考 Callit-skill
项目内置了一个简单的 MCP server,你需要通过登录到 Admin 后台来启用它,并设置一个MCP_TOKEN,AI agent 才能通过 MCP 来管理 Worker。
- MCP Server Name:
callit-mcp - MCP Server Url:
http://<host>/mcp,其中<host>是 AI agent 能访问到的地址,通常是部署 Callit 的服务器 IP 或域名 - 鉴权方式优先使用请求头
Authorization: Bearer <MCP_TOKEN>;如果客户端不支持自定义请求头,也可以使用查询参数:http://<host>/mcp?token=<MCP_TOKEN>。当请求头和查询参数同时存在时,请求头优先
def handler(ctx):
request = ctx.get("request", {})
return {
"status": 200,
"body": {
"message": "Hello, Callit!",
"request": request
},
"headers": {
"Content-Type": "application/json"
}
}export default function handler(ctx) {
const { request } = ctx;
return {
status: 200,
body: {
message: "Hello, Callit!",
request,
},
headers: {
"Content-Type": "application/json"
}
};
}说明:
- Worker 目录中必须包含
main.py或main.js - 主文件中必须定义
handler(ctx),通过 ctx 对象获取请求信息、上下文等信息 - 通过返回 JSON 结构化数据来控制 HTTP 响应的状态码、响应体和响应头
- 具体文档与样例请参考 Worker 文档
- Worker 的内部 KV 能力通过本机
magic-api服务提供,默认监听127.0.0.1:31001,仅供 Worker 运行时调用
- Backend: Go + Gin
- Frontend: React + Vite + HeroUI
- Database: SQLite3
- Runtime: Python3 / Node.js
如果你需要本地修改源码、调试前端或开发后端,可按下面方式启动。
编辑 docker-compose.dev.yml,并配置相应的环境变量
cd pages
pnpm install
pnpm run devdocker compose -f docker-compose.dev.yml up --build后端数据默认保存在 data/ 目录下
默认前端端口为 3180。
默认后端端口为 3100。
data/app.db:SQLite 数据库data/workers/<worker_id>/:Worker 文件目录data/tmp/<request_id>/:上传文件临时目录,请求结束后自动清理,根目录可由WORKER_RUNNING_TEMP_DIR配置data/.lib/<runtime>/:运行时全局依赖目录public/:Admin 前端构建产物目录
- 编写 JSON API
- 上传文件后做解析或处理
- 生成并返回文件
- 返回 HTML 页面
- 使用第三方依赖扩展 Worker 能力
docker compose 启动时提示'Error response from daemon: invalid --security-opt 2: "systempaths=unconfined"'
大部分原因都是 Docker Compose 版本太低了,比如使用 apt 安装的 Docker
一下提供两个解决方案:
- 升级 Docker 和 Docker Compose 到最新版本
使用官方源重新安装最新的 Docker(新版 Docker 中包含 compose 命令),https://docs.docker.com/engine/install/debian/
跟随官方指导重新安装 Docker - 开放更高权限(不推荐,存在安全风险)
注释掉
systempaths=unconfined,同时添加privileged: true来获得相同的权限,但这会带来更大的安全风险,请谨慎使用。
services:
callit:
image: yangzxi/callit:latest
...
privileged: true
cap_add:
- SYS_ADMIN
security_opt:
- seccomp=unconfined
- apparmor=unconfined
# - systempaths=unconfined本项目采用 GNU General Public License v3.0 许可证。
- 允许商用、修改和分发
- 分发原版或修改版时,必须保留原作者版权声明与许可证文本
- 分发二进制、镜像或其他非源码形式时,必须同时提供对应源码或有效的源码获取方式
- 不允许将分发版本改为闭源私有发布
如果只是自行部署提供在线服务、未向他人分发程序副本,GPL-3.0 一般不强制公开源码。
Finally,Thanks to everyone on LinuxDo for their support! Welcome to join https://linux.do/ for all kinds of technical exchanges, cutting-edge AI information, and AI experience sharing, all on Linuxdo!