Files
memind/docs/goosed-docker-local-verification.md
T

6.6 KiB
Raw Blame History

Goosed Docker 本地验证指南

目标: 在本地完全验证 goosed Docker 镜像构建、运行、性能,然后再部署到 103。
方案: 完全本地化(git.tkmind.cn + 本地 Docker + 手工交付)。
时间预期: 12 周本地验证。

🚀 快速开始(5 分钟)

一键本地构建 + 验证

cd /Users/john/Project/Memind

# 本地构建镜像 + 启动容器 + 健康检查
bash scripts/verify-goosed-docker.sh local

脚本执行流程:

  1. 构建 tkmind/goosed:local Docker 镜像
  2. 启动容器到 18006 端口
  3. 等待 /status 端点就绪(最多 30 秒)
  4. 显示容器日志和可用的测试命令
  5. 容器保持运行供手工测试

详细步骤

第一次构建(15 分钟)

1. 检查环境

# Docker 版本(需 20.10+
docker --version

# Docker Compose(需 2.0+
docker-compose --version

# 检查磁盘空间(Rust 编译需 ~2GB)
docker system df

2. 本地构建镜像

cd /Users/john/Project/Memind

# 方式 A:直接从 Dockerfile 构建(首次较慢)
docker build -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/

# 方式 B:使用 Docker Buildx 缓存加速(推荐)
docker buildx build \
  -f tkmind_go/Dockerfile.goosed \
  -t tkmind/goosed:local \
  --load \
  tkmind_go/

预期:812 分钟(首次较慢,后续有缓存)

输出示例:

=> exporting to docker image format                                 0.3s
=> => exporting layers                                              0.2s
=> => exporting manifest sha256:abc123...                           0.0s
=> => exporting config sha256:def456...                             0.0s
Successfully tagged tkmind/goosed:local

3. 验证镜像

# 查看镜像大小
docker images | grep goosed
# tkmind/goosed  local  sha256:abc123  50MB

# 检查镜像层
docker history tkmind/goosed:local

第二步:启动 & 测试

方式 A:脚本(推荐)

bash scripts/verify-goosed-docker.sh local

# 输出应该显示:
# ✅ 镜像构建完成
# ✅ 容器已启动
# ✅ 容器已就绪

方式 B:手工 docker run

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

方式 CDocker Compose(两个实例)

# 启动两个 goosed 实例(18006 + 18007
docker-compose -f docker-compose.local.yml up -d

# 查看状态
docker-compose -f docker-compose.local.yml ps

# 查看日志
docker-compose -f docker-compose.local.yml logs -f goosed-1

测试与验证

1. 健康检查

# 检查 /status 端点
curl http://127.0.0.1:18006/status

# 预期响应(JSON):
# {"status": "ok", "version": "..."}

2. 容器日志

# 查看完整日志(最后 50 行)
docker logs goosed-test | tail -50

# 持续流式日志
docker logs -f goosed-test

# 搜索错误
docker logs goosed-test 2>&1 | grep -i error

3. 容器内部检查

# 进入容器 shell
docker exec -it goosed-test /bin/bash

# 在容器内检查
cd /home/goose/.local/share/goose
ls -la
file goose.db  # Session 数据库

# 检查网络
netstat -tlnp | grep 18006

# 退出容器
exit

4. 资源使用

# 监控资源使用(CPU、内存)
docker stats goosed-test

# 预期:
# CPU ~520%(空闲时)
# MEM 100300MB(依赖 session 规模)

5. 性能测试(可选)

# 如果有测试工具,可以测试并发连接
# 示例:使用 Apache Bench(需安装 ab
ab -n 100 -c 10 http://127.0.0.1:18006/status

# 或使用 wrk(需安装)
wrk -t4 -c100 -d10s http://127.0.0.1:18006/status

与 103 对接前的检查清单

在考虑部署到 103 前,在本地完成以下检查:

  • 镜像构建成功,无编译错误
  • 容器启动无异常,/status 端点响应正常
  • Session 数据库(SQLite)正常创建和存储
  • 容器日志无 panic / segfault / 权限错误
  • 两个实例可同时运行(18006 + 18007),无端口冲突
  • Docker 卷挂载正常,数据持久化工作
  • 容器重启后数据不丢失
  • 与本地 Portal (server.mjs) 集成测试通过(可选,需代理配置)

完成上述检查后,记录以下信息供 103 部署参考:

## 镜像交付信息

- **镜像名称:** ghcr.io/your-org/memind/goosed:latest
- **镜像大小:** ~50MB
- **运行用户:** goose (UID 1000)
- **开放端口:** 18006
- **数据目录:** /home/goose/.local/share/goose
- **所需环境变量:** GOOSE_SERVER__SECRET_KEY(必填)
- **健康检查:** GET http://127.0.0.1:18006/status

常见问题

Q1:构建失败 - "cargo not found"

A: Dockerfile 内部会安装 Rust,不需要本地 cargo。如果失败,检查:

# 清空 Docker 构建缓存
docker buildx prune -a

# 重新构建
docker build --no-cache -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/

Q2:容器启动后立即退出

A: 查看日志获得错误信息:

docker logs <container-id>

# 常见原因:
# 1. GOOSE_SERVER__SECRET_KEY 缺失
# 2. 数据卷权限不足(goose 用户无写权限)
# 3. SQLite 数据库损坏

Q3:容器内 /status 返回 404

A: goosed 服务可能未就绪或崩溃:

# 检查进程
docker exec goosed-test ps aux | grep goosed

# 检查监听端口
docker exec goosed-test netstat -tlnp

# 查看完整日志
docker logs goosed-test

Q4Session 数据在哪里?

A: SQLite 数据库位置:

# 卷挂载位置(宿主机)
docker volume inspect goosed-test-data
# 查看 "Mountpoint" 字段

# 容器内路径
docker exec goosed-test ls -la /home/goose/.local/share/goose/

清理

# 停止单个容器
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 system prune -a

下一步(不在本阶段执行)

一旦本地验证通过,部署到 103 时需要:

  1. 203 上安装 Docker / Podman
  2. 配置镜像仓库凭证(ghcr.io pull token
  3. 编写 systemd 服务或 compose 文件(103 端)
  4. Session 存储迁移计划(SQLite → PostgreSQL,参考 goose-session-postgres-migration.md
  5. 回滚方案(若有问题快速降级)

当前阶段:仅本地验证。