Files
sub2api/LOCAL_SETUP_NOTES.md
mini 623a7518b2 fix(docs): remove iShare mention (puro 独立运营定位)
- docs.sections.getKey.note 键从 zh/en 删除
- DocsView 对应 <p class="note"> 段删掉
- 全仓再次 grep 确认无其他 ishare/iShare 引用
2026-04-23 13:08:43 +08:00

169 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sub2API 本地开发环境搭建记录
> 2026-04-19 @ macOS (darwin/arm64)
## 一、环境依赖
| 项 | 版本 | 说明 |
|---|---|---|
| Go | 1.24.3(本机)→ 1.26.2auto via GOTOOLCHAIN | go.mod 要求 1.26.2,靠 Go 1.21+ 的 GOTOOLCHAIN 机制自动下载 |
| Node | v24.13.0 | ≥18 即可 |
| pnpm | v10.33.0 | 现装:`npm install -g pnpm` |
| Docker | OrbStack | 已跑 mysql8@3306,端口冲突规避见下 |
| 端口占用 | 8080 / 5433 / 6380 均空闲 | 5432/6379 留给可能的其他 PG/Redis |
## 二、部署步骤(实际执行)
### 1. 拉源码
```bash
git clone https://github.com/Wei-Shaw/sub2api.git /Users/mini/Work/dev/sub2api
```
### 2. 起依赖容器(非默认端口)
```bash
docker run -d --name sub2api-pg \
-e POSTGRES_PASSWORD=devpass -e POSTGRES_DB=sub2api \
-p 5433:5432 postgres:15
docker run -d --name sub2api-redis \
-p 6380:6379 redis:7
```
### 3. 安装 pnpm首次
```bash
npm install -g pnpm
```
### 4. 构建前端
```bash
cd /Users/mini/Work/dev/sub2api/frontend
pnpm install # ~9 秒
pnpm run build # ~8 秒,产物输出到 ../backend/internal/web/dist/
```
### 5. 构建后端(⚠️ 必带 `-tags embed`
```bash
cd /Users/mini/Work/dev/sub2api/backend
go build -tags embed -o sub2api ./cmd/server
# 产物105MB Mach-O 64-bit arm64
```
### 6. 生成 config.yaml
```bash
cp /Users/mini/Work/dev/sub2api/deploy/config.example.yaml \
/Users/mini/Work/dev/sub2api/backend/config.yaml
```
修改四处(见下方问题点 Issue #1 说明 sslmode
| 字段 | 原值 | 改为 |
|---|---|---|
| `database.port` | 5432 | **5433** |
| `database.password` | `"your_secure_password_here"` | `"devpass"` |
| `database.sslmode` | `"prefer"` | **`"disable"`** |
| `redis.port` | 6379 | **6380** |
| `jwt.secret` | `"change-this-..."` | `openssl rand -hex 32` 产出的 64 位 hex |
### 7. 启动 + 验证
```bash
cd /Users/mini/Work/dev/sub2api/backend
nohup ./sub2api > /tmp/sub2api.log 2>&1 &
# 等 5-10 秒让服务完成 pricing 数据下载
curl -si http://localhost:8080 | head
# 期望HTTP/1.1 200 OKHTML 含 <title>Sub2API - AI API Gateway</title>
```
---
## 三、遇到的问题与解法
### Issue #1 — `sslmode: "prefer"` 启动失败
**现象**:后端启动立即退出,日志:
```
Failed to initialize application: acquire migrations lock:
pq: unsupported sslmode "prefer"; only "require" (default),
"verify-full", "verify-ca", and "disable" supported
```
**根因**`config.example.yaml` 默认的 `sslmode: "prefer"` 是 libpqC 驱动的模式Go 的 `lib/pq` 不支持。
**解法**:本地 Docker Postgres 没配 SSL改成 `disable`
```yaml
database:
sslmode: "disable"
```
生产若走带 SSL 的 PG`require``verify-full`
---
### Issue #2 — go.mod 要求 Go 1.26.2,本机只有 1.24.3
**现象**:首次 `go build` 触发:
```
go: downloading go1.26.2 (darwin/arm64)
```
**根因**`backend/go.mod` 第一行 `go 1.26.2` 写死。
**解法****无需手动升级 Go**。Go 1.21+ 的 GOTOOLCHAIN 机制会自动下载指定版本并透明切换。首次 build 比较慢(下载 toolchain + 全部依赖),后续会缓存。
---
### Issue #3 — frontend 构建产物路径是相对路径到 backend
**现象**`pnpm run build` 的日志显示产物写到 `../backend/internal/web/dist/`
**说明****这是预期行为**。Vite 配置把输出指向 backend 的 embed 目录,配合 `go build -tags embed` 把 dist 打进 Go 二进制。所以:
- 每次改前端代码都要重新 `pnpm run build` 然后 `go build -tags embed`
- 如果 `go build` 时忘了 `-tags embed`,后端启动后访问 `/` 会 404
---
### Issue #4 — 日志文件 `/app/data/logs/sub2api.log` 写入失败
**现象**:启动日志里有 WARN
```
日志文件输出初始化失败,降级为仅标准输出
path=/app/data/logs/sub2api.log err=mkdir /app: read-only file system
```
**根因**:默认配置指向容器内路径 `/app/data/logs/`,本地裸跑在 macOS 上 `/app` 不可写。
**影响**:无功能影响,只是降级到 stdout。我们用 `nohup ./sub2api > /tmp/sub2api.log 2>&1 &` 已经把 stdout 重定向了,日志照样完整。
**若要消除 WARN**:修改 config 里 `logging.file_path`(或等同字段)指向本地可写路径,如 `/tmp/sub2api/logs/sub2api.log`,并 `mkdir -p` 目录。
---
## 四、当前状态
```
Backend PID: 26921
HTTP: 200 @ http://localhost:8080
页面: Sub2API - AI API GatewaySetup Wizard 入口)
Pricing: 已下载 177 个模型价格
Containers: sub2api-pg (Up), sub2api-redis (Up)
```
---
## 五、下次重启命令
```bash
# 启动依赖(容器如果 stopped
docker start sub2api-pg sub2api-redis
# 启动后端
cd /Users/mini/Work/dev/sub2api/backend
nohup ./sub2api > /tmp/sub2api.log 2>&1 &
# 停止
pkill -f "/Users/mini/Work/dev/sub2api/backend/sub2api"
docker stop sub2api-pg sub2api-redis
```
## 六、清理重来
```bash
pkill -f "/Users/mini/Work/dev/sub2api/backend/sub2api"
docker rm -f sub2api-pg sub2api-redis
rm -rf /Users/mini/Work/dev/sub2api
```