Skip to content

DouDOU-start/airgate-core

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

176 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AirGate

AirGate Core

可插件化的统一 AI 网关运行时

release ghcr.io license go react

中文 · English


AirGate 不是又一个"集成了 N 个 AI 平台"的网关,而是一套把平台能力做成插件、运行时按需装载的开放架构。

  • Core(本仓库)= 用户、账号、调度、计费、限流、订阅、管理后台 —— 所有平台无关的通用能力
  • Plugin = 一个独立的 Go 进程,通过 gRPC 实现 SDK 定义的接口,提供具体平台的转发逻辑

平台插件可以独立发版、独立 release、独立装卸、独立热更,Core 不重启、其他插件不受影响。这意味着你可以只装自己需要的能力,也可以为内部场景写私有插件接进来。

✨ 核心特性

  • 🔌 插件化运行时 — 平台能力解耦为独立 gRPC 子进程(基于 hashicorp/go-plugin),支持上传安装 / GitHub Release 安装 / 开发模式热重载,零停机
  • 🧩 路由动态注入 — 插件声明的 HTTP 路由由 Core 自动注册到网关,账号表单字段和前端组件自动嵌入管理后台
  • 🎯 多账号智能调度 — 优先级 + 健康状态 + 并发上限自动选号,账号异常自动降级
  • 💰 精确计费 — 按 token × 模型单价实时记账,支持费率倍率、用户余额、订阅与配额
  • 🛡 完整管理后台 — 用户/分组/账号/订阅/IP/代理池/插件市场/系统设置一站式管理,支持账号导入导出、自动刷新、API Key 鉴权
  • 📦 一键部署 — 镜像化分发到 ghcr.io,多架构(amd64/arm64),用户 docker compose up -d 即可

🧩 插件生态

已发布插件

插件 类型 能力 仓库
gateway-openai gateway OpenAI Responses / Chat Completions / ChatGPT OAuth / Anthropic 协议翻译 / WebSocket DouDOU-start/airgate-openai
payment-epay extension 多渠道支付:易支付(虎皮椒/彩虹)/ 支付宝官方 / 微信支付官方,含充值页、订单管理、服务商配置 DouDOU-start/airgate-epay
airgate-health extension AI 提供商健康监控:主动探测、可用率/延迟聚合、对外公开状态页 DouDOU-start/airgate-health

安装插件

打开管理后台 → 插件管理 → 三种方式任选:

1. 插件市场 → 点击「安装」    (从 GitHub Release 自动拉取,匹配当前架构)
2. 上传安装 → 拖入二进制文件   (适合内部插件)
3. GitHub 安装 → 输入 owner/repo(适合未列入市场的插件)

市场会定时从 GitHub API 同步每个插件的最新 release 版本(默认 6h,使用 ETag 不消耗 API 配额),也可以在市场页点刷新按钮手动同步。

写一个自己的插件

只需依赖 airgate-sdk,实现 GatewayPlugin 接口的几个方法即可:

type GatewayPlugin interface {
    Info() PluginInfo                    // 元信息:ID、版本、账号字段、前端组件
    Platform() string                    // 平台键
    Models() []ModelInfo                 // 模型列表 + 单价(用于计费)
    Routes() []RouteDefinition           // HTTP 路由声明
    Forward(ctx, req) (*ForwardResult, error)  // 实际转发逻辑
}

参考 airgate-openai 完整范例,含 Makefile、release workflow、前端嵌入。

🛠 技术栈

技术
后端 Go 1.25 · Gin · Ent ORM · PostgreSQL 17 · Redis 8
前端 React 19 · Vite · TanStack Query · Tailwind CSS
插件协议 hashicorp/go-plugin (gRPC)
部署 Docker Compose · GitHub Container Registry · 多架构 (amd64/arm64)
鉴权 JWT + 管理员 API Key

🚀 部署

两条路任选其一。两者都可以在生产使用。

路径 适用场景 你需要自备
1A. 裸金属 install.sh 已经有 PostgreSQL + Redis,想要最轻量的部署,喜欢 systemd PostgreSQL 15+ / Redis 7+
1B. Docker Compose 干净的服务器,想一把梭把 pg + redis + core 全部用容器跑起来 仅 Docker

⚠️ 二选一,不要混用。如果选 1A 又跑了 1B 的 docker compose,会出现两套数据库实例互相打架。

方式 1A:裸金属安装(systemd,自备 PostgreSQL + Redis)

curl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash

install.sh 会:

  1. 检测 OS / 架构(linux/amd64 或 linux/arm64)
  2. 从 GitHub Releases 下载对应平台的 airgate-core-{os}-{arch} 二进制(前端 SPA 与翻译文件已经 //go:embed 进 binary,单文件即可运行)
  3. 安装到 /opt/airgate-core/airgate-core,sha256 校验
  4. 创建系统用户 airgate 与目录 /etc/airgate-core / /var/lib/airgate-core
  5. 安装 systemd 服务 airgate-core.service

脚本不会自动启动服务,也不会config.yaml —— 是为了让你审查一遍后再启动:

sudo systemctl start airgate-core
sudo systemctl enable airgate-core

# 然后浏览器访问 http://<your-host>:9517,向导会引导你输入:
#   - PostgreSQL 连接(已运行的 pg 实例)
#   - Redis 连接(已运行的 redis 实例)
#   - 管理员账号
# 所有信息会写入 /etc/airgate-core/config.yaml

进入管理后台后到 插件管理 → 插件市场 按需安装 gateway-openai / payment-epay / airgate-health 等插件(/var/lib/airgate-core/plugins 持久化)。

升级 / 卸载

# 升级到最新版本(保留配置和数据)
curl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- upgrade

# 安装指定版本
curl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- -v v0.1.0

# 卸载(默认保留 /etc/airgate-core 与 /var/lib/airgate-core)
curl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- uninstall -y

常用命令

sudo systemctl status airgate-core    # 状态
sudo journalctl -u airgate-core -f    # 日志
sudo systemctl restart airgate-core   # 重启

方式 1B:Docker Compose(自带 PostgreSQL + Redis)

mkdir airgate && cd airgate
curl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/docker-deploy.sh | bash

# 检查生成的文件后启动
docker compose up -d
docker compose logs -f core

docker-deploy.sh 只准备文件 —— 不会替你 up -d,方便你审查后再启动:

  1. 检查 docker / docker compose 依赖
  2. 在当前目录创建 data/{postgres,redis,plugins,uploads} 子目录
  3. 下载 docker-compose.yml
  4. openssl rand 生成 DB_PASSWORD / REDIS_PASSWORD / JWT_SECRET 写入 .env(权限 600)

启动后访问 http://<your-host>:9517,安装向导自动跳过 DB / Redis 配置(环境变量已就绪),只需要建管理员账号即可。

所有持久化数据落在 ./data/,备份直接 tar czf backup.tgz data .env 即可。

升级 / 卸载

# 升级到最新版本(在 docker-compose.yml 所在目录执行)
# 默认 AIRGATE_IMAGE_TAG=latest,直接拉新镜像即可;如固定了版本,先在 .env 改 AIRGATE_IMAGE_TAG
docker compose pull
docker compose up -d
docker compose logs -f core

# 升级到指定版本
sed -i 's/^AIRGATE_IMAGE_TAG=.*/AIRGATE_IMAGE_TAG=v0.1.0/' .env
docker compose pull && docker compose up -d

# 卸载(保留数据):停止并删除容器,./data 与 .env 不动
docker compose down

# 彻底卸载(连同数据一起删,操作前务必备份)
docker compose down
rm -rf data .env docker-compose.yml

升级前建议先 tar czf backup-$(date +%F).tgz data .env 备份一次。Core 启动时会自动执行数据库 migrate,无需手动操作。

关键环境变量(完整列表见 .env.example):

变量 说明 是否必填
DB_PASSWORD Postgres 密码,首次启动后请勿修改
REDIS_PASSWORD Redis 鉴权密码,建议 openssl rand -hex 24;不会持久化,可随时改后重启
JWT_SECRET JWT 签名密钥,建议 openssl rand -hex 32
BIND_HOST 监听地址,反向代理后部署时改 127.0.0.1
PORT 对外端口,默认 9517
TZ 时区,默认 Asia/Shanghai
AIRGATE_IMAGE_TAG 镜像版本,默认 latest,可固定到 v0.x.y
API_KEY_SECRET 用户 API Key 加密密钥,hex 编码 ≥64 字符

反向代理:Caddy + 自动 HTTPS(可选)

如果想让 core 走 https://your-domain 而不是裸 http://host:9517,最省事的方案是用 Caddy:自带 Let's Encrypt 自动签发与续期,配置只有十几行。下面以 Ubuntu / Debian 为例,1A / 1B 部署都适用。

前置条件

  1. 域名 A 记录已经指向本机公网 IP;
  2. 防火墙 / 安全组放行 80443(HTTP-01 验证 + HTTPS);
  3. 9517 端口可以保留对外,也可以只允许本机访问 —— 由 Caddy 统一在 443 接收外部流量。

安装 Caddy

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
  | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

其它系统参考 官方安装文档。安装完 Caddy 会以 systemd 服务跑起来,配置文件位于 /etc/caddy/Caddyfile

配置 /etc/caddy/Caddyfile

把下面内容覆盖进去,改掉域名和邮箱即可:

airgate.example.com {
    encode zstd gzip

    reverse_proxy 127.0.0.1:9517 {
        # 关闭响应缓冲,保证 SSE / 流式输出实时返回
        flush_interval -1

        header_up Host                {host}
        header_up X-Real-IP           {remote_host}
        header_up X-Forwarded-For     {remote_host}
        header_up X-Forwarded-Proto   {scheme}

        # 大模型请求耗时较长,放宽超时
        transport http {
            read_timeout  30m
            write_timeout 30m
            dial_timeout  10s
        }
    }

    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options    "nosniff"
        Referrer-Policy           "strict-origin-when-cross-origin"
        -Server
    }
}

