新增: WorkPod 全栈开发环境容器
- Dockerfile: Ubuntu + Python + Node + Go + Rust + MySQL + Redis - 离线安装包下载脚本(国内镜像源) - 技术规格说明书 SPECS.md - 代码审查报告 REVIEW-REPORT.md
This commit is contained in:
+17
@@ -0,0 +1,17 @@
|
|||||||
|
# 软件包(太大,不纳入版本控制)
|
||||||
|
packages/
|
||||||
|
|
||||||
|
# Docker 数据
|
||||||
|
docker-data/
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# 系统文件
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 日志
|
||||||
|
*.log
|
||||||
+107
@@ -0,0 +1,107 @@
|
|||||||
|
# WorkPod - 全栈开发环境容器 (本地包构建版)
|
||||||
|
# 包含:Ubuntu + Python + Go + Rust + Node + MySQL + Redis + Claude Code 2.1.79 + OpenClaw
|
||||||
|
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
|
# ============ 配置阿里云镜像源 ============
|
||||||
|
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
||||||
|
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
|
||||||
|
|
||||||
|
# ============ 基础工具 (合并安装减少层数) ============
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
# 基础工具
|
||||||
|
curl wget git vim nano less tree jq \
|
||||||
|
# 系统工具
|
||||||
|
procps htop net-tools iputils-ping lsof \
|
||||||
|
# 压缩工具
|
||||||
|
zip unzip xz-utils \
|
||||||
|
# 构建工具
|
||||||
|
build-essential pkg-config \
|
||||||
|
# SSL/加密
|
||||||
|
ca-certificates gnupg \
|
||||||
|
# SSH + PTY 支持
|
||||||
|
openssh-server locales \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* \
|
||||||
|
&& mkdir -p /var/run/sshd \
|
||||||
|
&& echo 'root:workpod123' | chpasswd \
|
||||||
|
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
|
||||||
|
|
||||||
|
# 中文和 UTF-8 支持
|
||||||
|
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
|
||||||
|
ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
# ============ Python ============
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
python3 python3-pip python3-venv \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* \
|
||||||
|
&& ln -sf /usr/bin/python3 /usr/bin/python
|
||||||
|
|
||||||
|
# ============ 复制本地包到镜像 ============
|
||||||
|
COPY packages/ /tmp/packages/
|
||||||
|
|
||||||
|
# ============ Node.js v24.14.0 (Krypton LTS) ============
|
||||||
|
RUN cd /tmp/packages \
|
||||||
|
&& tar -xf node-v24.14.0-linux-x64.tar.xz -C /usr/local --strip-components=1 \
|
||||||
|
&& npm install -g npm@latest pnpm yarn \
|
||||||
|
&& npm cache clean --force
|
||||||
|
|
||||||
|
# ============ Go 1.26.1 (最新版) ============
|
||||||
|
ENV GOPATH=/root/go
|
||||||
|
ENV PATH=/usr/local/go/bin:$GOPATH/bin:$PATH
|
||||||
|
RUN cd /tmp/packages \
|
||||||
|
&& tar -xzf go1.26.1.linux-amd64.tar.gz -C /usr/local
|
||||||
|
|
||||||
|
# ============ Rust 1.94.0 ============
|
||||||
|
ENV CARGO_HOME=/root/.cargo RUSTUP_HOME=/root/.rustup
|
||||||
|
ENV PATH=$CARGO_HOME/bin:$PATH
|
||||||
|
RUN mkdir -p /opt/rust $CARGO_HOME/bin \
|
||||||
|
&& cd /tmp/packages \
|
||||||
|
&& tar -xf rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz -C /opt/rust \
|
||||||
|
&& ln -sf /opt/rust/rust-1.94.0-x86_64-unknown-linux-gnu/bin/* $CARGO_HOME/bin/
|
||||||
|
|
||||||
|
# ============ Claude Code + OpenClaw (离线安装) ============
|
||||||
|
RUN cd /tmp/packages \
|
||||||
|
&& npm install -g claude-code-2.1.79.tgz \
|
||||||
|
&& npm install -g openclaw-2026.3.13.tgz \
|
||||||
|
&& npm cache clean --force
|
||||||
|
|
||||||
|
# ============ MySQL 8.0 (手动启动) ============
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
mysql-server \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* \
|
||||||
|
&& mkdir -p /var/run/mysqld \
|
||||||
|
&& chown mysql:mysql /var/run/mysqld
|
||||||
|
|
||||||
|
# ============ Redis (手动启动) ============
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
redis-server \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
|
||||||
|
|
||||||
|
# ============ 更多常用工具 ============
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
# 网络工具
|
||||||
|
netcat-openbsd \
|
||||||
|
# 文本处理
|
||||||
|
ripgrep fd-find \
|
||||||
|
# 进程管理
|
||||||
|
tmux \
|
||||||
|
# 其他
|
||||||
|
bash-completion \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
|
||||||
|
|
||||||
|
# ============ 清理临时包 ============
|
||||||
|
RUN rm -rf /tmp/packages
|
||||||
|
|
||||||
|
# ============ 工作目录 ============
|
||||||
|
WORKDIR /workspace
|
||||||
|
|
||||||
|
# ============ 启动脚本 ============
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
EXPOSE 22 80 443 3306 6379
|
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
+125
@@ -0,0 +1,125 @@
|
|||||||
|
# Dev Box 软件包清单
|
||||||
|
|
||||||
|
> 最后更新:2026-03-19
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 软件包列表
|
||||||
|
|
||||||
|
| 软件 | 版本 | 文件名 | 大小 | 国内镜像 |
|
||||||
|
|------|------|--------|------|---------|
|
||||||
|
| Node.js | v24.14.0 | node-v24.14.0-linux-x64.tar.xz | ~30 MB | npmmirror |
|
||||||
|
| Go | 1.26.1 | go1.26.1.linux-amd64.tar.gz | ~64 MB | golang.google.cn |
|
||||||
|
| Rust | 1.94.0 | rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz | ~183 MB | USTC |
|
||||||
|
| Claude Code | 2.1.79 | claude-code-2.1.79.tgz | ~20 MB | npmmirror |
|
||||||
|
| OpenClaw | 2026.3.13 | openclaw-2026.3.13.tgz | ~28 MB | npmmirror |
|
||||||
|
|
||||||
|
**总大小**:约 325 MB
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 国内镜像源
|
||||||
|
|
||||||
|
### Node.js (淘宝镜像)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载地址
|
||||||
|
https://npmmirror.com/mirrors/node/v24.14.0/node-v24.14.0-linux-x64.tar.xz
|
||||||
|
|
||||||
|
# 备用:清华镜像
|
||||||
|
https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/v24.14.0/node-v24.14.0-linux-x64.tar.xz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Go (官方中国镜像)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载地址
|
||||||
|
https://golang.google.cn/dl/go1.26.1.linux-amd64.tar.gz
|
||||||
|
|
||||||
|
# 备用:阿里云镜像
|
||||||
|
https://mirrors.aliyun.com/golang/go1.26.1.linux-amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rust (中科大镜像)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载地址
|
||||||
|
https://mirrors.ustc.edu.cn/rust-static/dist/rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz
|
||||||
|
|
||||||
|
# 备用:清华镜像
|
||||||
|
https://mirrors.tuna.tsinghua.edu.cn/rustup/dist/rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz
|
||||||
|
```
|
||||||
|
|
||||||
|
### npm 包 (淘宝镜像)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Claude Code
|
||||||
|
npm pack @anthropic-ai/claude-code@2.1.78 --registry=https://registry.npmmirror.com
|
||||||
|
|
||||||
|
# OpenClaw
|
||||||
|
npm pack openclaw@2026.3.13 --registry=https://registry.npmmirror.com
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 下载方式
|
||||||
|
|
||||||
|
### Windows (PowerShell)
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd D:\dev-box
|
||||||
|
.\download-packages.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux/macOS (Bash)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/dev-box
|
||||||
|
chmod +x download-packages.sh
|
||||||
|
./download-packages.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 手动下载
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Node.js
|
||||||
|
curl -LO https://npmmirror.com/mirrors/node/v24.14.0/node-v24.14.0-linux-x64.tar.xz
|
||||||
|
|
||||||
|
# Go
|
||||||
|
curl -LO https://golang.google.cn/dl/go1.26.1.linux-amd64.tar.gz
|
||||||
|
|
||||||
|
# Rust
|
||||||
|
curl -LO https://mirrors.ustc.edu.cn/rust-static/dist/rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 版本更新
|
||||||
|
|
||||||
|
如需更新软件版本,修改以下位置:
|
||||||
|
|
||||||
|
1. **下载脚本** - `download-packages.ps1` / `download-packages.sh` 中的版本号
|
||||||
|
2. **Dockerfile** - 对应的文件名和注释
|
||||||
|
|
||||||
|
### 查看最新版本
|
||||||
|
|
||||||
|
| 软件 | 查询地址 |
|
||||||
|
|------|---------|
|
||||||
|
| Node.js | https://npmmirror.com/mirrors/node/ |
|
||||||
|
| Go | https://golang.google.cn/dl/ |
|
||||||
|
| Rust | https://mirrors.ustc.edu.cn/rust-static/dist/ |
|
||||||
|
| Claude Code | `npm view @anthropic-ai/claude-code versions` |
|
||||||
|
| OpenClaw | `npm view openclaw versions` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
packages/
|
||||||
|
├── node-v24.14.0-linux-x64.tar.xz # Node.js
|
||||||
|
├── go1.26.1.linux-amd64.tar.gz # Go
|
||||||
|
├── rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz # Rust
|
||||||
|
├── claude-code-2.1.78.tgz # Claude Code
|
||||||
|
└── openclaw-2026.3.13.tgz # OpenClaw
|
||||||
|
```
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
# WorkPod 开发环境容器
|
||||||
|
|
||||||
|
全栈开发环境,包含 Ubuntu + Python + Go + Rust + Node + MySQL + Redis + Claude Code + OpenClaw
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建镜像
|
||||||
|
cd E:/wk-lab/workpod
|
||||||
|
docker build -t workpod:latest .
|
||||||
|
|
||||||
|
# 启动容器
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
docker logs -f workpod
|
||||||
|
|
||||||
|
# 进入容器
|
||||||
|
docker exec -it workpod bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## SSH 连接
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@localhost -p 2222
|
||||||
|
# 密码: workpod123
|
||||||
|
```
|
||||||
|
|
||||||
|
## 端口映射
|
||||||
|
|
||||||
|
| 服务 | 宿主机端口 | 容器端口 |
|
||||||
|
|------|-----------|---------|
|
||||||
|
| SSH | 2222 | 22 |
|
||||||
|
| HTTP | 8080 | 80 |
|
||||||
|
| HTTPS | 8443 | 443 |
|
||||||
|
| MySQL | 13306 | 3306 |
|
||||||
|
| Redis | 16379 | 6379 |
|
||||||
|
|
||||||
|
## 启动数据库服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# MySQL
|
||||||
|
docker exec workpod bash -c "mysqld --user=mysql --datadir=/var/lib/mysql &"
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
docker exec workpod redis-server --daemonize yes
|
||||||
|
```
|
||||||
|
|
||||||
|
## 已安装工具
|
||||||
|
|
||||||
|
| 工具 | 版本 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| Python | 3.10 | pip, venv |
|
||||||
|
| Node.js | 24.14.0 | npm, pnpm, yarn |
|
||||||
|
| Go | 1.26.1 | |
|
||||||
|
| Rust | 1.94.0 | cargo |
|
||||||
|
| MySQL | 8.0 | 手动启动 |
|
||||||
|
| Redis | 6.0 | 手动启动 |
|
||||||
|
| Claude Code | 2.1.79 | AI 编程工具 |
|
||||||
|
| OpenClaw | 2026.3.13 | AI 网关 |
|
||||||
|
|
||||||
|
## 镜像导出/导入
|
||||||
|
|
||||||
|
### 导出镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 导出为 tar 文件
|
||||||
|
docker save workpod:latest | gzip > workpod.tar.gz
|
||||||
|
|
||||||
|
# 或不压缩
|
||||||
|
docker save workpod:latest -o workpod.tar
|
||||||
|
```
|
||||||
|
|
||||||
|
### 导入镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 从 tar.gz 导入
|
||||||
|
docker load < workpod.tar.gz
|
||||||
|
|
||||||
|
# 或从 tar 导入
|
||||||
|
docker load -i workpod.tar
|
||||||
|
```
|
||||||
|
|
||||||
|
### 迁移到服务器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 本机导出
|
||||||
|
docker save workpod:latest | gzip > workpod.tar.gz
|
||||||
|
|
||||||
|
# 2. 传输到服务器
|
||||||
|
scp workpod.tar.gz user@server:/path/
|
||||||
|
|
||||||
|
# 3. 服务器导入
|
||||||
|
ssh user@server
|
||||||
|
docker load < /path/workpod.tar.gz
|
||||||
|
|
||||||
|
# 4. 复制 docker-compose.yml 到服务器并启动
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 数据持久化
|
||||||
|
|
||||||
|
数据存储在 `E:/docker-data/workpod/` 目录:
|
||||||
|
- `mysql/` - MySQL 数据
|
||||||
|
- `redis/` - Redis 数据
|
||||||
|
- `workspace/` - 工作空间
|
||||||
|
|
||||||
|
## 配置文件
|
||||||
|
|
||||||
|
```
|
||||||
|
E:/wk-lab/workpod/
|
||||||
|
├── Dockerfile # 镜像构建配置
|
||||||
|
├── docker-compose.yml # 容器编排配置
|
||||||
|
├── entrypoint.sh # 入口脚本
|
||||||
|
├── download-packages.ps1 # 软件包下载脚本
|
||||||
|
├── PACKAGES.md # 软件包清单
|
||||||
|
├── SPECS.md # 技术规格说明书
|
||||||
|
└── README.md # 说明文档
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常用命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止容器
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# 重启容器
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
# 查看容器状态
|
||||||
|
docker ps --filter name=workpod
|
||||||
|
|
||||||
|
# 进入容器执行命令
|
||||||
|
docker exec -it workpod bash
|
||||||
|
|
||||||
|
# 查看容器资源使用
|
||||||
|
docker stats workpod
|
||||||
|
```
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
# Dev Box 代码审查与优化报告
|
||||||
|
|
||||||
|
> 审查日期:2026-03-19
|
||||||
|
> 审查范围:D:/dev-box 项目
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 审查概述
|
||||||
|
|
||||||
|
对 Dev Box 全栈开发环境容器进行代码审查,发现并修复了多个问题。
|
||||||
|
|
||||||
|
### 审查文件
|
||||||
|
|
||||||
|
| 文件 | 行数 | 状态 |
|
||||||
|
|------|------|------|
|
||||||
|
| Dockerfile | 110 → 107 | 已优化 |
|
||||||
|
| docker-compose.yml | 56 | 无问题 |
|
||||||
|
| entrypoint.sh | 31 → 30 | 已优化 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 问题修复清单
|
||||||
|
|
||||||
|
### 2.1 必须修复 (3 项) ✅
|
||||||
|
|
||||||
|
| # | 位置 | 问题描述 | 修复方案 |
|
||||||
|
|---|------|---------|---------|
|
||||||
|
| 1 | Dockerfile:53 | 删除不存在的文件 `go1.24.3.linux-amd64.tar.gz` | 移除无效命令 |
|
||||||
|
| 2 | Dockerfile:59 | `/opt/rust` 目录未创建 | 添加 `mkdir -p /opt/rust $CARGO_HOME/bin` |
|
||||||
|
| 3 | Dockerfile:61 | `|| echo "Rust 解压完成"` 错误处理无效 | 移除,让构建失败时可见真实错误 |
|
||||||
|
|
||||||
|
### 2.2 建议改进 (3 项) ✅
|
||||||
|
|
||||||
|
| # | 位置 | 问题描述 | 修复方案 |
|
||||||
|
|---|------|---------|---------|
|
||||||
|
| 1 | Dockerfile:84 | `curl wget` 重复安装(已在第 16 行安装) | 移除重复项 |
|
||||||
|
| 2 | Dockerfile:105 | PATH 环境变量重复定义(第 50 行已定义) | 删除重复定义 |
|
||||||
|
| 3 | Dockerfile:98-101 | SSH 配置单独一层,可合并 | 合并到基础工具安装层 |
|
||||||
|
|
||||||
|
### 2.3 可选优化 (1 项) ✅
|
||||||
|
|
||||||
|
| # | 位置 | 问题描述 | 修复方案 |
|
||||||
|
|---|------|---------|---------|
|
||||||
|
| 1 | entrypoint.sh:30 | `tail -f /dev/null` 语义不够清晰 | 改为 `sleep infinity` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 优化效果
|
||||||
|
|
||||||
|
### 3.1 镜像层数减少
|
||||||
|
|
||||||
|
```
|
||||||
|
优化前:110 行,SSH 配置单独一层
|
||||||
|
优化后:107 行,合并到基础工具层
|
||||||
|
```
|
||||||
|
|
||||||
|
**减少 1 个 RUN 层**
|
||||||
|
|
||||||
|
### 3.2 代码质量提升
|
||||||
|
|
||||||
|
- 消除无效命令
|
||||||
|
- 移除重复定义
|
||||||
|
- 提高构建可靠性
|
||||||
|
- 改善代码可读性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 变更对比
|
||||||
|
|
||||||
|
### Dockerfile 关键变更
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- && rm -f go1.24.3.linux-amd64.tar.gz
|
||||||
|
# 移除无效命令
|
||||||
|
|
||||||
|
+ RUN mkdir -p /opt/rust $CARGO_HOME/bin \
|
||||||
|
# 添加目录创建
|
||||||
|
|
||||||
|
- curl wget netcat-openbsd \
|
||||||
|
+ netcat-openbsd \
|
||||||
|
# 移除重复安装
|
||||||
|
|
||||||
|
- ENV PATH="/usr/local/go/bin:/root/go/bin:/root/.cargo/bin:$PATH"
|
||||||
|
# 移除重复环境变量
|
||||||
|
|
||||||
|
- # ============ SSH 配置 ============
|
||||||
|
- RUN mkdir -p /var/run/sshd \
|
||||||
|
- && echo 'root:devbox123' | chpasswd \
|
||||||
|
- && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
|
||||||
|
# 合并到基础工具层
|
||||||
|
```
|
||||||
|
|
||||||
|
### entrypoint.sh 变更
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- exec tail -f /dev/null
|
||||||
|
+ exec sleep infinity
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 审查结论
|
||||||
|
|
||||||
|
| 指标 | 结果 |
|
||||||
|
|------|------|
|
||||||
|
| 发现问题 | 7 项 |
|
||||||
|
| 已修复 | 7 项 |
|
||||||
|
| 修复率 | 100% |
|
||||||
|
| 遗留问题 | 0 项 |
|
||||||
|
|
||||||
|
**结论**:所有问题已修复,代码质量符合规范,可以进行镜像构建。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 后续建议
|
||||||
|
|
||||||
|
1. **构建测试** - 执行 `docker build -t dev-box:latest .` 验证修复效果
|
||||||
|
2. **功能验证** - 启动容器并测试各服务(SSH、MySQL、Redis)
|
||||||
|
3. **版本更新** - 更新 SPECS.md 版本历史
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录:审查标准
|
||||||
|
|
||||||
|
本次审查基于以下标准:
|
||||||
|
|
||||||
|
1. DRY 检查 - 是否有重复实现
|
||||||
|
2. 简洁易读 - 变量/方法名是否清晰
|
||||||
|
3. 现有实现 - 核对是否已有类似功能
|
||||||
|
4. 防御性编程 - 避免过度防御
|
||||||
|
5. 逻辑嵌套 - 减少嵌套层级
|
||||||
@@ -0,0 +1,317 @@
|
|||||||
|
# WorkPod 技术规格说明书
|
||||||
|
|
||||||
|
> 文档版本:1.0
|
||||||
|
> 最后更新:2026-03-18
|
||||||
|
> 项目路径:`E:/workpod`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 概述
|
||||||
|
|
||||||
|
### 1.1 项目定位
|
||||||
|
|
||||||
|
WorkPod 是一个基于 Docker 的**全栈开发环境容器**,旨在提供统一、可移植、可离线部署的开发环境。
|
||||||
|
|
||||||
|
### 1.2 设计目标
|
||||||
|
|
||||||
|
| 目标 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| **环境统一** | 消除"在我机器上能跑"的问题 |
|
||||||
|
| **离线可用** | 所有依赖包本地化,无需网络 |
|
||||||
|
| **快速启动** | 一键启动完整开发环境 |
|
||||||
|
| **可迁移性** | 支持导出/导入到服务器 |
|
||||||
|
| **数据持久化** | 容器可重建,数据不丢失 |
|
||||||
|
|
||||||
|
### 1.3 适用场景
|
||||||
|
|
||||||
|
- 多工作空间统一开发环境(wk-flux, wk-lab, wk-suke, wk-oth 等)
|
||||||
|
- 新成员快速上手
|
||||||
|
- 服务器环境部署
|
||||||
|
- 离线/内网开发环境
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 技术架构
|
||||||
|
|
||||||
|
### 2.1 基础架构
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────┐
|
||||||
|
│ Docker Desktop │
|
||||||
|
│ ┌───────────────────────────────────────────────────┐ │
|
||||||
|
│ │ workpod 容器 (Ubuntu 22.04) │ │
|
||||||
|
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │
|
||||||
|
│ │ │Python│ │ Node │ │ Go │ │ Rust │ │MySQL │ │ │
|
||||||
|
│ │ │ 3.10 │ │ 24.x │ │1.26 │ │1.94 │ │ 8.0 │ │ │
|
||||||
|
│ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │ │
|
||||||
|
│ │ ┌──────┐ ┌──────┐ ┌──────────────────────────┐ │ │
|
||||||
|
│ │ │Redis │ │ SSH │ │ Claude Code + OpenClaw │ │ │
|
||||||
|
│ │ │ 6.0 │ │ 2222 │ │ (AI 编程工具) │ │ │
|
||||||
|
│ │ └──────┘ └──────┘ └──────────────────────────┘ │ │
|
||||||
|
│ └───────────────────────────────────────────────────┘ │
|
||||||
|
│ ↕ 数据卷挂载 (/d/docker-data) │
|
||||||
|
│ ┌───────────────────────────────────────────────────┐ │
|
||||||
|
│ │ MySQL │ Redis │ Workspace │ │
|
||||||
|
│ └───────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 技术栈明细
|
||||||
|
|
||||||
|
| 组件 | 版本 | 安装方式 | 启动方式 |
|
||||||
|
|------|------|---------|---------|
|
||||||
|
| Ubuntu | 22.04 | 基础镜像 | - |
|
||||||
|
| Python | 3.10 | apt | 常驻 |
|
||||||
|
| Node.js | 24.14.0 | 离线包 | 常驻 |
|
||||||
|
| Go | 1.26.1 | 离线包 | 常驻 |
|
||||||
|
| Rust | 1.94.0 | 离线包 | 常驻 |
|
||||||
|
| MySQL | 8.0 | apt | 手动 |
|
||||||
|
| Redis | 6.0 | apt | 手动 |
|
||||||
|
| Claude Code | 2.1.78 | 离线包 | 按需 |
|
||||||
|
| OpenClaw | 2026.3.13 | 离线包 | 按需 |
|
||||||
|
|
||||||
|
### 2.3 离线包清单
|
||||||
|
|
||||||
|
```
|
||||||
|
packages/
|
||||||
|
├── node-v24.14.0-linux-x64.tar.xz # Node.js 预编译包
|
||||||
|
├── go1.26.1.linux-amd64.tar.gz # Go SDK
|
||||||
|
├── rust-1.94.0-x86_64-unknown-linux-gnu.tar.xz # Rust 工具链
|
||||||
|
├── claude-code-2.1.78.tgz # Claude Code npm 包
|
||||||
|
├── openclaw-2026.3.13.tgz # OpenClaw npm 包
|
||||||
|
└── rustup-init.sh # Rust 安装脚本 (备用)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 网络配置
|
||||||
|
|
||||||
|
### 3.1 端口映射
|
||||||
|
|
||||||
|
| 服务 | 宿主机 | 容器 | 协议 | 说明 |
|
||||||
|
|------|--------|------|------|------|
|
||||||
|
| SSH | 2222 | 22 | TCP | 远程登录 |
|
||||||
|
| HTTP | 8080 | 80 | TCP | Web 服务 |
|
||||||
|
| HTTPS | 8443 | 443 | TCP | 加密 Web 服务 |
|
||||||
|
| MySQL | 13306 | 3306 | TCP | 数据库 |
|
||||||
|
| Redis | 16379 | 6379 | TCP | 缓存 |
|
||||||
|
|
||||||
|
### 3.2 连接方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH 连接
|
||||||
|
ssh root@localhost -p 2222
|
||||||
|
# 密码:workpod123
|
||||||
|
|
||||||
|
# Docker exec 进入
|
||||||
|
docker exec -it workpod bash
|
||||||
|
|
||||||
|
# 数据库连接
|
||||||
|
mysql -h 127.0.0.1 -P 13306 -u root
|
||||||
|
redis-cli -h 127.0.0.1 -p 16379
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 存储配置
|
||||||
|
|
||||||
|
### 4.1 数据卷映射
|
||||||
|
|
||||||
|
| 宿主机路径 | 容器路径 | 用途 |
|
||||||
|
|-----------|---------|------|
|
||||||
|
| `/d/docker-data/mysql` | `/var/lib/mysql` | MySQL 数据 |
|
||||||
|
| `/d/docker-data/redis` | `/var/lib/redis` | Redis 数据 |
|
||||||
|
| `/d/docker-data/workspace` | `/workspace` | 工作目录 |
|
||||||
|
| `./config/supervisor` | `/etc/supervisor/conf.d` | 进程配置 |
|
||||||
|
|
||||||
|
### 4.2 存储要求
|
||||||
|
|
||||||
|
| 项目 | 最小空间 | 建议空间 |
|
||||||
|
|------|---------|---------|
|
||||||
|
| 镜像构建 | 10 GB | 20 GB |
|
||||||
|
| 容器运行 | 5 GB | 10 GB |
|
||||||
|
| MySQL 数据 | 1 GB | 按需 |
|
||||||
|
| 工作空间 | 1 GB | 按需 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 构建规范
|
||||||
|
|
||||||
|
### 5.1 构建前检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Docker 状态
|
||||||
|
docker info
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# 检查离线包完整性
|
||||||
|
cd E:/workpod/packages
|
||||||
|
ls -lh *.tar.* *.tgz
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 构建命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建镜像
|
||||||
|
cd E:/workpod
|
||||||
|
docker build -t workpod:latest .
|
||||||
|
|
||||||
|
# 验证镜像
|
||||||
|
docker images workpod
|
||||||
|
|
||||||
|
# 启动容器
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 验证容器
|
||||||
|
docker ps --filter name=workpod
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 镜像导出/导入
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 导出(压缩)
|
||||||
|
docker save workpod:latest | gzip > workpod.tar.gz
|
||||||
|
|
||||||
|
# 导入
|
||||||
|
docker load < workpod.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 运维规范
|
||||||
|
|
||||||
|
### 6.1 日常操作
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动容器
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 停止容器
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# 重启容器
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
docker logs -f workpod
|
||||||
|
|
||||||
|
# 查看资源使用
|
||||||
|
docker stats workpod
|
||||||
|
|
||||||
|
# 进入容器
|
||||||
|
docker exec -it workpod bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 数据库管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动 MySQL
|
||||||
|
docker exec workpod bash -c "mysqld --user=mysql --datadir=/var/lib/mysql &"
|
||||||
|
|
||||||
|
# 启动 Redis
|
||||||
|
docker exec workpod redis-server --daemonize yes
|
||||||
|
|
||||||
|
# 停止 MySQL
|
||||||
|
docker exec workpod bash -c "mysqladmin -u root shutdown"
|
||||||
|
|
||||||
|
# 停止 Redis
|
||||||
|
docker exec workpod redis-cli shutdown
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 健康检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查容器状态
|
||||||
|
docker inspect workpod --format='{{.State.Health.Status}}'
|
||||||
|
|
||||||
|
# 检查 SSH 服务
|
||||||
|
curl -k https://localhost:2222
|
||||||
|
|
||||||
|
# 检查 MySQL
|
||||||
|
docker exec workpod mysql -e "SELECT VERSION()"
|
||||||
|
|
||||||
|
# 检查 Redis
|
||||||
|
docker exec workpod redis-cli ping
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 安全规范
|
||||||
|
|
||||||
|
### 7.1 访问控制
|
||||||
|
|
||||||
|
| 项目 | 当前配置 | 建议 |
|
||||||
|
|------|---------|------|
|
||||||
|
| SSH 密码 | workpod123 | 生产环境修改 |
|
||||||
|
| MySQL root | 无密码 | 生产环境设置密码 |
|
||||||
|
| Redis | 无密码 | 生产环境设置密码 |
|
||||||
|
|
||||||
|
### 7.2 安全加固建议
|
||||||
|
|
||||||
|
1. **生产环境**必须修改默认密码
|
||||||
|
2. 限制端口暴露范围
|
||||||
|
3. 使用 Docker 网络隔离
|
||||||
|
4. 定期更新基础镜像
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 故障排查
|
||||||
|
|
||||||
|
### 8.1 常见问题
|
||||||
|
|
||||||
|
| 问题 | 可能原因 | 解决方案 |
|
||||||
|
|------|---------|---------|
|
||||||
|
| 容器启动失败 | 端口被占用 | `netstat -ano \| findstr :2222` |
|
||||||
|
| MySQL 无法启动 | 数据目录权限 | `chown mysql:mysql /var/lib/mysql` |
|
||||||
|
| SSH 连接失败 | SSH 服务未启动 | `docker exec workpod service ssh start` |
|
||||||
|
| 构建失败 | 离线包缺失 | 检查 packages/ 目录 |
|
||||||
|
|
||||||
|
### 8.2 日志位置
|
||||||
|
|
||||||
|
| 日志 | 命令 |
|
||||||
|
|------|------|
|
||||||
|
| 容器日志 | `docker logs workpod` |
|
||||||
|
| SSH 日志 | `docker exec workpod cat /var/log/auth.log` |
|
||||||
|
| MySQL 日志 | `docker exec workpod cat /var/log/mysql/error.log` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 版本历史
|
||||||
|
|
||||||
|
| 版本 | 日期 | 变更说明 |
|
||||||
|
|------|------|---------|
|
||||||
|
| 1.0 | 2026-03-18 | 初始版本 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录 A:快速参考
|
||||||
|
|
||||||
|
### A.1 环境信息
|
||||||
|
|
||||||
|
```
|
||||||
|
基础镜像:ubuntu:22.04
|
||||||
|
时区:Asia/Shanghai
|
||||||
|
语言:en_US.UTF-8
|
||||||
|
工作目录:/workspace
|
||||||
|
```
|
||||||
|
|
||||||
|
### A.2 默认账号
|
||||||
|
|
||||||
|
| 服务 | 用户名 | 密码 |
|
||||||
|
|------|-------|------|
|
||||||
|
| SSH | root | workpod123 |
|
||||||
|
| MySQL | root | - |
|
||||||
|
| Redis | - | - |
|
||||||
|
|
||||||
|
### A.3 文件位置
|
||||||
|
|
||||||
|
```
|
||||||
|
E:/workpod/
|
||||||
|
├── Dockerfile # 镜像构建配置
|
||||||
|
├── docker-compose.yml # 容器编排配置
|
||||||
|
├── entrypoint.sh # 启动脚本
|
||||||
|
├── SPECS.md # 本文档
|
||||||
|
├── README.md # 使用说明
|
||||||
|
├── packages/ # 离线安装包
|
||||||
|
└── config/supervisor/ # Supervisor 配置
|
||||||
|
```
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
services:
|
||||||
|
workpod:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: workpod:latest
|
||||||
|
container_name: workpod
|
||||||
|
hostname: workpod
|
||||||
|
|
||||||
|
# 特权模式
|
||||||
|
privileged: true
|
||||||
|
|
||||||
|
# 端口映射
|
||||||
|
ports:
|
||||||
|
- "2222:22" # SSH
|
||||||
|
- "8080:80" # HTTP
|
||||||
|
- "8443:443" # HTTPS
|
||||||
|
- "13306:3306" # MySQL
|
||||||
|
- "16379:6379" # Redis
|
||||||
|
|
||||||
|
# 数据卷挂载
|
||||||
|
volumes:
|
||||||
|
- /e/docker-data/workpod/mysql:/var/lib/mysql
|
||||||
|
- /e/docker-data/workpod/redis:/var/lib/redis
|
||||||
|
- /e/docker-data/workpod/workspace:/workspace
|
||||||
|
- ./config/supervisor:/etc/supervisor/conf.d
|
||||||
|
|
||||||
|
# 环境变量
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
- TERM=xterm-256color
|
||||||
|
- LANG=en_US.UTF-8
|
||||||
|
- LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
# PTY 支持
|
||||||
|
tty: true
|
||||||
|
stdin_open: true
|
||||||
|
|
||||||
|
# 资源限制
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 8G
|
||||||
|
reservations:
|
||||||
|
memory: 2G
|
||||||
|
|
||||||
|
# 重启策略
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# 工作目录
|
||||||
|
working_dir: /workspace
|
||||||
|
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: workpod-network
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# Dev Box 软件包下载脚本 (Windows PowerShell)
|
||||||
|
# 使用国内镜像源,加速下载
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
|
$PackagesDir = Join-Path $ScriptDir "packages"
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Force -Path $PackagesDir | Out-Null
|
||||||
|
Set-Location $PackagesDir
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "========================================" -ForegroundColor Cyan
|
||||||
|
Write-Host " Dev Box 软件包下载(国内镜像)" -ForegroundColor Cyan
|
||||||
|
Write-Host "========================================" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
# ============ Node.js ============
|
||||||
|
$NodeVersion = "v24.14.0"
|
||||||
|
$NodeFile = "node-$NodeVersion-linux-x64.tar.xz"
|
||||||
|
|
||||||
|
Write-Host "[1/5] Node.js $NodeVersion..." -ForegroundColor Yellow
|
||||||
|
if (-not (Test-Path $NodeFile)) {
|
||||||
|
# 淘宝镜像
|
||||||
|
Invoke-WebRequest -Uri "https://npmmirror.com/mirrors/node/$NodeVersion/$NodeFile" -OutFile $NodeFile
|
||||||
|
Write-Host " ✓ 下载完成" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " - 已存在,跳过" -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============ Go ============
|
||||||
|
$GoVersion = "1.26.1"
|
||||||
|
$GoFile = "go$GoVersion.linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
Write-Host "[2/5] Go $GoVersion..." -ForegroundColor Yellow
|
||||||
|
if (-not (Test-Path $GoFile)) {
|
||||||
|
# Go 官方中国镜像
|
||||||
|
Invoke-WebRequest -Uri "https://golang.google.cn/dl/$GoFile" -OutFile $GoFile
|
||||||
|
Write-Host " ✓ 下载完成" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " - 已存在,跳过" -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============ Rust ============
|
||||||
|
$RustVersion = "1.94.0"
|
||||||
|
$RustFile = "rust-$RustVersion-x86_64-unknown-linux-gnu.tar.xz"
|
||||||
|
|
||||||
|
Write-Host "[3/5] Rust $RustVersion..." -ForegroundColor Yellow
|
||||||
|
if (-not (Test-Path $RustFile)) {
|
||||||
|
# 中科大镜像
|
||||||
|
Invoke-WebRequest -Uri "https://mirrors.ustc.edu.cn/rust-static/dist/$RustFile" -OutFile $RustFile
|
||||||
|
Write-Host " ✓ 下载完成" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " - 已存在,跳过" -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============ Claude Code ============
|
||||||
|
Write-Host "[4/5] Claude Code..." -ForegroundColor Yellow
|
||||||
|
if (-not (Test-Path "claude-code-2.1.79.tgz")) {
|
||||||
|
# 设置淘宝镜像并下载
|
||||||
|
npm pack @anthropic-ai/claude-code@2.1.79 --registry=https://registry.npmmirror.com
|
||||||
|
# 重命名
|
||||||
|
Get-ChildItem "anthropic-ai-claude-code-*.tgz" | ForEach-Object {
|
||||||
|
Rename-Item $_.FullName "claude-code-2.1.79.tgz" -Force
|
||||||
|
}
|
||||||
|
Write-Host " ✓ 下载完成" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " - 已存在,跳过" -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============ OpenClaw ============
|
||||||
|
Write-Host "[5/5] OpenClaw..." -ForegroundColor Yellow
|
||||||
|
if (-not (Test-Path "openclaw-2026.3.13.tgz")) {
|
||||||
|
# 设置淘宝镜像并下载
|
||||||
|
npm pack openclaw@2026.3.13 --registry=https://registry.npmmirror.com
|
||||||
|
# 重命名
|
||||||
|
Get-ChildItem "openclaw-*.tgz" | ForEach-Object {
|
||||||
|
Rename-Item $_.FullName "openclaw-2026.3.13.tgz" -Force
|
||||||
|
}
|
||||||
|
Write-Host " ✓ 下载完成" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " - 已存在,跳过" -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "========================================" -ForegroundColor Cyan
|
||||||
|
Write-Host " 下载完成" -ForegroundColor Cyan
|
||||||
|
Write-Host "========================================" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "文件列表:" -ForegroundColor White
|
||||||
|
Get-ChildItem $PackagesDir -Filter "*.tar.*" | ForEach-Object { Write-Host " $($_.Name) ($('{0:N0}' -f ($_.Length/1MB)) MB)" }
|
||||||
|
Get-ChildItem $PackagesDir -Filter "*.tgz" | ForEach-Object { Write-Host " $($_.Name) ($('{0:N0}' -f ($_.Length/1MB)) MB)" }
|
||||||
|
|
||||||
|
$TotalSize = (Get-ChildItem $PackagesDir | Measure-Object -Property Length -Sum).Sum / 1MB
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "总大小: $('{0:N0}' -f $TotalSize) MB" -ForegroundColor Cyan
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Dev Box 软件包下载脚本
|
||||||
|
# 使用国内镜像源,加速下载
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
PACKAGES_DIR="$SCRIPT_DIR/packages"
|
||||||
|
|
||||||
|
mkdir -p "$PACKAGES_DIR"
|
||||||
|
cd "$PACKAGES_DIR"
|
||||||
|
|
||||||
|
echo "========================================"
|
||||||
|
echo " Dev Box 软件包下载(国内镜像)"
|
||||||
|
echo "========================================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============ Node.js ============
|
||||||
|
NODE_VERSION="v24.14.0"
|
||||||
|
NODE_FILE="node-${NODE_VERSION}-linux-x64.tar.xz"
|
||||||
|
|
||||||
|
echo "[1/5] Node.js ${NODE_VERSION}..."
|
||||||
|
if [ ! -f "$NODE_FILE" ]; then
|
||||||
|
# 淘宝镜像
|
||||||
|
curl -L -o "$NODE_FILE" "https://npmmirror.com/mirrors/node/${NODE_VERSION}/${NODE_FILE}"
|
||||||
|
echo " ✓ 下载完成"
|
||||||
|
else
|
||||||
|
echo " - 已存在,跳过"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============ Go ============
|
||||||
|
GO_VERSION="1.26.1"
|
||||||
|
GO_FILE="go${GO_VERSION}.linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
echo "[2/5] Go ${GO_VERSION}..."
|
||||||
|
if [ ! -f "$GO_FILE" ]; then
|
||||||
|
# Go 官方中国镜像
|
||||||
|
curl -L -o "$GO_FILE" "https://golang.google.cn/dl/${GO_FILE}"
|
||||||
|
echo " ✓ 下载完成"
|
||||||
|
else
|
||||||
|
echo " - 已存在,跳过"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============ Rust ============
|
||||||
|
RUST_VERSION="1.94.0"
|
||||||
|
RUST_FILE="rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.xz"
|
||||||
|
|
||||||
|
echo "[3/5] Rust ${RUST_VERSION}..."
|
||||||
|
if [ ! -f "$RUST_FILE" ]; then
|
||||||
|
# 中科大镜像
|
||||||
|
curl -L -o "$RUST_FILE" "https://mirrors.ustc.edu.cn/rust-static/dist/${RUST_FILE}"
|
||||||
|
echo " ✓ 下载完成"
|
||||||
|
else
|
||||||
|
echo " - 已存在,跳过"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============ Claude Code ============
|
||||||
|
echo "[4/5] Claude Code..."
|
||||||
|
if [ ! -f "claude-code-2.1.78.tgz" ]; then
|
||||||
|
# 需要从 npm 下载,设置淘宝镜像
|
||||||
|
npm pack @anthropic-ai/claude-code --registry=https://registry.npmmirror.com 2>/dev/null || \
|
||||||
|
npm pack @anthropic-ai/claude-code@2.1.78 --registry=https://registry.npmmirror.com
|
||||||
|
# 重命名为固定名称
|
||||||
|
for f in anthropic-ai-claude-code-*.tgz; do
|
||||||
|
[ -f "$f" ] && mv "$f" "claude-code-2.1.78.tgz"
|
||||||
|
done
|
||||||
|
echo " ✓ 下载完成"
|
||||||
|
else
|
||||||
|
echo " - 已存在,跳过"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============ OpenClaw ============
|
||||||
|
echo "[5/5] OpenClaw..."
|
||||||
|
if [ ! -f "openclaw-2026.3.13.tgz" ]; then
|
||||||
|
# 从 npm 下载
|
||||||
|
npm pack openclaw@2026.3.13 --registry=https://registry.npmmirror.com 2>/dev/null || \
|
||||||
|
npm pack openclaw --registry=https://registry.npmmirror.com
|
||||||
|
# 重命名为固定名称
|
||||||
|
for f in openclaw-*.tgz; do
|
||||||
|
[ -f "$f" ] && mv "$f" "openclaw-2026.3.13.tgz"
|
||||||
|
done
|
||||||
|
echo " ✓ 下载完成"
|
||||||
|
else
|
||||||
|
echo " - 已存在,跳过"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "========================================"
|
||||||
|
echo " 下载完成"
|
||||||
|
echo "========================================"
|
||||||
|
echo ""
|
||||||
|
echo "文件列表:"
|
||||||
|
ls -lh "$PACKAGES_DIR"/*.tar.* "$PACKAGES_DIR"/*.tgz 2>/dev/null || true
|
||||||
|
echo ""
|
||||||
|
echo "总大小:"
|
||||||
|
du -sh "$PACKAGES_DIR"
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 启动 SSH 服务
|
||||||
|
service ssh start
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "========================================"
|
||||||
|
echo " WorkPod 开发环境已就绪"
|
||||||
|
echo "========================================"
|
||||||
|
echo "Python: $(python --version 2>&1)"
|
||||||
|
echo "Node: $(node --version)"
|
||||||
|
echo "Go: $(go version | awk '{print $3}')"
|
||||||
|
echo "Rust: $(rustc --version 2>/dev/null || echo '未安装')"
|
||||||
|
echo ""
|
||||||
|
echo "AI 工具:"
|
||||||
|
echo " Claude Code: $(claude --version 2>/dev/null || echo '未安装')"
|
||||||
|
echo " OpenClaw: $(openclaw --version 2>/dev/null || echo '未安装')"
|
||||||
|
echo ""
|
||||||
|
echo "数据库服务:"
|
||||||
|
echo " MySQL: mysqld --user=mysql --datadir=/var/lib/mysql &"
|
||||||
|
echo " Redis: redis-server --daemonize yes"
|
||||||
|
echo ""
|
||||||
|
echo "连接方式:"
|
||||||
|
echo " SSH: ssh root@localhost -p 2222 (密码: workpod123)"
|
||||||
|
echo " Exec: docker exec -it workpod bash"
|
||||||
|
echo "========================================"
|
||||||
|
|
||||||
|
# 保持容器运行
|
||||||
|
exec sleep infinity
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Docker Desktop 数据迁移到 D 盘脚本
|
||||||
|
# 以管理员身份运行 PowerShell
|
||||||
|
|
||||||
|
Write-Host "=== Docker Desktop 数据迁移脚本 ===" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
# 1. 停止 Docker Desktop
|
||||||
|
Write-Host "[1/6] 停止 Docker Desktop..." -ForegroundColor Yellow
|
||||||
|
Stop-Process -Name "Docker Desktop" -Force -ErrorAction SilentlyContinue
|
||||||
|
Start-Sleep -Seconds 5
|
||||||
|
|
||||||
|
# 2. 停止 WSL
|
||||||
|
Write-Host "[2/6] 停止 WSL..." -ForegroundColor Yellow
|
||||||
|
wsl --shutdown
|
||||||
|
Start-Sleep -Seconds 3
|
||||||
|
|
||||||
|
# 3. 创建目标目录
|
||||||
|
Write-Host "[3/6] 创建目标目录..." -ForegroundColor Yellow
|
||||||
|
$targetDir = "D:\DockerData"
|
||||||
|
if (-not (Test-Path $targetDir)) {
|
||||||
|
New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
# 4. 导出 docker-desktop-data
|
||||||
|
Write-Host "[4/6] 导出 docker-desktop-data (这可能需要几分钟)..." -ForegroundColor Yellow
|
||||||
|
$exportPath = "$targetDir\docker-desktop-data.tar"
|
||||||
|
wsl --export docker-desktop-data $exportPath
|
||||||
|
|
||||||
|
if (Test-Path $exportPath) {
|
||||||
|
Write-Host " 导出成功: $exportPath" -ForegroundColor Green
|
||||||
|
|
||||||
|
# 5. 注销原有的
|
||||||
|
Write-Host "[5/6] 注销原有发行版..." -ForegroundColor Yellow
|
||||||
|
wsl --unregister docker-desktop-data
|
||||||
|
|
||||||
|
# 6. 导入到新位置
|
||||||
|
Write-Host "[6/6] 导入到新位置..." -ForegroundColor Yellow
|
||||||
|
wsl --import docker-desktop-data "$targetDir\wsl" $exportPath --version 2
|
||||||
|
|
||||||
|
# 删除临时文件
|
||||||
|
Remove-Item $exportPath -Force
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "=== 迁移完成 ===" -ForegroundColor Green
|
||||||
|
Write-Host "Docker 数据已迁移到: $targetDir" -ForegroundColor Cyan
|
||||||
|
} else {
|
||||||
|
Write-Host " 导出失败,请检查 docker-desktop-data 是否存在" -ForegroundColor Red
|
||||||
|
Write-Host " 运行 'wsl --list -v' 查看所有发行版" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "请手动启动 Docker Desktop 完成迁移" -ForegroundColor Yellow
|
||||||
Reference in New Issue
Block a user