# 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) ``` --- ## 第一步:环境检查(初次一次性) ### 本地机器准备 ```bash # 1. 检查 Docker 版本 docker --version # 需要: 20.10+ # 2. 检查 Docker Compose docker-compose --version # 需要: 2.0+ # 3. 检查磁盘空间 df -h | grep "/$" # 需要: 至少 5GB 空闲(Rust 编译会用 2–3GB) # 4. 测试 Docker 构建 docker build --version ``` ### Git 配置确认 ```bash 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 ``` --- ## 第二步:代码变更与提交 ### 开发流程 ```bash # 1. 拉取最新代码 git pull origin main # 2. 本地开发(修改代码、测试等) # ...your changes... # 3. 提交到 git.tkmind.cn git add . git commit -m "你的变更说明" git push origin main ``` ### 验证提交 ```bash # 检查代码是否已推送到 git.tkmind.cn git log -1 --oneline # 查看最新 commit git push -u origin main # 确保推送 ``` --- ## 第三步:本地构建镜像 ### 方式 A:使用验证脚本(推荐) ```bash cd /Users/john/Project/Memind # 一键构建 + 启动 + 验证 bash scripts/verify-goosed-docker.sh local # 脚本会: # 1. 构建镜像 (8–12 分钟) # 2. 启动容器 # 3. 等待容器就绪 # 4. 显示测试命令 ``` ### 方式 B:手工 docker build(更细致控制) ```bash 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 ``` --- ## 第四步:本地验证 ### 快速检查 ```bash # 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 ``` ### 完整验证(可选但推荐) ```bash # 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:保存为文件(适合离线传输) ```bash # 1. 保存镜像到 tar 文件 docker save tkmind/goosed:local -o goosed.tar # 2. 检查文件大小 ls -lh goosed.tar # 大约 50–80MB # 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 Registry(Harbor / Local Registry): ```bash # 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(如已启用) ```bash # 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 镜像下载可能受网络影响。重试或配置代理: ```bash # 清空缓存重试 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:** 查看日志找原因: ```bash docker logs # 常见原因: # 1. GOOSE_SERVER__SECRET_KEY 环境变量缺失 # 2. SQLite 权限问题(goose 用户无写权限) # 3. 数据卷挂载错误 ``` ### Q3:镜像太大,无法传输 **A:** 可以先在 103 上 pull,或使用增量传输: ```bash # 压缩传输 docker save tkmind/goosed:local | gzip > goosed.tar.gz # 传输 scp goosed.tar.gz john@103:~/ # 在 103 上解压导入 gunzip < goosed.tar.gz | docker load ``` ### Q4:Session 数据在哪 **A:** 数据存储在 Docker 卷中: ```bash # 查看卷位置 docker volume inspect goosed-test-data # 在宿主机上访问 cd /var/lib/docker/volumes/goosed-test-data/_data ls -la ``` --- ## 清理与重置 ### 停止容器和卷 ```bash # 停止单个容器 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 ``` ### 完全清理 ```bash # 清理所有 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. 监控 24–48 小时,确认稳定 5. 若稳定,逐步增加副本数 **当前阶段:本地验证。** 103 部署是后续的独立议题。