projects / gpt-communicate.md private repo

gpt-communicate

暂无项目说明。

TypeScript
owner demonerdpity
language TypeScript
topics 01
reader / README.md markdown render

GPT Communicate

基于 ChatGPT Next Web 改造的多人 GPT 对话平台,适合小范围同学、团队或朋友共用一个服务端 OpenAI API Key。项目保留原有聊天界面和浏览器本地会话存储,同时新增账号、独立管理员端、额度、模型倍率、用量记录和 Docker 部署能力。

当前定位

这个项目不是公开商业 SaaS,而是一个轻量自部署工具:

  • 任何人可以开放注册。
  • 新用户默认 0 点,需要管理员分配额度后才能对话。
  • 用户只通过服务端配置的 OPENAI_API_KEY 对话。
  • 管理员端独立运行,默认 Docker 宿主机端口为 32101
  • 管理员账号使用 .env 中的 ADMIN_ID 和密码配置,不存放在用户表。
  • 系统记录账号、额度、用量统计和流水,不记录完整聊天内容。
  • 聊天记录仍保存在用户自己的浏览器 localStorage 中。

原始项目来源:ChatGPT Next Web

功能概览

用户侧

  • 注册、登录、退出。
  • 登录后才能进入聊天页面。
  • 侧边栏显示用户名和剩余点数。
  • 有余额时可以正常对话。
  • 模型下拉框只显示管理员后台启用的模型。
  • 点数不足、模型未启用时会返回中文提示。
  • 聊天上下文和历史记录继续保存在当前用户浏览器本地。

管理员侧

  • 管理员端和用户端分开运行,Docker 默认宿主机端口分别为 3210132100
  • 管理员身份通过 ADMIN_IDADMIN_PASSWORDADMIN_PASSWORD_HASH 配置。
  • 管理用户列表、状态和额度。
  • 给用户加点、减点、设置总点数。
  • 查看近期用量记录。
  • 配置可用模型、显示名、倍率、排序、启用状态和备注。
  • 导出用户余额 CSV、用量明细 CSV、费用分摊 CSV。

额度与计费

  • 额度单位为“点”。
  • 请求前按 输入 token + 最大输出 token 乘模型倍率预留点数。
  • 请求成功后按实际估算用量结算,并释放未使用的预留点。
  • 请求失败会写入失败记录,并释放预留点。
  • token 目前为估算值,适合内部费用分摊,不等同于 OpenAI 官方账单精确值。

隐私边界

数据库保存:

  • 用户账号。
  • session。
  • 用户额度。
  • 额度流水。
  • 用量统计。
  • 模型配置。

数据库不保存:

  • 用户完整对话内容。
  • 用户上下文历史。
  • 用户浏览器 localStorage 中的聊天会话。

技术栈

  • Next.js 13
  • React 18
  • Zustand
  • Prisma
  • SQLite
  • Docker / Docker Compose

本地开发

1. 安装依赖

npm install

如果需要严格按锁文件安装,例如 CI 或部署环境,可以使用:

npm ci

2. 配置环境变量

cp .env.template .env

至少配置:

OPENAI_API_KEY=sk-xxxx
LOCAL_DATABASE_URL=file:./dev.db
DOCKER_DATABASE_URL=file:/app/data/prod.db
APP_MODE=user
ADMIN_ID=admin
ADMIN_PASSWORD=你的管理员密码
HIDE_USER_API_KEY=1
CODE=

说明:

  • 用户端使用 APP_MODE=user,默认访问 http://localhost:32100
  • 本地 npm 命令会自动使用 LOCAL_DATABASE_URL,不用手动切换 Docker 数据库路径。
  • 管理端开发时另起一个进程执行 npm run dev:admin
  • 管理员账号只读取 ADMIN_IDADMIN_PASSWORD/ADMIN_PASSWORD_HASH,不会从普通用户表提权。
  • 平台模式建议保持 CODE= 为空,避免原项目访问码逻辑干扰账号系统。
  • 平台模式建议保持 HIDE_USER_API_KEY=1,用户不能填写自己的 API Key。

3. 初始化数据库

npm run db:generate
npm run db:migrate
npm run db:seed

4. 启动开发服务

npm run dev

默认访问:

http://localhost:32100

管理端本地开发可在另一个终端启动:

npm run dev:admin

默认访问:

http://localhost:32101

如果在 WSL 或受限环境中遇到端口绑定问题,可以改用:

npm run dev -- -H 127.0.0.1 -p 32100

Docker 部署

1. 准备环境变量

cp .env.template .env

生产环境建议至少配置:

OPENAI_API_KEY=sk-xxxx
DOCKER_DATABASE_URL=file:/app/data/prod.db
PORT=32100
ADMIN_PORT=32101
ADMIN_ID=admin
ADMIN_PASSWORD=你的管理员密码
HIDE_USER_API_KEY=1
CODE=
BILLING_DEFAULT_MAX_TOKENS=1000

可选配置模型初始化:

DEFAULT_MODEL_CONFIGS=[{"model":"gpt-4o-mini","displayName":"GPT 4o Mini","multiplier":1,"enabled":true,"sortOrder":1}]

