{"id":48633946,"url":"https://github.com/doudou-start/airgate-core","last_synced_at":"2026-05-24T02:01:12.594Z","repository":{"id":343859171,"uuid":"1171373299","full_name":"DouDOU-start/airgate-core","owner":"DouDOU-start","description":"插件化 AI 中转网关，平台能力以 gRPC 插件独立装载，支持多账号调度、计费与拼车共享，docker compose 一键自部署","archived":false,"fork":false,"pushed_at":"2026-05-23T16:25:06.000Z","size":19450,"stargazers_count":48,"open_issues_count":0,"forks_count":15,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-23T17:24:02.794Z","etag":null,"topics":["2api","account-sharing","ai-gateway","claude-2api","kiro-2api","multi-account","openai-2api","plugin-system"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DouDOU-start.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T06:46:36.000Z","updated_at":"2026-05-23T16:25:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DouDOU-start/airgate-core","commit_stats":null,"previous_names":["doudou-start/airgate-core"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/DouDOU-start/airgate-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DouDOU-start%2Fairgate-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DouDOU-start%2Fairgate-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DouDOU-start%2Fairgate-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DouDOU-start%2Fairgate-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DouDOU-start","download_url":"https://codeload.github.com/DouDOU-start/airgate-core/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DouDOU-start%2Fairgate-core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33418550,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2api","account-sharing","ai-gateway","claude-2api","kiro-2api","multi-account","openai-2api","plugin-system"],"created_at":"2026-04-09T07:09:41.092Z","updated_at":"2026-05-24T02:01:12.587Z","avatar_url":"https://github.com/DouDOU-start.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"web/src/assets/logo.svg\" alt=\"AirGate\" width=\"120\" /\u003e\n\n  \u003ch1\u003eAirGate Core\u003c/h1\u003e\n\n  \u003cp\u003e\u003cstrong\u003e可插件化的统一 AI 网关运行时\u003c/strong\u003e\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/DouDOU-start/airgate-core/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/DouDOU-start/airgate-core?style=flat-square\" alt=\"release\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/DouDOU-start/airgate-core/pkgs/container/airgate-core\"\u003e\u003cimg src=\"https://img.shields.io/badge/ghcr.io-airgate--core-blue?style=flat-square\u0026logo=docker\" alt=\"ghcr.io\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/DouDOU-start/airgate-core/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/DouDOU-start/airgate-core?style=flat-square\" alt=\"license\" /\u003e\u003c/a\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Go-1.25-00ADD8?style=flat-square\u0026logo=go\" alt=\"go\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/React-19-61DAFB?style=flat-square\u0026logo=react\" alt=\"react\" /\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cstrong\u003e中文\u003c/strong\u003e · \u003ca href=\"README_EN.md\"\u003eEnglish\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\nAirGate 不是又一个\"集成了 N 个 AI 平台\"的网关，而是一套**把平台能力做成插件、运行时按需装载**的开放架构。\n\n- **Core**（本仓库）= 用户、账号、调度、计费、限流、订阅、管理后台 —— 所有平台无关的通用能力\n- **Plugin** = 一个独立的 Go 进程，通过 gRPC 实现 SDK 定义的接口，提供具体平台的转发逻辑\n\n平台插件可以**独立发版、独立 release、独立装卸、独立热更**，Core 不重启、其他插件不受影响。这意味着你可以只装自己需要的能力，也可以为内部场景写私有插件接进来。\n\n## ✨ 核心特性\n\n- **🔌 插件化运行时** — 平台能力解耦为独立 gRPC 子进程（基于 hashicorp/go-plugin），支持上传安装 / GitHub Release 安装 / 开发模式热重载，零停机\n- **🧩 路由动态注入** — 插件声明的 HTTP 路由由 Core 自动注册到网关，账号表单字段和前端组件自动嵌入管理后台\n- **🎯 多账号智能调度** — 优先级 + 健康状态 + 并发上限自动选号，账号异常自动降级\n- **💰 精确计费** — 按 token × 模型单价实时记账，支持费率倍率、用户余额、订阅与配额\n- **🛡 完整管理后台** — 用户/分组/账号/订阅/IP/代理池/插件市场/系统设置一站式管理，支持账号导入导出、自动刷新、API Key 鉴权\n- **📦 一键部署** — 镜像化分发到 ghcr.io，多架构（amd64/arm64），用户 `docker compose up -d` 即可\n\n## 🧩 插件生态\n\n### 已发布插件\n\n| 插件 | 类型 | 能力 | 仓库 |\n|---|---|---|---|\n| **gateway-openai** | gateway | OpenAI Responses / Chat Completions / ChatGPT OAuth / Anthropic 协议翻译 / WebSocket | [DouDOU-start/airgate-openai](https://github.com/DouDOU-start/airgate-openai) |\n| **gateway-claude** | gateway | Claude Messages API 网关：OAuth 授权、TLS 指纹、用量监控 | [DouDOU-start/airgate-claude](https://github.com/DouDOU-start/airgate-claude) |\n| **gateway-kiro** | gateway | Kiro (AWS CodeWhisperer) 反代网关，兼容 Anthropic Messages API | [DouDOU-start/airgate-kiro](https://github.com/DouDOU-start/airgate-kiro) |\n| **airgate-playground** | extension | AI 对话插件：网页聊天、多模型切换、会话管理 | [DouDOU-start/airgate-playground](https://github.com/DouDOU-start/airgate-playground) |\n| **airgate-studio** | extension | 面向图片、视频、音频等多模态内容生成的统一创作中心 | [DouDOU-start/airgate-studio](https://github.com/DouDOU-start/airgate-studio) |\n| **payment-epay** | extension | 多渠道支付：易支付（虎皮椒/彩虹）/ 支付宝官方 / 微信支付官方，含充值页、订单管理、服务商配置 | [DouDOU-start/airgate-epay](https://github.com/DouDOU-start/airgate-epay) |\n| **airgate-health** | extension | AI 提供商健康监控：主动探测、可用率/延迟聚合、对外公开状态页 | [DouDOU-start/airgate-health](https://github.com/DouDOU-start/airgate-health) |\n\n### 安装插件\n\n打开管理后台 → **插件管理** → 三种方式任选：\n\n```text\n1. 插件市场 → 点击「安装」    （从 GitHub Release 自动拉取，匹配当前架构）\n2. 上传安装 → 拖入二进制文件   （适合内部插件）\n3. GitHub 安装 → 输入 owner/repo（适合未列入市场的插件）\n```\n\n市场会**定时从 GitHub API 同步**每个插件的最新 release 版本（默认 6h，使用 ETag 不消耗 API 配额），也可以在市场页点刷新按钮手动同步。\n\n### 写一个自己的插件\n\n只需依赖 [airgate-sdk](https://github.com/DouDOU-start/airgate-sdk)，实现 `GatewayPlugin` 接口的几个方法即可：\n\n```go\ntype GatewayPlugin interface {\n    Info() PluginInfo                    // 元信息：ID、版本、账号字段、前端组件\n    Platform() string                    // 平台键\n    Models() []ModelInfo                 // 模型列表 + 单价（用于计费）\n    Routes() []RouteDefinition           // HTTP 路由声明\n    Forward(ctx, req) (*ForwardResult, error)  // 实际转发逻辑\n}\n```\n\n参考 [airgate-openai](https://github.com/DouDOU-start/airgate-openai) 完整范例，含 Makefile、release workflow、前端嵌入。\n\n## 🛠 技术栈\n\n| 层 | 技术 |\n|---|---|\n| 后端 | Go 1.25 · Gin · Ent ORM · PostgreSQL 17 · Redis 8 |\n| 前端 | React 19 · Vite · TanStack Query · Tailwind CSS |\n| 插件协议 | hashicorp/go-plugin (gRPC) |\n| 部署 | Docker Compose · GitHub Container Registry · 多架构 (amd64/arm64) |\n| 鉴权 | JWT + 管理员 API Key |\n\n## 🚀 部署\n\n两条路任选其一。两者都可以在生产使用。\n\n| 路径 | 适用场景 | 你需要自备 |\n|---|---|---|\n| **1A. 裸金属 install.sh** | 已经有 PostgreSQL + Redis，想要最轻量的部署，喜欢 systemd | PostgreSQL 15+ / Redis 7+ |\n| **1B. Docker Compose** | 干净的服务器，想一把梭把 pg + redis + core 全部用容器跑起来 | 仅 Docker |\n\n\u003e ⚠️ 二选一，不要混用。如果选 1A 又跑了 1B 的 docker compose，会出现两套数据库实例互相打架。\n\n### 方式 1A：裸金属安装（systemd，自备 PostgreSQL + Redis）\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash\n```\n\n[install.sh](deploy/install.sh) 会：\n\n1. 检测 OS / 架构（linux/amd64 或 linux/arm64）\n2. 从 GitHub Releases 下载对应平台的 `airgate-core-{os}-{arch}` 二进制（前端 SPA 与翻译文件已经 `//go:embed` 进 binary，单文件即可运行）\n3. 安装到 `/opt/airgate-core/airgate-core`，sha256 校验\n4. 创建系统用户 `airgate` 与目录 `/etc/airgate-core` / `/var/lib/airgate-core`\n5. 安装 systemd 服务 `airgate-core.service`\n\n脚本**不会**自动启动服务，也**不会**写 `config.yaml` —— 是为了让你审查一遍后再启动：\n\n```bash\nsudo systemctl start airgate-core\nsudo systemctl enable airgate-core\n\n# 然后浏览器访问 http://\u003cyour-host\u003e:9517，向导会引导你输入：\n#   - PostgreSQL 连接（已运行的 pg 实例）\n#   - Redis 连接（已运行的 redis 实例）\n#   - 管理员账号\n# 所有信息会写入 /etc/airgate-core/config.yaml\n```\n\n进入管理后台后到 **插件管理 → 插件市场** 按需安装 gateway-openai / gateway-claude / gateway-kiro / airgate-playground / airgate-studio / payment-epay / airgate-health 等插件（`/var/lib/airgate-core/plugins` 持久化）。\n\n**升级 / 卸载**：\n\n```bash\n# 升级到最新版本（保留配置和数据）\ncurl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- upgrade\n\n# 安装指定版本\ncurl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- -v v0.1.0\n\n# 卸载（默认保留 /etc/airgate-core 与 /var/lib/airgate-core）\ncurl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/install.sh | sudo bash -s -- uninstall -y\n```\n\n**常用命令**：\n\n```bash\nsudo systemctl status airgate-core    # 状态\nsudo journalctl -u airgate-core -f    # 日志\nsudo systemctl restart airgate-core   # 重启\n```\n\n### 方式 1B：Docker Compose（自带 PostgreSQL + Redis）\n\n```bash\nmkdir airgate \u0026\u0026 cd airgate\ncurl -sSL https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/docker-deploy.sh | bash\n\n# 检查生成的文件后启动\ndocker compose up -d\ndocker compose logs -f core\n```\n\n[docker-deploy.sh](deploy/docker-deploy.sh) 只准备文件 —— 不会替你 `up -d`，方便你审查后再启动：\n\n1. 检查 docker / docker compose 依赖\n2. 在当前目录创建 `data/{postgres,redis,plugins,uploads}` 子目录\n3. 下载 `docker-compose.yml`\n4. 用 `openssl rand` 生成 `DB_PASSWORD` / `REDIS_PASSWORD` / `JWT_SECRET` 写入 `.env`（权限 600）\n\n启动后访问 `http://\u003cyour-host\u003e:9517`，安装向导**自动跳过 DB / Redis 配置**（环境变量已就绪），只需要建管理员账号即可。\n\n所有持久化数据落在 `./data/`，备份直接 `tar czf backup.tgz data .env` 即可。\n\n**升级 / 卸载**：\n\n```bash\n# 升级到最新版本（在 docker-compose.yml 所在目录执行）\n# 默认 AIRGATE_IMAGE_TAG=latest，直接拉新镜像即可；如固定了版本，先在 .env 改 AIRGATE_IMAGE_TAG\ndocker compose pull\ndocker compose up -d\ndocker compose logs -f core\n\n# 升级到指定版本\nsed -i 's/^AIRGATE_IMAGE_TAG=.*/AIRGATE_IMAGE_TAG=v0.1.0/' .env\ndocker compose pull \u0026\u0026 docker compose up -d\n\n# 卸载（保留数据）：停止并删除容器，./data 与 .env 不动\ndocker compose down\n\n# 彻底卸载（连同数据一起删，操作前务必备份）\ndocker compose down\nrm -rf data .env docker-compose.yml\n```\n\n\u003e 升级前建议先 `tar czf backup-$(date +%F).tgz data .env` 备份一次。Core 启动时会自动执行数据库 migrate，无需手动操作。\n\n**关键环境变量**（完整列表见 [.env.example](deploy/.env.example)）：\n\n| 变量 | 说明 | 是否必填 |\n|---|---|---|\n| `DB_PASSWORD` | Postgres 密码，首次启动后请勿修改 | ✅ |\n| `REDIS_PASSWORD` | Redis 鉴权密码，建议 `openssl rand -hex 24`；不会持久化，可随时改后重启 | ✅ |\n| `JWT_SECRET` | JWT 签名密钥，建议 `openssl rand -hex 32` | ✅ |\n| `BIND_HOST` | 监听地址，反向代理后部署时改 `127.0.0.1` | ❌ |\n| `PORT` | 对外端口，默认 9517 | ❌ |\n| `TZ` | 时区，默认 `Asia/Shanghai` | ❌ |\n| `AIRGATE_IMAGE_TAG` | 镜像版本，默认 `latest`，可固定到 `v0.x.y` | ❌ |\n| `API_KEY_SECRET` | 用户 API Key 加密密钥，hex 编码 ≥64 字符 | ❌ |\n\n### 反向代理：Caddy + 自动 HTTPS（可选）\n\n如果想让 core 走 `https://your-domain` 而不是裸 `http://host:9517`，最省事的方案是用 [Caddy](https://caddyserver.com/)：自带 Let's Encrypt 自动签发与续期，配置只有十几行。下面以 Ubuntu / Debian 为例，1A / 1B 部署都适用。\n\n**前置条件**\n\n1. 域名 A 记录已经指向本机公网 IP；\n2. 防火墙 / 安全组放行 **80** 和 **443**（HTTP-01 验证 + HTTPS）；\n3. 9517 端口可以保留对外，也可以只允许本机访问 —— 由 Caddy 统一在 443 接收外部流量。\n\n**安装 Caddy**\n\n```bash\nsudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl\ncurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \\\n  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg\ncurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \\\n  | sudo tee /etc/apt/sources.list.d/caddy-stable.list\nsudo apt update \u0026\u0026 sudo apt install -y caddy\n```\n\n其它系统参考 [官方安装文档](https://caddyserver.com/docs/install)。安装完 Caddy 会以 systemd 服务跑起来，配置文件位于 `/etc/caddy/Caddyfile`。\n\n**配置 `/etc/caddy/Caddyfile`**\n\n把下面内容覆盖进去，改掉域名和邮箱即可：\n\n```caddyfile\nairgate.example.com {\n    encode zstd gzip\n\n    reverse_proxy 127.0.0.1:9517 {\n        # 关闭响应缓冲，保证 SSE / 流式输出实时返回\n        flush_interval -1\n\n        header_up Host                {host}\n        header_up X-Real-IP           {remote_host}\n        header_up X-Forwarded-For     {remote_host}\n        header_up X-Forwarded-Proto   {scheme}\n\n        # 大模型请求耗时较长，放宽超时\n        transport http {\n            read_timeout  30m\n            write_timeout 30m\n            dial_timeout  10s\n        }\n    }\n\n    header {\n        Strict-Transport-Security \"max-age=31536000; includeSubDomains\"\n        X-Content-Type-Options    \"nosniff\"\n        Referrer-Policy           \"strict-origin-when-cross-origin\"\n        -Server\n    }\n}\n```\n\n如果 core 跑在 docker compose 里、Caddy 跑在宿主机，`127.0.0.1:9517` 保持原样即可（compose 默认已经把 9517 映射到宿主机）。\n\n**应用 / 验证**\n\n```bash\nsudo caddy fmt --overwrite /etc/caddy/Caddyfile   # 格式化（可选）\nsudo systemctl reload caddy                       # 热加载，不会断连\nsudo journalctl -u caddy -f                       # 看证书签发日志\n```\n\n第一次 reload 后 Caddy 会自动向 Let's Encrypt 申请证书，几秒到几十秒后日志里出现 `certificate obtained successfully`，浏览器访问 `https://airgate.example.com` 即可。证书自动续期，无需人工干预。\n\n**几个常见坑**\n\n- **`flush_interval -1` 不能省**：默认会缓冲响应，SSE / 流式接口会变成\"一次性返回\"。\n- **超时一定要放宽**：大模型推理动辄几分钟，Caddy 默认反代超时不够。\n- **80 端口必须开**：Let's Encrypt 用 HTTP-01 验证，80 不通就签不到证书。调试期可在文件最上面加一段 `{ acme_ca https://acme-staging-v02.api.letsencrypt.org/directory }` 切到 staging，避开正式环境的速率限制。\n- **想关掉 9517 直连**：把 [deploy/docker-compose.yml](deploy/docker-compose.yml) 里 `core.ports` 改成 `127.0.0.1:9517:9517`，外网就只能从 Caddy 进来；裸金属部署同理，在 `config.yaml` 里把监听地址改成 `127.0.0.1`。\n\n### 方式 2：源码开发\n\n适合二次开发或贡献者。两条路任选其一：\n\n**A. 全容器（推荐，宿主机零依赖）**\n\n宿主机只需要 Docker。父目录同时克隆 [`airgate-sdk`](https://github.com/DouDOU-start/airgate-sdk) 与 [`airgate-core`](https://github.com/DouDOU-start/airgate-core)：\n\n```bash\nmkdir airgate \u0026\u0026 cd airgate\ngit clone https://github.com/DouDOU-start/airgate-sdk.git\ngit clone https://github.com/DouDOU-start/airgate-core.git\n\ncd airgate-core\ndocker compose -f deploy/docker-compose.dev.yml up\n```\n\n[deploy/docker-compose.dev.yml](deploy/docker-compose.dev.yml) 会拉起 postgres + redis，构建 sdk / core 前端，最后用 `go run ./cmd/server` 启动 core，全部跑在容器里。访问 `http://localhost:9517` 即可。\n\n**B. 宿主机直跑**\n\n需要 Go 1.25+、Node 22+、本地 Postgres + Redis，以及兄弟目录 [`airgate-sdk`](https://github.com/DouDOU-start/airgate-sdk)：\n\n```bash\ngit clone https://github.com/DouDOU-start/airgate-sdk.git\ngit clone https://github.com/DouDOU-start/airgate-core.git\ncd airgate-core\n\nmake install   # 安装前后端依赖\nmake dev       # 启动前后端开发服务器\n```\n\n更多命令见 `make help`。\n\n\u003e ⚠️ **不要使用 dev compose 上生产**。它用 `go run` 启动、源码 bind-mount 进容器、密码全部硬编码（`airgate` / `airgate-dev`），仅供本地开发。生产请走方式 1A 或 1B。\n\n## 🏗 架构\n\n```text\n                     ┌──────────────────────────────────────────┐\n                     │         AirGate Core (本仓库)            │\n                     │  ┌─────────┐  ┌─────────┐  ┌──────────┐  │\n   用户/管理员  ────► │  │  HTTP   │  │  调度   │  │   计费   │  │\n                     │  │  路由   │  │  限流   │  │  订阅    │  │\n                     │  └────┬────┘  └────┬────┘  └────┬─────┘  │\n                     │       │  Plugin Manager (gRPC)  │        │\n                     │       └────────────┬─────────────┘       │\n                     └────────────────────┼─────────────────────┘\n                                          │ go-plugin\n                          ┌───────────────┼───────────────┐\n                          ▼               ▼               ▼\n                   ┌──────────────┐┌──────────────┐┌──────────────┐\n                   │ gateway-     ││ gateway-     ││ payment-     │\n                   │ openai       ││ claude       ││ epay         │\n                   │ (子进程)     ││ (子进程)     ││ (子进程)     │\n                   └──────┬───────┘└──────┬───────┘└──────────────┘\n                          │ HTTPS         │ HTTPS\n                          ▼               ▼\n                     OpenAI / ChatGPT   Anthropic\n```\n\n**请求生命周期**：\n\n```text\n用户请求 ──► Core 鉴权 ──► Core 选账号 ──► Plugin.Forward() ──► 上游 AI API\n                                              │\n                                              ▼\n                                         ForwardResult\n                                       ┌──────┴──────┐\n                                  token 用量      账号状态反馈\n                                  Core 计费       Core 更新账号\n```\n\n## 📁 项目结构\n\n```text\nairgate-core/\n├── backend/                  # Go 后端\n│   ├── cmd/server/           # 入口\n│   ├── internal/\n│   │   ├── server/           # HTTP 路由 + 中间件\n│   │   ├── plugin/           # 插件生命周期 + 市场 + 转发\n│   │   ├── scheduler/        # 账号调度\n│   │   ├── billing/          # 计费与用量\n│   │   ├── ratelimit/        # 限流\n│   │   └── app/              # 业务用例（按领域拆分）\n│   └── ent/                  # 数据库 ORM (Ent)\n├── web/                      # 管理后台 (React + Vite)\n│   └── src/\n│       ├── pages/admin/      # 管理页面\n│       ├── shared/api/       # API 客户端\n│       └── i18n/             # zh / en 文案\n├── deploy/                       # 部署\n│   ├── install.sh                # 裸金属安装脚本（systemd，curl | sudo bash）\n│   ├── docker-deploy.sh          # docker compose 部署准备脚本（curl | bash）\n│   ├── airgate-core.service      # systemd unit\n│   ├── docker-compose.yml        # 生产编排（拉取 ghcr.io 镜像）\n│   ├── docker-compose.dev.yml    # 开发编排（源码挂载）\n│   ├── Dockerfile                # 多阶段构建\n│   ├── config.docker.yaml        # 镜像内置默认配置\n│   └── .env.example              # docker 部署的环境变量模板\n├── .github/workflows/\n│   ├── ci.yml                    # PR 检查\n│   └── release.yml               # tag 触发：多架构镜像 + 跨平台二进制\n└── Makefile\n```\n\n## 🔧 运维要点\n\n- **健康检查**：`GET /healthz` 公开端点，docker / k8s 直接用\n- **二进制完全自包含**：前端 SPA 与翻译文件均通过 `//go:embed` 打进二进制，install.sh 部署只有一个文件，没有额外的静态资源目录需要管理\n- **数据持久化**：\n  - **裸金属（1A）**：`/var/lib/airgate-core/{plugins,uploads}` + `/etc/airgate-core/config.yaml`，PostgreSQL / Redis 由用户自行管理\n  - **Docker（1B）**：所有数据落在 `./data/{postgres,redis,plugins,uploads}` 四个 bind mount，备份只需 `tar czf backup.tgz data .env`\n- **升级**：\n  - 裸金属：`curl -sSL .../install.sh | sudo bash -s -- upgrade`\n  - Docker：改 `.env` 里的 `AIRGATE_IMAGE_TAG` → `docker compose pull \u0026\u0026 docker compose up -d`\n- **数据库迁移**：Ent schema 变更通过 `make ent` 生成代码，core 启动时自动 migrate\n- **插件升级**：管理后台插件市场点刷新 → 卸载旧版本 → 重新安装\n\n\u003e **Docker 存量用户从 named volume 迁移**：旧版 compose 使用 `postgres_data` / `redis_data` / `airgate_plugins` / `airgate_uploads` 四个命名 volume，新版改为 `./data/*` bind mount。迁移步骤：\n\u003e ```bash\n\u003e docker compose down\n\u003e mkdir -p data/postgres data/redis data/plugins data/uploads\n\u003e docker run --rm -v \u003cproject\u003e_postgres_data:/from -v $(pwd)/data/postgres:/to alpine cp -a /from/. /to/\n\u003e docker run --rm -v \u003cproject\u003e_redis_data:/from    -v $(pwd)/data/redis:/to    alpine cp -a /from/. /to/\n\u003e docker run --rm -v \u003cproject\u003e_airgate_plugins:/from -v $(pwd)/data/plugins:/to alpine cp -a /from/. /to/\n\u003e docker run --rm -v \u003cproject\u003e_airgate_uploads:/from -v $(pwd)/data/uploads:/to alpine cp -a /from/. /to/\n\u003e curl -O https://raw.githubusercontent.com/DouDOU-start/airgate-core/master/deploy/docker-compose.yml\n\u003e docker compose up -d\n\u003e # 验证一切正常后再删除旧的命名 volume\n\u003e docker volume rm \u003cproject\u003e_postgres_data \u003cproject\u003e_redis_data \u003cproject\u003e_airgate_plugins \u003cproject\u003e_airgate_uploads\n\u003e ```\n\u003e `\u003cproject\u003e` 是 docker compose 自动生成的项目前缀（默认是当前目录名），`docker volume ls` 可以查看实际名字。\n\n## 🤝 贡献 / 反馈\n\n- Bug / Feature: [Issues](https://github.com/DouDOU-start/airgate-core/issues)\n- 插件开发文档: [airgate-sdk](https://github.com/DouDOU-start/airgate-sdk)\n- 参考插件实现: [airgate-openai](https://github.com/DouDOU-start/airgate-openai)\n\n## 📜 License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoudou-start%2Fairgate-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoudou-start%2Fairgate-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoudou-start%2Fairgate-core/lists"}