[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-11139":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":14,"starSnapshotCount":14,"syncStatus":13,"lastSyncTime":28,"discoverSource":29},11139,"karpov-gateway","MiChongs\u002Fkarpov-gateway","MiChongs","Karpov Gateway — REST API gateway + Next.js console. Go (Gin+gRPC) + PostgreSQL + Redis + OAuth2 (Linux.do) + TOTP 2FA + encrypted credential pool",null,"Go",156,26,2,0,3,4,45,9,56.79,"MIT License",false,"main",true,[],"2026-06-12 04:00:53","# Karpov Gateway\n\n> 一体化 API 网关 + 控制台。Go 后端（Gin + gRPC）+ Next.js 前端（App Router + shadcn\u002Fui），自带凭据池、邮件验证、Linux.do OAuth2 SSO、配额计费、TOTP 二步验证。\n\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](.\u002FLICENSE)\n[![Go](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-1.24+-00ADD8?logo=go)](https:\u002F\u002Fgo.dev\u002F)\n[![Next.js](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNext.js-16-black?logo=next.js)](https:\u002F\u002Fnextjs.org\u002F)\n\n## ✨ Features\n\n- **统一 REST 网关** — 单进程或多 service 模式，gateway → auth\u002Fmusic\u002Fpool\u002Fquota\u002Fbilling\u002Fworker gRPC 后端可独立部署\n- **凭据池 (encrypted)** — KEK + DEK 信封加密，AES-256-GCM with AAD，POOL_KEK_HEX 主密钥派生\n- **邮箱注册 + 激活** — SMTP 发码 \u002F 激活链接，双重保险（验证码 + 邮件链接），未配置 SMTP 自动 demote 到 LogSender\n- **OAuth2 第三方登录** — Linux.do SSO（PKCE S256 + HMAC 签名 state cookie），登录 \u002F 绑定 \u002F 解绑三态决策，token 加密落库\n- **配额 \u002F 计费** — PlanQuotaMiddleware 在 gateway 层兜底，business service 内部按 plan + scope 二次校验\n- **TOTP 二步** — `pquerna\u002Fotp` + Redis 重放保护\n- **审计日志** — 结构化 JSON，按 type 分文件，每天滚动\n- **CSRF + Session** — `sid` httpOnly cookie + `X-CSRF-Token` 头双校验\n- **shadcn\u002Fui 控制台** — Next.js 16 App Router + Radix + Tailwind v4\n\n## 🏗 仓库结构\n\n```\nkarpov-gateway\u002F\n├── gateway\u002F             # Go 后端 (Gin + gRPC)\n│   ├── cmd\u002F             # 各 service 入口 (gateway\u002Fauth\u002Fmusic\u002Fpool\u002F...)\n│   ├── internal\u002F        # 业务实现 (private)\n│   ├── api\u002F             # protobuf 定义\n│   ├── migrations\u002F      # PostgreSQL schema\n│   ├── go.mod           # Go 模块 (go 1.24+)\n│   └── Dockerfile\n├── web\u002F                 # Next.js 16 前端控制台\n│   ├── src\u002F             # App Router pages + components\n│   ├── middleware.ts    # CSRF \u002F session \u002F CSP nonce\n│   ├── package.json     # pnpm workspace\n│   └── Dockerfile\n├── deploy\u002F\n│   ├── compose\u002F         # 本地开发 (PG + Redis + pgAdmin)\n│   └── compose-prod\u002F    # 生产单机 (gateway + web + PG + Redis 全栈)\n└── .github\u002Fworkflows\u002F   # GitHub Actions CI (lint \u002F test \u002F build \u002F govulncheck \u002F gosec)\n```\n\n## 🚀 Quick Start\n\n### 1. 前置要求\n\n| 工具       | 版本    |\n| ---------- | ------- |\n| Go         | 1.24+   |\n| Node.js    | 20.11+  |\n| pnpm       | 9+      |\n| Docker     | 24+     |\n| PostgreSQL | 14+     |\n| Redis      | 7+      |\n\n### 2. 启动依赖（Postgres + Redis + pgAdmin）\n\n```bash\ncd deploy\u002Fcompose\ncp .env.example .env       # 改强密码！\ndocker compose up -d\n```\n\n### 3. 启动 Gateway 后端\n\n```bash\ncd gateway\ncp .env.example .env       # 与 deploy\u002Fcompose\u002F.env 的 PG\u002FRedis 密码保持一致\ngo mod download\ngo run .\u002Fcmd\u002Fqqmusic-gateway\n# 默认 :8080 (HTTP) + :9000 (gRPC)\n# 首次启动会在 stderr 打印一个 superadmin 账号 + 临时密码\n```\n\n### 4. 启动 Web 控制台\n\n```bash\ncd web\ncp .env.example .env.local\npnpm install\npnpm dev\n# http:\u002F\u002Flocalhost:3000\n```\n\n## 🐳 生产部署 (Docker Compose 单机)\n\n```bash\ncd deploy\u002Fcompose-prod\ncp .env.example .env\n# 编辑 .env：填入真域名 \u002F 强密码 \u002F SMTP 凭据 \u002F OAuth client\nnano .env\n\n# 生成 KEK\nopenssl rand -hex 32     # → 写到 POOL_KEK_HEX=\n\ndocker compose up -d --build\ndocker compose logs -f gateway\n```\n\n注意事项：\n\n- `NEXT_PUBLIC_APP_URL` 改了**必须** `docker compose build --no-cache web`，因为它会被 inline 进 client bundle\n- 反向代理（Nginx\u002FCaddy）后必须开 `TRUST_PROXY=true`，否则 X-Forwarded-Proto 不生效\n- KEK 一旦改变，旧凭据池 \u002F 旧 OAuth token **全部不可读**\n\n## 🔐 OAuth2 (Linux.do) 接入\n\n1. 去 [https:\u002F\u002Fconnect.linux.do](https:\u002F\u002Fconnect.linux.do) 申请应用\n2. 回调地址填：`https:\u002F\u002Fyour-domain\u002Fv1\u002Fauth\u002Foauth\u002Flinuxdo\u002Fcallback`\n3. 把拿到的 client_id \u002F client_secret 写到 `.env`：\n   ```\n   OAUTH_LINUXDO_ENABLED=true\n   OAUTH_LINUXDO_CLIENT_ID=...\n   OAUTH_LINUXDO_CLIENT_SECRET=...\n   OAUTH_LINUXDO_MIN_TRUST_LEVEL=1\n   OAUTH_PUBLIC_BASE=https:\u002F\u002Fyour-domain\n   OAUTH_FRONTEND_BASE=https:\u002F\u002Fyour-domain\n   ```\n4. 重启 gateway，登录页 \u002F 注册页会自动出现 \"Linux.do 一键登录\"\n\n## 🧪 测试 \u002F Lint\n\n```bash\n# Go\ncd gateway\ngo vet .\u002F...\ngo test -race .\u002F...\ngolangci-lint run --timeout=5m\n\n# Web\ncd web\npnpm lint\npnpm typecheck\n```\n\n## 📦 关键依赖\n\n**后端**：\n\n- [gin-gonic\u002Fgin](https:\u002F\u002Fgithub.com\u002Fgin-gonic\u002Fgin) — HTTP 框架\n- [grpc-ecosystem](https:\u002F\u002Fgithub.com\u002Fgrpc-ecosystem) — gRPC + gateway\n- [jackc\u002Fpgx](https:\u002F\u002Fgithub.com\u002Fjackc\u002Fpgx\u002Fv5) — PostgreSQL 驱动\n- [redis\u002Fgo-redis](https:\u002F\u002Fgithub.com\u002Fredis\u002Fgo-redis) — Redis 客户端\n- [golang.org\u002Fx\u002Foauth2](https:\u002F\u002Fpkg.go.dev\u002Fgolang.org\u002Fx\u002Foauth2) — OAuth2 \u002F PKCE\n- [pquerna\u002Fotp](https:\u002F\u002Fgithub.com\u002Fpquerna\u002Fotp) — TOTP\n\n**前端**：\n\n- [Next.js 16](https:\u002F\u002Fnextjs.org\u002F) (App Router + Turbopack)\n- [shadcn\u002Fui](https:\u002F\u002Fui.shadcn.com\u002F) + [Radix](https:\u002F\u002Fwww.radix-ui.com\u002F)\n- [Tailwind CSS v4](https:\u002F\u002Ftailwindcss.com\u002F)\n- [next-auth-csrf](https:\u002F\u002Fgithub.com\u002Fedge-runtime\u002F) edge-safe CSRF\n\n## 📜 License\n\nMIT — 见 [LICENSE](.\u002FLICENSE)\n\n## 🤝 Contributing\n\nPR \u002F Issue 欢迎。提 PR 前请：\n\n1. `golangci-lint run` + `gofmt -l .` 全绿\n2. `go test -race .\u002F...` 全绿\n3. Web 改动跑 `pnpm lint && pnpm typecheck`\n4. 不要提交 `.env` \u002F `data\u002F.kek` 或任何包含真实密码的文件\n\n## 🔒 Security\n\n发现安全问题请直接联系 maintainer，**不要**开 public issue。\n\n---\n\nBuilt with ❤️ by [MiChongs](https:\u002F\u002Fgithub.com\u002FMiChongs)\n","Karpov Gateway 是一个集成了 REST API 网关和 Next.js 控制台的一体化解决方案。该项目使用 Go 语言（Gin + gRPC）构建后端，结合 PostgreSQL 和 Redis 进行数据存储，并支持 OAuth2 单点登录、TOTP 二步验证以及加密凭据池等功能。其核心功能包括统一的 REST 网关、凭据管理、用户认证与授权、配额计费系统等。适合需要高安全性、可扩展性和易维护性的企业级应用开发场景，如微服务架构下的 API 管理、身份验证及权限控制等。","2026-06-11 03:31:14","CREATED_QUERY"]