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

362 lines
7.4 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.
# 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
本地验证通过 ✅(12 周)
镜像交付 → 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 编译会用 23GB)
# 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. 构建镜像 (812 分钟)
# 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
# 大约 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):
```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 <container-id>
# 常见原因:
# 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
```
### Q4Session 数据在哪
**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. 监控 2448 小时,确认稳定
5. 若稳定,逐步增加副本数
**当前阶段:本地验证。** 103 部署是后续的独立议题。