Skip to content

YangZxi/Callit

Repository files navigation

Callit

A lightweight self-hosted personal serverless platform based on Docker.
轻量级、自建、基于 Docker 的个人 Serverless 平台。

Callit 允许你通过 Python 或 Node.js 编写 Worker,并通过 HTTP 路由触发执行,适合轻量 API、HTML 页面展示、个人自动化等服务。

屏幕截图

Workers Page Worker Edit Worker Detail Page AppConfig Page

核心能力

不依赖 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 更适合个人开发者、轻量级使用场景。

快速开始

Docker Compose (推荐)

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/

Skill 与 MCP 服务

如果你希望在 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

项目内置了一个简单的 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>。当请求头和查询参数同时存在时,请求头优先

Worker 模板

Python Worker 模板

def handler(ctx):
    request = ctx.get("request", {})

    return {
        "status": 200,
        "body": {
            "message": "Hello, Callit!",
            "request": request
        },
        "headers": {
            "Content-Type": "application/json"
        }
    }

Node Worker 模板

export default function handler(ctx) {
  const { request } = ctx;

  return {
    status: 200,
    body: {
      message: "Hello, Callit!",
      request,
    },
    headers: {
      "Content-Type": "application/json"
    }
  };
}

说明:

  • Worker 目录中必须包含 main.pymain.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

二次开发

如果你需要本地修改源码、调试前端或开发后端,可按下面方式启动。

1. 安装 Docker

编辑 docker-compose.dev.yml,并配置相应的环境变量

2. 启动前端

cd pages
pnpm install
pnpm run dev

3. 启动后端

docker 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
一下提供两个解决方案:

  1. 升级 Docker 和 Docker Compose 到最新版本
    使用官方源重新安装最新的 Docker(新版 Docker 中包含 compose 命令),https://docs.docker.com/engine/install/debian/
    跟随官方指导重新安装 Docker
  2. 开放更高权限(不推荐,存在安全风险) 注释掉 systempaths=unconfined,同时添加 privileged: true 来获得相同的权限,但这会带来更大的安全风险,请谨慎使用。
services:
  callit:
    image: yangzxi/callit:latest
    ...
    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp=unconfined
      - apparmor=unconfined
      # - systempaths=unconfined

LICENSE

本项目采用 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!

About

A lightweight self-hosted serverless platform for triggering Python and Node.js workers over HTTP. 一个轻量级、自建的 Serverless 平台,可通过 HTTP 触发 Python 和 Node.js Worker。

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors