Files
workpod/docs/03-运维/部署维护手册.md
T

429 lines
13 KiB
Markdown
Raw 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.
# WorkPod 部署维护手册
> 版本:1.0 | 更新日期:2026-04-07
---
## 1. 系统概览
WorkPod 是基于 Docker 的轻量级开发环境容器系统,提供 Web 终端 (ttyd) 和 SSH 双入口,支持多实例部署。
### 1.1 架构总览
```
┌─────────────────────────────────────────────────────┐
│ 宿主机 (Windows) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ workpod-alpine│ │ ws-flux-dev │ │ 基础设施 │ │
│ │ :2222 / :7681│ │ :2201 / :7701│ │ mysql/redis│ │
│ └──────────────┘ └──────────────┘ └───────────┘ │
│ ↑ ↑ │
│ Alpine 3.23 + Node24 + JDK17/Maven │
│ ~438MB ~438MB │
└─────────────────────────────────────────────────────┘
```
### 1.2 实例清单
| 实例 | 类型 | SSH | Web | 镜像 | 内存限制 |
|------|------|-----|-----|------|---------|
| workpod-alpine | 基础实例 | :2222 | :7681 | workpod-alpine:latest (438MB) | 4G |
| ws-flux-dev | Flux 项目 | :2201 | :7701 | ws-flux-dev:latest (438MB) | 4G |
| workpod-test | 测试实例 | :2223 | :7682 | ae5a15cc0c94 (旧镜像) | 4G |
---
## 2. 快速操作
### 2.1 日常启停
```bash
# 启动全部实例
cd E:/wk-lab/workpod/instances/base && docker compose up -d
cd E:/wk-lab/workpod/instances/flux && docker compose up -d
# 停止单个实例
docker compose -f instances/base/docker-compose.yml down
docker compose -f instances/flux/docker-compose.yml down
# 重启(推荐:先 down 再 up)
docker compose -f instances/base/docker-compose.yml down && docker compose -f instances/base/docker-compose.yml up -d
```
### 2.2 连接方式
```bash
# ====== 基础实例 ======
Web 终端: http://localhost:7681 # 用户 jc / 密码 1234567
SSH: ssh root@localhost -p 2222 # 密码 workpod123
进入容器: MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash
# ====== Flux 实例 ======
Web 终端: http://localhost:7701 # 用户 jc / 密码 1234567
SSH: ssh root@localhost -p 2201 # 密码 workpod123
进入容器: MSYS_NO_PATHCONV=1 docker exec -it ws-flux-dev bash
```
### 2.3 一键检查状态
```bash
# 容器状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 资源占用
docker stats --no-stream --format "table {{.Name}}\t{{CPUPerc}}\t{{MemUsage}}\t{{NetIO}}"
# 镜像列表
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
```
---
## 3. 构建与更新
### 3.1 镜像构建
```bash
# 基础镜像(Alpine 3.23 + Node 24 + Claude Code
cd E:/wk-lab/workpod
docker build -t workpod-alpine:latest .
# Flux 扩展镜像(基础镜像 + LABELJDK 通过 volume 挂载)
docker build -t ws-flux-dev:latest -f Dockerfile.flux .
```
**构建产物** (~438MB):
- alpine:3.23 基础 (~7MB)
- 运行时工具 curl/git/ssh/ttyd/tmux/bash (~80MB)
- Node.js v24.14.1 (musl) + claude-code + coding-helper (~200MB)
- entrypoint.sh + ttyd-session.sh (<10KB)
### 3.2 更新 Claude Code / coding-helper
```bash
# 重新构建即可获取最新版(@latest 标签)
docker build --no-cache -t workpod-alpine:latest .
docker build --no-cache -t ws-flux-dev:latest -f Dockerfile.flux .
# 重启容器生效
docker compose -f instances/base/docker-compose.yml down && docker compose -f instances/base/docker-compose.yml up -d
docker compose -f instances/flux/docker-compose.yml down && docker compose -f instances/flux/docker-compose.yml up -d
```
### 3.3 滚动更新(不中断服务)
```bash
# 1. 构建新镜像
docker build -t workpod-alpine:latest .
# 2. 创建新容器(旧容器仍在运行)
docker compose -f instances/base/docker-compose.yml up -d --no-deps --build workpod-alpine
# 3. 确认健康后删除旧容器(自动完成,compose 管理)
```
---
## 4. 运维操作
### 4.1 日志查看
```bash
# 实时日志
docker logs -f workpod-alpine
docker logs -f ws-flux-dev
# 最近 50 行
docker logs --tail 50 workpod-alpine
# 按时间过滤
docker logs --since 2026-04-07T08:00:00 workpod-alpine
```
**日志策略**: json-file 驱动,单文件最大 10MB,保留 3 个文件(每实例最多 30MB)
### 4.2 进入容器调试
```bash
# 交互式 shell(推荐 login shell 以加载 PATH
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -lc 'echo $PATH; java -version; node -v'
# 执行单条命令
MSYS_NO_PATHCONV=1 docker exec workpod-alpine bash -lc 'claude --version'
```
> **注意**: Windows Git Bash 下必须加 `MSYS_NO_PATHCONV=1`,否则路径转换会导致错误。
### 4.3 文件传输
```bash
# 宿主机 → 容器
docker cp ./local-file.txt workpod-alpine:/workspace/
# 容器 → 宿主机
docker cp workpod-alpine:/workspace/output.txt ./
```
### 4.4 tmux 会话管理
容器内 ttyd 使用 tmux 管理终端会话:
```bash
# 在 Web 终端或 SSH 中操作
tmux ls # 列出所有会话
tmux attach -t session_name # 加入会话
tmux new -s my_session # 新建会话
# URL 快速访问指定会话
http://localhost:7681/?session=my_session
```
### 4.5 数据持久化
| 实例 | 宿主机路径 | 容器路径 | 用途 |
|------|-----------|---------|------|
| base | `data/workspace` | `/workspace` | 工作目录 |
| flux | `E:/wk-flux` | `/workspace` | Flux 项目源码 |
| flux | `data/home/flux-dev` | `/root` | 用户配置 (.gitconfig 等) |
---
## 5. 故障排查
### 5.1 容器无法启动
```bash
# 查看启动日志
docker logs workpod-alpine
# 常见问题:
# exit 127 → 命令未找到(镜像损坏或 entrypoint 缺失)
# exit 1 → 健康检查失败(sshd 或 ttyd 未启动)
# exit 255 → 信号处理异常
```
**workpod-test 退出码 127 排查**:
该实例使用旧镜像 ID `ae5a15cc0c94`,可能缺少 entrypoint。修复方法:
```bash
# 方案 A:改用最新基础镜像
# 编辑 instances/test/docker-compose.yml,将 image 改为 workpod-alpine:latest
# 方案 B:重新构建并替换
cd E:/wk-lab/workpod
docker build -t workpod-test:latest .
# 然后修改 test/docker-compose.yml 的 image 字段
```
### 5.2 端口冲突
```bash
# 查看端口占用
netstat -ano | grep :7681
# 端口分配表(避免冲突)
# 2222 / 7681 — workpod-alpine (基础)
# 2201 / 7701 — ws-flux-dev (Flux)
# 2223 / 7682 — workpod-test (测试)
# 新实例建议用 22xx / 77xx / 78xx
```
### 5.3 健康检查失败
```bash
# 手动检查端口
MSYS_NO_PATHCONV=1 docker exec workpod-alpine netstat -tlnp
# 应看到:
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN sshd
# tcp 0 0 0.0.0.0:7681 0.0.0.0:* LISTEN ttyd
# 如果 sshd/ttyd 未运行,查看进程
MSYS_NO_PATHCONV=1 docker exec workpod-alpine ps aux
```
### 5.4 内存不足
```bash
# 查看内存使用
docker stats --no-stream
# 当前限制:每个实例 4GB 上限 / 1GB 预留
# 如需调整,编辑对应 docker-compose.yml 的 deploy.resources.limits.memory
```
### 5.5 PATH 环境变量丢失
entrypoint.sh 启动时会自动检测工具链并写入 `/etc/profile.d/dev-tools.sh`。如果 docker exec 中找不到命令:
```bash
# 使用 login shell (-lc) 加载完整环境
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -lc 'java -version'
# 或手动 source
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -c 'source /etc/profile && java -version'
```
---
## 6. 清理维护
### 6.1 日常清理命令
```bash
# 清理悬空镜像(已停止容器的孤立层)
docker image prune -f
# 清理未使用的镜像(除运行中容器外的所有未标记镜像)
docker image prune -a -f # ⚠️ 会删除未运行的镜像
# 清理停止的容器
docker container prune -f
# 清理未使用的网络
docker network prune -f
# 全面清理(悬停资源 + 停止容器 + 未使用网络 + 构建缓存)
docker system prune -f
# 深度清理(包含未使用的镜像)⚠️ 慎用
docker system prune -a -f
```
### 6.2 日志清理
```bash
# 手动清空某容器日志(不重启)
truncate -s 0 $(docker inspect --format='{{.LogPath}}' workpod-alpine)
# 或设置全局日志限制(需编辑 daemon.json
# /etc/docker/daemon.json:
# { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
```
### 6.3 废弃资源清理记录
| 时间 | 操作 | 释放空间 |
|------|------|---------|
| 2026-04-07 | `docker image prune -f` | 802.8MB (28个悬空层) |
**待清理**:
- `workpod:latest` (2.6GB) — 旧 Ubuntu 版基础镜像
- `dev-box:latest` (2.79GB) — 旧开发箱镜像
- `workpod-alpine:size-test` (436MB) — 大小测试镜像
```bash
# 清理上述废弃镜像(确认无容器引用后)
docker rmi workpod:latest dev-box:latest workpod-alpine:size-test
# 预计释放 ~5.8GB
```
---
## 7. 远程服务器部署
### 7.1 服务器信息
| 项目 | 值 |
|------|-----|
| 服务器 IP | 39.99.243.191 |
| SSH 别名 | flux_dev |
| 部署路径 | /opt/workpod/ |
### 7.2 远程实例
| 实例 | SSH 端口 | Web 端口 | 域名 |
|------|---------|---------|------|
| workpod-1 | 2221 | 7681 | wk.1216.top |
| workpod-alpine | 2222 | 7683 | wk2.1216.top |
| workpod-ada | 2224 | 7685 | ada.1216.top |
| workpod-yxl | 2226 | 7686 | yxl.1216.top |
### 7.3 远程运维命令
```bash
# 通过 ssh-proxy 操作远程服务器
ssh-proxy exec -n flux_dev -c "docker ps --format 'table {{.Names}}\t{{.Status}}'"
ssh-proxy exec -n flux_dev -c "docker logs --tail 30 workpod-1"
ssh-proxy exec -n flux_dev -c "docker system prune -f"
```
---
## 8. 安全备忘
| 项目 | 当前配置 | 风险等级 | 建议 |
|------|---------|---------|------|
| privileged 模式 | 仅基础实例开启 | 高 | 确认是否必需,否则移除 |
| root 用户运行 | 全部实例 | 中 | 开发环境可接受 |
| SSH 密码登录 | PermitRootLogin yes | 内网可接受 | 生产环境禁用 |
| ttyd 认证 | Basic Auth (jc:1234567) | 低-内网 | 可配置强密码 |
| API Key 传递 | docker-compose env | 低 | 不写入文件系统 |
| JDK/Maven 挂载 | ro 只读 | 低 | 安全做法 |
---
## 9. 目录结构速查
```
E:/wk-lab/workpod/
├── Dockerfile # 基础镜像构建 (多阶段)
├── Dockerfile.flux # Flux 扩展镜像
├── entrypoint.sh # 容器入口脚本
├── ttyd-session.sh # tmux 会话管理
├── auth-proxy.js # 认证代理 (可选)
├── wk.1216.conf # Nginx 反向代理配置
├── SPECS.md # 技术规格文档
├── instances/ # ★ 实例中心
│ ├── .template/ # 实例模板
│ ├── registry.yaml # 实例注册表
│ ├── base/docker-compose.yml # 基础实例
│ ├── flux/docker-compose.yml # Flux 实例
│ └── test/docker-compose.yml # 测试实例
├── docs/ # 文档
│ ├── 00-规范/
│ ├── 01-架构/
│ ├── 02-技术文档/
│ ├── 03-运维/ # ← 本文档
│ └── 04-审核/
├── config/ # 配置模板
├── static/ # auth-proxy 静态页
├── data/ # 运行时数据
│ ├── workspace/ # 基础实例工作区
│ └── home/ # 用户 home 目录
└── _archive/ # 历史版本归档
```
---
## 附录:常用命令速查卡
```bash
# ════════════ 构建 ════════════
docker build -t workpod-alpine:latest .
docker build -t ws-flux-dev:latest -f Dockerfile.flux .
# ════════════ 启停 ════════════
docker compose -f instances/base/docker-compose.yml up -d
docker compose -f instances/flux/docker-compose.yml up -d
docker compose -f instances/base/docker-compose.yml down
# ════════════ 查看 ════════════
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker stats --no-stream
docker logs -f workpod-alpine
# ════════════ 进入 ════════════
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash
ssh root@localhost -p 2222 # workpod123
# http://localhost:7681 # jc / 1234567
# ════════════ 清理 ════════════
docker image prune -f # 悬空镜像
docker system prune -f # 全面清理
docker rmi <image> # 删除指定镜像
# ════════════ 远程 ════════════
ssh-proxy exec -n flux_dev -c "docker ps"
```