305 lines
6.6 KiB
Markdown
305 lines
6.6 KiB
Markdown
# Goosed Docker 本地验证指南
|
||
|
||
> **目标:** 在本地完全验证 goosed Docker 镜像构建、运行、性能,然后再部署到 103。
|
||
> **方案:** 完全本地化(git.tkmind.cn + 本地 Docker + 手工交付)。
|
||
> **时间预期:** 1–2 周本地验证。
|
||
|
||
## 🚀 快速开始(5 分钟)
|
||
|
||
### 一键本地构建 + 验证
|
||
|
||
```bash
|
||
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. 检查环境
|
||
|
||
```bash
|
||
# Docker 版本(需 20.10+)
|
||
docker --version
|
||
|
||
# Docker Compose(需 2.0+)
|
||
docker-compose --version
|
||
|
||
# 检查磁盘空间(Rust 编译需 ~2GB)
|
||
docker system df
|
||
```
|
||
|
||
#### 2. 本地构建镜像
|
||
|
||
```bash
|
||
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/
|
||
```
|
||
|
||
预期:**8–12 分钟**(首次较慢,后续有缓存)
|
||
|
||
输出示例:
|
||
```
|
||
=> 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. 验证镜像
|
||
|
||
```bash
|
||
# 查看镜像大小
|
||
docker images | grep goosed
|
||
# tkmind/goosed local sha256:abc123 50MB
|
||
|
||
# 检查镜像层
|
||
docker history tkmind/goosed:local
|
||
```
|
||
|
||
---
|
||
|
||
### 第二步:启动 & 测试
|
||
|
||
#### 方式 A:脚本(推荐)
|
||
|
||
```bash
|
||
bash scripts/verify-goosed-docker.sh local
|
||
|
||
# 输出应该显示:
|
||
# ✅ 镜像构建完成
|
||
# ✅ 容器已启动
|
||
# ✅ 容器已就绪
|
||
```
|
||
|
||
#### 方式 B:手工 docker run
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
#### 方式 C:Docker Compose(两个实例)
|
||
|
||
```bash
|
||
# 启动两个 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. 健康检查
|
||
|
||
```bash
|
||
# 检查 /status 端点
|
||
curl http://127.0.0.1:18006/status
|
||
|
||
# 预期响应(JSON):
|
||
# {"status": "ok", "version": "..."}
|
||
```
|
||
|
||
### 2. 容器日志
|
||
|
||
```bash
|
||
# 查看完整日志(最后 50 行)
|
||
docker logs goosed-test | tail -50
|
||
|
||
# 持续流式日志
|
||
docker logs -f goosed-test
|
||
|
||
# 搜索错误
|
||
docker logs goosed-test 2>&1 | grep -i error
|
||
```
|
||
|
||
### 3. 容器内部检查
|
||
|
||
```bash
|
||
# 进入容器 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. 资源使用
|
||
|
||
```bash
|
||
# 监控资源使用(CPU、内存)
|
||
docker stats goosed-test
|
||
|
||
# 预期:
|
||
# CPU ~5–20%(空闲时)
|
||
# MEM 100–300MB(依赖 session 规模)
|
||
```
|
||
|
||
### 5. 性能测试(可选)
|
||
|
||
```bash
|
||
# 如果有测试工具,可以测试并发连接
|
||
# 示例:使用 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 部署参考:
|
||
|
||
```markdown
|
||
## 镜像交付信息
|
||
|
||
- **镜像名称:** 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。如果失败,检查:
|
||
|
||
```bash
|
||
# 清空 Docker 构建缓存
|
||
docker buildx prune -a
|
||
|
||
# 重新构建
|
||
docker build --no-cache -f tkmind_go/Dockerfile.goosed -t tkmind/goosed:local tkmind_go/
|
||
```
|
||
|
||
### Q2:容器启动后立即退出
|
||
|
||
**A:** 查看日志获得错误信息:
|
||
|
||
```bash
|
||
docker logs <container-id>
|
||
|
||
# 常见原因:
|
||
# 1. GOOSE_SERVER__SECRET_KEY 缺失
|
||
# 2. 数据卷权限不足(goose 用户无写权限)
|
||
# 3. SQLite 数据库损坏
|
||
```
|
||
|
||
### Q3:容器内 /status 返回 404
|
||
|
||
**A:** goosed 服务可能未就绪或崩溃:
|
||
|
||
```bash
|
||
# 检查进程
|
||
docker exec goosed-test ps aux | grep goosed
|
||
|
||
# 检查监听端口
|
||
docker exec goosed-test netstat -tlnp
|
||
|
||
# 查看完整日志
|
||
docker logs goosed-test
|
||
```
|
||
|
||
### Q4:Session 数据在哪里?
|
||
|
||
**A:** SQLite 数据库位置:
|
||
|
||
```bash
|
||
# 卷挂载位置(宿主机)
|
||
docker volume inspect goosed-test-data
|
||
# 查看 "Mountpoint" 字段
|
||
|
||
# 容器内路径
|
||
docker exec goosed-test ls -la /home/goose/.local/share/goose/
|
||
```
|
||
|
||
---
|
||
|
||
## 清理
|
||
|
||
```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 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. 回滚方案(若有问题快速降级)
|
||
|
||
**当前阶段:仅本地验证。**
|