feat: 前端后端地址改为 NEXT_PUBLIC_API_BASE 可配置,补全 .env.example

- 部署到云服务器后浏览器不能再连 localhost:8000,API_BASE 现可经
  NEXT_PUBLIC_API_BASE 指定(未设置时保持本地默认值,行为不变)
- .env.example 补全数据库/监听端口/各 provider/向量与重排的完整变量

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-10-24 19:38:44 +08:00
co-authored by Claude Code
parent db3c720b78
commit 7f731abb17
2 changed files with 28 additions and 6 deletions
+24 -5
View File
@@ -1,4 +1,17 @@
# Optional: configure providers here, or add a model from the web UI.
# ===== 运行与存储 =====
# 数据库 / 上传 / 数据目录(默认相对 backend 目录,可按需改为绝对路径)
DATABASE_URL=sqlite+aiosqlite:///./data/bookmate.db
UPLOAD_DIR=./uploads
DATA_DIR=./data
# 后端监听(云端部署时 API_HOST 保持 0.0.0.0,由 nginx 反代)
API_HOST=0.0.0.0
API_PORT=8000
# ===== 模型 Provider(至少配一个;也可启动后在网页「管理模型」里添加)=====
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_MODEL=deepseek-chat
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o
@@ -6,10 +19,16 @@ OPENAI_MODEL=gpt-4o
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-sonnet-4-20250514
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_MODEL=deepseek-chat
OPENROUTER_API_KEY=
OPENROUTER_MODEL=openrouter/auto
# Optional embedding/reranking; empty keys use keyword retrieval.
# ===== 向量检索 & 重排(OpenAI 兼容 API,如硅基流动 SiliconFlow)=====
# embedding_base_url: 支持 OpenAI 兼容 /embeddings 的端点前缀
EMBEDDING_BASE_URL=https://api.siliconflow.cn/v1
EMBEDDING_API_KEY=
EMBEDDING_MODEL=BAAI/bge-m3
# rerank: 硅基流动使用 /v1/rerank,OpenAI 不提供;留空则跳过重排
RERANK_BASE_URL=https://api.siliconflow.cn/v1
RERANK_API_KEY=
RERANK_MODEL=BAAI/bge-reranker-v2-m3
EMBEDDING_BATCH_SIZE=64
+4 -1
View File
@@ -89,7 +89,10 @@ export interface McpToolInfo {
input_schema?: unknown;
}
const API_BASE = "http://localhost:8000/api";
// 部署时通过 NEXT_PUBLIC_API_BASE 指定后端地址(如 https://bookmate.example.com/api);
// 未设置时保持本地开发默认值 http://localhost:8000/api
const API_BASE =
(process.env.NEXT_PUBLIC_API_BASE || "http://localhost:8000/api").replace(/\/+$/, "");
async function request<T>(path: string, options?: RequestInit): Promise<T> {
const res = await fetch(`${API_BASE}${path}`, {