2. 构建镜像

docker compose build

3. 启动服务

docker compose up -d

默认端口:

用户端: http://localhost:32100
管理端: http://localhost:32101

如果要改宿主机端口:

PORT=39100
ADMIN_PORT=39101

然后重新启动:

docker compose up -d

4. 查看日志

docker compose logs -f

容器启动时会自动执行:

prisma migrate deploy

如果配置了 DEFAULT_MODEL_CONFIGS,还会执行模型 seed。

5. 停止服务

docker compose down

注意:默认数据库保存在 Docker volume gpt_communicate_data 中,docker compose down 不会删除数据。不要随意执行 docker compose down -v,这会删除 volume 和 SQLite 数据。

生产数据与备份

Docker 生产数据库默认路径:

/app/data/prod.db

备份 SQLite 数据库:

docker compose exec gpt-communicate sh -c 'cp /app/data/prod.db /app/data/prod.db.bak'
docker cp gpt-communicate:/app/data/prod.db.bak ./prod.db.bak

恢复时先停止容器,再把备份放回 /app/data/prod.db 对应 volume。恢复前建议保留当前数据库副本。

管理员使用流程

  1. 配置 .env 中的 ADMIN_IDADMIN_PASSWORD,生产环境也可以改用 ADMIN_PASSWORD_HASH
  2. 启动用户端和管理端服务。
  3. 打开管理端,默认地址为 http://localhost:32101
  4. 使用管理员 ID 和密码登录。
  5. 在模型配置中添加并启用可用模型。
  6. 在用户额度中给用户分配点数。
  7. 用户有余额后即可在用户端对话。
  8. 需要对账时导出余额、用量或费用分摊 CSV。

模型配置建议

管理员后台中的模型名必须和 OpenAI API 请求中的模型名一致,例如:

gpt-4o-mini
gpt-5.5

倍率只是本平台内部点数倍率。例如:

  • 便宜模型:倍率 1
  • 更贵模型:倍率 3
  • 特别贵模型:倍率 5

一旦后台存在任意模型配置,系统会进入模型白名单模式:只有后台启用的模型会显示给用户,也只有启用模型可以被代理请求。

常用命令

本地开发:

npm run dev
npm run dev:admin
npm run lint
npm run build

数据库:

npm run db:generate
npm run db:migrate
npm run db:deploy
npm run db:seed
npm run db:studio

Docker:

docker compose config
docker compose build
docker compose up -d
docker compose logs -f
docker compose down

重要环境变量

OPENAI_API_KEY

必填。服务端使用的 OpenAI API Key。

LOCAL_DATABASE_URL

本地 npm 命令使用的 Prisma 数据库连接地址。

LOCAL_DATABASE_URL=file:./dev.db

DOCKER_DATABASE_URL

Docker Compose 使用的 Prisma 数据库连接地址。Compose 会把它映射成容器内的 DATABASE_URL

DOCKER_DATABASE_URL=file:/app/data/prod.db

APP_MODE

运行模式。用户端使用 user,管理端使用 admin

APP_MODE=user

ADMIN_ID

独立管理端登录 ID,不会匹配普通用户表。

ADMIN_ID=admin

ADMIN_PASSWORD

独立管理端登录密码。开发环境可以直接配置明文密码。

ADMIN_PASSWORD=change-me

ADMIN_PASSWORD_HASH

独立管理端登录密码哈希。生产环境建议使用哈希替代明文密码;设置后会优先使用哈希。

ADMIN_PORT

Docker 管理端宿主机端口。

ADMIN_PORT=32101

HIDE_USER_API_KEY

建议生产环境设置为:

HIDE_USER_API_KEY=1

这样用户不能填写自己的 API Key。

CODE

原项目访问码。当前账号/额度平台模式建议留空:

CODE=

BASE_URL

OpenAI 兼容接口地址。留空时使用默认 OpenAI API 地址。

BASE_URL=

如果使用兼容代理:

BASE_URL=https://your-openai-compatible-endpoint

PROXY_URL

容器内网络代理地址。通常留空。

PROXY_URL=

DEFAULT_MODEL_CONFIGS

可选。容器启动时初始化模型配置。

DEFAULT_MODEL_CONFIGS=[{"model":"gpt-4o-mini","displayName":"GPT 4o Mini","multiplier":1,"enabled":true}]

BILLING_DEFAULT_MAX_TOKENS

当请求没有携带 max_tokens 时,用于额度预留的默认最大输出 token。

BILLING_DEFAULT_MAX_TOKENS=1000

测试记录与需求文档

  • 需求文档
  • 测试记录

当前已知待办

上线前建议继续处理:

  • 清理生产日志,尤其是 access code、IP、代理路径等调试日志。
  • 浏览器手动测试后台页面、模型下拉框、余额刷新和移动端表格。
  • 完成 docker compose up -d 后的容器运行复测。
  • 配置 HTTPS 反向代理,例如 Caddy 或 Nginx。

许可证

本项目继承原 ChatGPT Next Web 的 MIT License。