如果 core 跑在 docker compose 里、Caddy 跑在宿主机,127.0.0.1:9517 保持原样即可(compose 默认已经把 9517 映射到宿主机)。

应用 / 验证

sudo caddy fmt --overwrite /etc/caddy/Caddyfile   # 格式化(可选)
sudo systemctl reload caddy                       # 热加载,不会断连
sudo journalctl -u caddy -f                       # 看证书签发日志

第一次 reload 后 Caddy 会自动向 Let's Encrypt 申请证书,几秒到几十秒后日志里出现 certificate obtained successfully,浏览器访问 https://airgate.example.com 即可。证书自动续期,无需人工干预。

几个常见坑

  • flush_interval -1 不能省:默认会缓冲响应,SSE / 流式接口会变成"一次性返回"。
  • 超时一定要放宽:大模型推理动辄几分钟,Caddy 默认反代超时不够。
  • 80 端口必须开:Let's Encrypt 用 HTTP-01 验证,80 不通就签不到证书。调试期可在文件最上面加一段 { acme_ca https://acme-staging-v02.api.letsencrypt.org/directory } 切到 staging,避开正式环境的速率限制。
  • 想关掉 9517 直连:把 deploy/docker-compose.ymlcore.ports 改成 127.0.0.1:9517:9517,外网就只能从 Caddy 进来;裸金属部署同理,在 config.yaml 里把监听地址改成 127.0.0.1

方式 2:源码开发

适合二次开发或贡献者。两条路任选其一:

A. 全容器(推荐,宿主机零依赖)

宿主机只需要 Docker。父目录同时克隆 airgate-sdkairgate-core

mkdir airgate && cd airgate
git clone https://github.com/DouDOU-start/airgate-sdk.git
git clone https://github.com/DouDOU-start/airgate-core.git

cd airgate-core
docker compose -f deploy/docker-compose.dev.yml up

deploy/docker-compose.dev.yml 会拉起 postgres + redis,构建 sdk / core 前端,最后用 go run ./cmd/server 启动 core,全部跑在容器里。访问 http://localhost:9517 即可。

B. 宿主机直跑

需要 Go 1.25+、Node 22+、本地 Postgres + Redis,以及兄弟目录 airgate-sdk

git clone https://github.com/DouDOU-start/airgate-sdk.git
git clone https://github.com/DouDOU-start/airgate-core.git
cd airgate-core

make install   # 安装前后端依赖
make dev       # 启动前后端开发服务器

更多命令见 make help

⚠️ 不要使用 dev compose 上生产。它用 go run 启动、源码 bind-mount 进容器、密码全部硬编码(airgate / airgate-dev),仅供本地开发。生产请走方式 1A 或 1B。

🏗 架构

                     ┌──────────────────────────────────────────┐
                     │         AirGate Core (本仓库)            │
                     │  ┌─────────┐  ┌─────────┐  ┌──────────┐  │
   用户/管理员  ────► │  │  HTTP   │  │  调度   │  │   计费   │  │
                     │  │  路由   │  │  限流   │  │  订阅    │  │
                     │  └────┬────┘  └────┬────┘  └────┬─────┘  │
                     │       │  Plugin Manager (gRPC)  │        │
                     │       └────────────┬─────────────┘       │
                     └────────────────────┼─────────────────────┘
                                          │ go-plugin
                          ┌───────────────┼───────────────┐
                          ▼               ▼               ▼
                   ┌──────────────┐┌──────────────┐┌──────────────┐
                   │ gateway-     ││ gateway-     ││ payment-     │
                   │ openai       ││ claude       ││ epay         │
                   │ (子进程)     ││ (子进程)     ││ (子进程)     │
                   └──────┬───────┘└──────┬───────┘└──────────────┘
                          │ HTTPS         │ HTTPS
                          ▼               ▼
                     OpenAI / ChatGPT   Anthropic

