第6章:环境搭建与本地开发流程
本章面向想要跑起本项目的开发者:从 Go/PostgreSQL/ffmpeg 前置条件,到 config.yaml 准备、envinit 初始化、webserver 启动、接口冒烟验证,以及本地没有 capcut-mate 时的降级开发模式。内容以 README 的流程为骨、以代码事实为肉。
流程
本地开发的标准路径是五步:
- 装前置:Go 1.25+、PostgreSQL 14+、ffmpeg(ASR 抽音频与切片裁剪都用它;Docker 镜像已内置,本地需自行安装并保证在 PATH 中)。
- 拉依赖与配置:
go mod download;cp internal/config/config.yaml.example internal/config/config.yaml,填入数据库连接、对象存储、APP_ASR_API_KEY、APP_LLM_API_KEY等密钥。 - 初始化数据库:
go run ./cmd/envinit init(建表 + 种子数据,见第 13、14 章);默认账号admin/admin,生产环境立刻reset-password改密。 - 启动服务:
go run ./cmd/webserver,监听http://localhost:30000。 - 验证:
curl http://localhost:30000/health返回{"status":"ok"};登录接口POST /openapi/live-mixer/v1/auth/login换取 JWT;打开http://localhost:30000/swagger/index.html查看全部接口契约。
密钥可以用环境变量临时覆盖而不改 yaml(Windows PowerShell:$env:APP_LLM_API_KEY="sk-xxx"),CI 与共享机器上避免把密钥写进文件。测试则一条 go test ./... 全量跑(前端在 frontend 目录 pnpm test)。
构建产物两个二进制:go build -o webserver.exe ./cmd/webserver 与 envinit.exe,与 Docker 镜像里的 /app/envinit 一致。
实现
本地开发的一个高频痛点是「没有 capcut-mate」——草稿生成无法本地闭环。仓库给出的解法是只起外部依赖容器:docker compose up -d capcut-mate nginx(在 backend/docker 下),然后把 capcut_mate.base_url 指向 http://localhost:81。这样 nginx 反代 capcut-mate,本地 Go 进程把它当成远端草稿服务,完整链路即可调试。
若干代码事实支撑这条流程:
config.Load("")传空路径时完全走「内嵌默认 + 环境变量」,所以最小启动甚至不需要 yaml(但数据库等密钥必须给全,否则启动即 Fatal)。envinit的init等价于schema+seed;reinit先 DropAllTables 再重建(清空重建,危险操作仅用于开发);reset-password -p直接改 admin 密码——这些子命令见第 13 章。- 前端本地启动(frontend 目录):
pnpm dev起 Vite 开发服务器,API 地址由环境配置指向本地或远端后端(src/utils/config.ts统一收敛,支持VITE_变量与运行时配置)。 cmd/test/main.go提供临时试验入口:写一次性验证代码放这里,不污染正式入口与业务包。
开发-提交链路上还有质量门禁:根目录 husky pre-commit 对暂存的前端文件跑 lint-staged(eslint + prettier + stylelint);CI 在 push 后跑 Go 全量测试与前端构建(第 50 章)。
📌 设计决策
- 不内置数据库容器:README 明确「服务不内置数据库」,要求自备 PostgreSQL——避免用户误用临时库丢数据,也简化镜像职责。
- ffmpeg 走 PATH 查找而非固定路径:同一份代码兼容本地开发(系统安装)与容器(镜像内置)。
- 本地联调 capcut-mate 用 compose 单独拉起:外部依赖容器化、业务代码本地跑,是「混合开发」的标准姿势。
代码示例
环境变量覆盖配置的完整启动序列(README 同款):
# 1. 准备本地配置
cp internal/config/config.yaml.example internal/config/config.yaml
# 编辑 config.yaml 填入数据库 / 存储 / 密钥
# 2. 建表 + 种子数据(默认账号 admin/admin)
go run ./cmd/envinit init
# 3. 启动(可用环境变量覆盖密钥)
APP_LLM_API_KEY=sk-xxx go run ./cmd/webserver
# 4. 冒烟验证
curl http://localhost:30000/health
curl -X POST http://localhost:30000/openapi/live-mixer/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"admin"}'
无 capcut-mate 本地闭环时,指向容器化的草稿服务:
cd backend/docker
docker compose up -d capcut-mate nginx
# 然后在 config.yaml 中:
# capcut_mate:
# base_url: http://localhost:81
小结
- 五步启动:前置 → 配置 → envinit → webserver → 冒烟;密钥优先环境变量。
- capcut-mate 缺席时单独容器化拉起并指 base_url,链路完整可调试。
- reinit/reset-password 等运维动作全部收敛在 envinit,不进主服务。
思考题
- 如何用 Docker 只起 PostgreSQL 而让其余全部本地跑?相比全容器化开发各有什么收益?
- 若团队多人共用一个开发数据库,envinit 的种子数据会产生什么冲突,如何规避?
项目信息
- GitHub仓库:github.com/Chyona/live-mixer
- 项目案例:gogoshine.com