# 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/PycharmProjects/test/test-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/PycharmProjects/test/test-memind

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

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

### 方式 B：手工 docker build（更细致控制）

```bash
cd /Users/john/PycharmProjects/test/test-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 <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
```

### 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 部署是后续的独立议题。