请求生命周期

用户请求 ──► Core 鉴权 ──► Core 选账号 ──► Plugin.Forward() ──► 上游 AI API
                                              │
                                              ▼
                                         ForwardResult
                                       ┌──────┴──────┐
                                  token 用量      账号状态反馈
                                  Core 计费       Core 更新账号

📁 项目结构

airgate-core/
├── backend/                  # Go 后端
│   ├── cmd/server/           # 入口
│   ├── internal/
│   │   ├── server/           # HTTP 路由 + 中间件
│   │   ├── plugin/           # 插件生命周期 + 市场 + 转发
│   │   ├── scheduler/        # 账号调度
│   │   ├── billing/          # 计费与用量
│   │   ├── ratelimit/        # 限流
│   │   └── app/              # 业务用例(按领域拆分)
│   └── ent/                  # 数据库 ORM (Ent)
├── web/                      # 管理后台 (React + Vite)
│   └── src/
│       ├── pages/admin/      # 管理页面
│       ├── shared/api/       # API 客户端
│       └── i18n/             # zh / en 文案
├── deploy/                       # 部署
│   ├── install.sh                # 裸金属安装脚本(systemd,curl | sudo bash)
│   ├── docker-deploy.sh          # docker compose 部署准备脚本(curl | bash)
│   ├── airgate-core.service      # systemd unit
│   ├── docker-compose.yml        # 生产编排(拉取 ghcr.io 镜像)
│   ├── docker-compose.dev.yml    # 开发编排(源码挂载)
│   ├── Dockerfile                # 多阶段构建
│   ├── config.docker.yaml        # 镜像内置默认配置
│   └── .env.example              # docker 部署的环境变量模板
├── .github/workflows/
│   ├── ci.yml                    # PR 检查
│   └── release.yml               # tag 触发:多架构镜像 + 跨平台二进制
└── Makefile

🔧 运维要点

  • 健康检查GET /healthz 公开端点,docker / k8s 直接用
  • 二进制完全自包含:前端 SPA 与翻译文件均通过 //go:embed 打进二进制,install.sh 部署只有一个文件,没有额外的静态资源目录需要管理
  • 数据持久化
    • 裸金属(1A)/var/lib/airgate-core/{plugins,uploads} + /etc/airgate-core/config.yaml,PostgreSQL / Redis 由用户自行管理
    • Docker(1B):所有数据落在 ./data/{postgres,redis,plugins,uploads} 四个 bind mount,备份只需 tar czf backup.tgz data .env
  • 升级
    • 裸金属:curl -sSL .../install.sh | sudo bash -s -- upgrade
    • Docker:改 .env 里的 AIRGATE_IMAGE_TAGdocker compose pull && docker compose up -d
  • 数据库迁移:Ent schema 变更通过 make ent 生成代码,core 启动时自动 migrate
  • 插件升级:管理后台插件市场点刷新 → 卸载旧版本 → 重新安装

Docker 存量用户从 named volume 迁移:旧版 compose 使用 postgres_data / redis_data / airgate_plugins / airgate_uploads 四个命名 volume,新版改为 ./data/* bind mount。迁移步骤:

docker compose down
mkdir -p data/postgres data/redis data/plugins data/uploads
docker run --rm -v <project>_postgres_data:/from -v $(pwd)/data/postgres:/to alpine cp -a /from/. /to/
docker run --rm -v <project>_redis_data:/from    -v $(pwd)/data/redis:/to    alpine cp -a /from/. /to/
docker run --rm -v <project>_airgate_plugins:/from -v $(pwd)/data/plugins:/to alpine cp -a /from/. /to/
docker run --rm -v <project>_airgate_uploads:/from -v $(pwd)/data/uploads:/to alpine cp -a /from/. /to/
curl -O https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/docker-compose.yml
docker compose up -d
# 验证一切正常后再删除旧的命名 volume
docker volume rm <project>_postgres_data <project>_redis_data <project>_airgate_plugins <project>_airgate_uploads

<project> 是 docker compose 自动生成的项目前缀(默认是当前目录名),docker volume ls 可以查看实际名字。

🤝 贡献 / 反馈

📜 License

MIT

About

插件化 AI 中转网关,平台能力以 gRPC 插件独立装载,支持多账号调度、计费与拼车共享,docker compose 一键自部署

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors