Files
memind/docs/goosed-local-build-delivery.md

7.4 KiB
Raw Permalink Blame History

Goosed 本地构建与交付方案

方案特点: 完全本地化,no CI/CD 服务器,手工构建 + 手工交付。
适用场景: 开发验证阶段,103 部署前的完整测试。

📊 整体流程

代码变更
  ↓
git commit & git push (to git.tkmind.cn)
  ↓
本地手工构建
  ├─ bash scripts/verify-goosed-docker.sh local
  └─ docker image: tkmind/goosed:local
  ↓
本地验证通过 ✅(1–2 周)
  ↓
镜像交付 → 103(两个选项)
  ├─ 选项 A: docker save + scp
  └─ 选项 B: docker push (if Registry)

第一步:环境检查(初次一次性)

本地机器准备

# 1. 检查 Docker 版本
docker --version
# 需要: 20.10+

# 2. 检查 Docker Compose
docker-compose --version
# 需要: 2.0+

# 3. 检查磁盘空间
df -h | grep "/$"
# 需要: 至少 5GB 空闲(Rust 编译会用 23GB)

# 4. 测试 Docker 构建
docker build --version

Git 配置确认

cd /Users/john/Project/Memind

# 确认 origin 指向 git.tkmind.cn
git remote -v
# origin  git@git.tkmind.cn:tkmind/memind.git (fetch)
# origin  git@git.tkmind.cn:tkmind/memind.git (push)

# 确认分支
git branch -a

第二步:代码变更与提交

开发流程

# 1. 拉取最新代码
git pull origin main

# 2. 本地开发(修改代码、测试等)
# ...your changes...

# 3. 提交到 git.tkmind.cn
git add .
git commit -m "你的变更说明"
git push origin main

验证提交

# 检查代码是否已推送到 git.tkmind.cn
git log -1 --oneline  # 查看最新 commit
git push -u origin main  # 确保推送

第三步:本地构建镜像

方式 A:使用验证脚本(推荐)

cd /Users/john/Project/Memind

# 一键构建 + 启动 + 验证
bash scripts/verify-goosed-docker.sh local

# 脚本会:
# 1. 构建镜像 (812 分钟)
# 2. 启动容器
# 3. 等待容器就绪
# 4. 显示测试命令

方式 B:手工 docker build(更细致控制)

cd /Users/john/Project/Memind

# 构建镜像
docker build -f tkmind_go/Dockerfile.goosed \
  -t tkmind/goosed:local \
  tkmind_go/

# 验证镜像
docker images | grep goosed
# tkmind/goosed  local  50MB

# 启动容器
docker run -d --name goosed-test \
  -p 18006:18006 \
  -e GOOSE_HOST=0.0.0.0 \
  -e GOOSE_PORT=18006 \
  -e GOOSE_SERVER__SECRET_KEY=test-secret \
  -v goosed-test-data:/home/goose/.local/share/goose \
  tkmind/goosed:local

# 健康检查
curl http://127.0.0.1:18006/status

# 查看日志
docker logs goosed-test

第四步:本地验证

快速检查

# 1. 端点是否响应
curl -s http://127.0.0.1:18006/status | jq .

# 2. 容器进程是否运行
docker ps | grep goosed

# 3. 日志是否正常
docker logs goosed-test | tail -20

# 4. 资源使用(应该正常)
docker stats goosed-test

完整验证(可选但推荐)

# 1. 启动两个实例(模拟 103 场景)
docker-compose -f docker-compose.local.yml up -d

# 2. 监控资源
docker stats goosed-1 goosed-2

# 3. 测试持久化
docker-compose -f docker-compose.local.yml down -v
docker-compose -f docker-compose.local.yml up -d
# 验证 Session 数据是否保留

# 4. 清理
docker-compose -f docker-compose.local.yml down -v

第五步:镜像交付(供 103 使用)

选项 A:保存为文件(适合离线传输)

# 1. 保存镜像到 tar 文件
docker save tkmind/goosed:local -o goosed.tar

# 2. 检查文件大小
ls -lh goosed.tar
# 大约 5080MB

# 3. 传输到 103
# 方式 1: 通过 scp
scp goosed.tar john@103:~/incoming/

# 方式 2: 通过 rsync
rsync -av goosed.tar john@103:~/incoming/

# 4. 在 103 上导入(后续操作)
# docker load -i goosed.tar

选项 B:直接推送(需要 Docker Registry

如果 103 上有 Docker RegistryHarbor / Local Registry):

# 1. 标记镜像
docker tag tkmind/goosed:local registry.tkmind.cn/goosed:v1

# 2. 推送
docker push registry.tkmind.cn/goosed:v1

# 3. 在 103 上拉取
# docker pull registry.tkmind.cn/goosed:v1

选项 C:使用 Gitea Container Registry(如已启用)

# 1. 登录 Gitea Registry
# 需要先生成 Gitea token: https://git.tkmind.cn/user/settings/applications

docker login git.tkmind.cn -u your-username -p your-token

# 2. 标记镜像
docker tag tkmind/goosed:local git.tkmind.cn/tkmind/goosed:latest

# 3. 推送
docker push git.tkmind.cn/tkmind/goosed:latest

# 4. 在 103 上拉取
# docker pull git.tkmind.cn/tkmind/goosed:latest

📋 验证检查清单

在认为"本地验证完成"前,确保以下都通过:

  • Docker 镜像成功构建,无编译错误
  • 容器启动无异常,/status 端点返回 200
  • Session SQLite 数据库正常创建
  • 容器日志无 panic / segfault / 错误
  • 两实例同时运行(18006 + 18007)无冲突
  • 容器重启后数据持久化(卷挂载正常)
  • 性能稳定(至少 1 小时无异常)
  • 镜像文件成功保存或推送

以上全部通过 = 本地验证完成,可进行 103 部署。


常见问题

Q1:构建失败 - Rust 下载超时

A: Rust 镜像下载可能受网络影响。重试或配置代理:

# 清空缓存重试
docker buildx prune -a
docker build --no-cache -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/

# 或使用代理(如有)
docker build --build-arg HTTP_PROXY=http://proxy:8080 \
  -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/

Q2:容器启动后立即退出

A: 查看日志找原因:

docker logs <container-id>

# 常见原因:
# 1. GOOSE_SERVER__SECRET_KEY 环境变量缺失
# 2. SQLite 权限问题(goose 用户无写权限)
# 3. 数据卷挂载错误

Q3:镜像太大,无法传输

A: 可以先在 103 上 pull,或使用增量传输:

# 压缩传输
docker save tkmind/goosed:local | gzip > goosed.tar.gz

# 传输
scp goosed.tar.gz john@103:~/

# 在 103 上解压导入
gunzip < goosed.tar.gz | docker load

Q4Session 数据在哪

A: 数据存储在 Docker 卷中:

# 查看卷位置
docker volume inspect goosed-test-data

# 在宿主机上访问
cd /var/lib/docker/volumes/goosed-test-data/_data
ls -la

清理与重置

停止容器和卷

# 停止单个容器
docker stop goosed-test
docker rm goosed-test
docker volume rm goosed-test-data

# 或使用 Compose
docker-compose -f docker-compose.local.yml down -v

# 删除镜像(如需要)
docker rmi tkmind/goosed:local

完全清理

# 清理所有 Docker 资源(谨慎)
docker system prune -a --volumes

交付前检查清单

镜像交付给 103 前:

  • 代码已提交到 git.tkmind.cn
  • 本地验证通过至少 1 周无异常
  • 镜像文件已保存或推送
  • 团队确认 Docker 方案可行
  • 103 环境已准备(Docker daemon

完成上述检查 = 可以考虑 103 部署


下一步(103 部署)

当本地验证通过后,计划 103 部署:

  1. 在 103 上导入镜像:docker load -i goosed.tar
  2. 配置运行时环境(端口、卷、Secret)
  3. 启动一个容器实例进行灰度测试
  4. 监控 2448 小时,确认稳定
  5. 若稳定,逐步增加副本数

当前阶段:本地验证。 103 部署是后续的独立议题。