Add Oh My Pi and improve dev container config
- Install @oh-my-pi/pi-coding-agent and move Go binaries to /usr/local/bin - Add omp-data volume and make web port configurable via PORT_WEB - Replace aider self-check with omp in Makefile - Harden entrypoint: avoid exporting API keys to SSH env and overwrite mounted public key into authorized_keys - Add .dockerignore, simplify .env.example, and document omp in README
This commit is contained in:
30
vibe-dev/.dockerignore
Normal file
30
vibe-dev/.dockerignore
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 版本控制
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# 敏感文件 (防止意外打入镜像)
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
*.pem
|
||||||
|
id_rsa*
|
||||||
|
authorized_keys
|
||||||
|
|
||||||
|
# 构建产物
|
||||||
|
/target/
|
||||||
|
node_modules/
|
||||||
|
/dist/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# 编辑器与系统
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
.DS_Store
|
||||||
|
Thumbnails.db
|
||||||
|
|
||||||
|
# 日志与临时
|
||||||
|
*.log
|
||||||
|
tmp/
|
||||||
|
temp/
|
||||||
@@ -1,51 +1,33 @@
|
|||||||
# =================================================================
|
# ========================================
|
||||||
# Vibe Coding 开发环境 - 环境变量模板
|
# Vibe Coding 环境配置模板
|
||||||
# 使用说明:
|
# ========================================
|
||||||
# 1. 复制此文件并重命名为 .env
|
# 使用方法: cp .env.example .env,然后填入实际值
|
||||||
# 2. 在 .env 中填写你真实的 API Key 和配置
|
|
||||||
# 3. 注意:不要将 .env 文件上传到 Git 仓库!
|
|
||||||
# =================================================================
|
|
||||||
|
|
||||||
# --- [SSH 配置] ---
|
# --- 工作区路径 ---
|
||||||
# 宿主机连接容器时使用的端口
|
# 宿主机项目路径 (会被挂载到容器的 /workspace)
|
||||||
SSH_PORT=2222
|
|
||||||
|
|
||||||
# --- [AI 工具 API Keys] ---
|
|
||||||
# Aider / OpenCode-AI 需要使用的模型密钥
|
|
||||||
# 常用模型提供商:Anthropic (Claude), OpenAI (GPT), 智谱AI (GLM)
|
|
||||||
|
|
||||||
# Anthropic API (用于 Claude 3.5 Sonnet, Aider 强烈推荐)
|
|
||||||
ANTHROPIC_API_KEY=your_anthropic_key_here
|
|
||||||
|
|
||||||
# OpenAI API (用于 GPT-4o 等)
|
|
||||||
OPENAI_API_KEY=your_openai_key_here
|
|
||||||
|
|
||||||
# OpenCode-AI 专用 (例如智谱 AI Key)
|
|
||||||
OPENCODE_API_KEY=your_opencode_provider_key_here
|
|
||||||
|
|
||||||
# --- [开发环境设置 (可选)] ---
|
|
||||||
# 你可以在这里指定镜像构建时使用的版本(如果 Dockerfile 支持 args)
|
|
||||||
RUST_VERSION=stable
|
|
||||||
BUN_VERSION=latest
|
|
||||||
|
|
||||||
# --- [其他工具配置] ---
|
|
||||||
# 例如某些工具需要的环境变量
|
|
||||||
# GITHUB_TOKEN=your_github_pat_here
|
|
||||||
|
|
||||||
|
|
||||||
# 开发者信息
|
|
||||||
# GIT_USER_NAME=YourName
|
|
||||||
# GIT_USER_EMAIL=youremail@example.com
|
|
||||||
|
|
||||||
# --- [路径配置] ---
|
|
||||||
# 宿主机项目代码目录 (默认为当前目录 .)
|
|
||||||
HOST_PROJECT_PATH=.
|
HOST_PROJECT_PATH=.
|
||||||
|
|
||||||
# 容器内的工作目录绝对路径 (建议保持为 /workspace)
|
# 容器内工作目录
|
||||||
CONTAINER_WORKSPACE_PATH=/workspace
|
CONTAINER_WORKSPACE_PATH=/workspace
|
||||||
|
|
||||||
# --- [SSH 密钥配置] ---
|
# --- SSH 配置 ---
|
||||||
# 指定你宿主机上的私钥文件名 (例如 id_ed25519 或 id_rsa)
|
# SSH 端口映射 (宿主机:容器)
|
||||||
SSH_KEY_NAME=id_ed25519
|
SSH_PORT=2222
|
||||||
# 宿主机上公钥的完整路径 (用于 Compose 挂载)
|
|
||||||
|
# 宿主机公钥路径 (会被自动注入到容器 authorized_keys)
|
||||||
|
# 持久化公钥请通过此变量配置,手动 make add-key 添加的公钥重启后会丢失
|
||||||
SSH_PUB_KEY_PATH=~/.ssh/id_ed25519.pub
|
SSH_PUB_KEY_PATH=~/.ssh/id_ed25519.pub
|
||||||
|
|
||||||
|
# --- 服务端口 ---
|
||||||
|
# Web 服务端口映射 (宿主机:容器,容器内默认监听 3000)
|
||||||
|
PORT_WEB=6300
|
||||||
|
|
||||||
|
# --- AI Provider API Keys (按需填写,全部默认注释) ---
|
||||||
|
# Anthropic (Claude) - opencode / omp 支持
|
||||||
|
# ANTHROPIC_API_KEY=sk-ant-xxx
|
||||||
|
|
||||||
|
# OpenAI - opencode / omp 支持
|
||||||
|
# OPENAI_API_KEY=sk-xxx
|
||||||
|
|
||||||
|
# OpenCode 自定义配置
|
||||||
|
# OPENCODE_API_KEY=xxx
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ FROM fedora:latest
|
|||||||
|
|
||||||
# 1. 系统工具与编译环境
|
# 1. 系统工具与编译环境
|
||||||
RUN dnf update -y && dnf install -y \
|
RUN dnf update -y && dnf install -y \
|
||||||
curl git wget unzip procps-ng shellcheck\
|
curl git wget unzip procps-ng shellcheck \
|
||||||
gcc gcc-c++ make cmake openssl-devel jq tmux vim\
|
gcc gcc-c++ make cmake openssl-devel jq tmux vim \
|
||||||
zsh sudo python3 python3-pip \
|
zsh sudo python3 python3-pip \
|
||||||
openssh-server tar gzip \
|
openssh-server tar gzip \
|
||||||
&& dnf clean all
|
&& dnf clean all
|
||||||
@@ -23,10 +23,11 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|||||||
RUN curl -fsSL https://bun.sh/install | bash
|
RUN curl -fsSL https://bun.sh/install | bash
|
||||||
RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \
|
RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \
|
||||||
&& go install golang.org/x/tools/gopls@latest \
|
&& go install golang.org/x/tools/gopls@latest \
|
||||||
&& go install github.com/go-delve/delve/cmd/dlv@latest
|
&& go install github.com/go-delve/delve/cmd/dlv@latest \
|
||||||
|
&& mv /root/go/bin/* /usr/local/bin/
|
||||||
|
|
||||||
# 4. 全局安装 AI 工具 (Vibe Coding 核心)
|
# 4. 全局安装 AI 工具 (Vibe Coding 核心: opencode + oh-my-pi)
|
||||||
RUN bun install -g opencode-ai
|
RUN bun install -g opencode-ai @oh-my-pi/pi-coding-agent
|
||||||
|
|
||||||
# 5. SSH & ZSH 配置
|
# 5. SSH & ZSH 配置
|
||||||
RUN ssh-keygen -A && \
|
RUN ssh-keygen -A && \
|
||||||
|
|||||||
@@ -20,10 +20,11 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|||||||
RUN curl -fsSL https://bun.sh/install | bash
|
RUN curl -fsSL https://bun.sh/install | bash
|
||||||
RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \
|
RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \
|
||||||
&& go install golang.org/x/tools/gopls@latest \
|
&& go install golang.org/x/tools/gopls@latest \
|
||||||
&& go install github.com/go-delve/delve/cmd/dlv@latest
|
&& go install github.com/go-delve/delve/cmd/dlv@latest \
|
||||||
|
&& mv /root/go/bin/* /usr/local/bin/
|
||||||
|
|
||||||
# 4. 全局安装 AI 工具
|
# 4. 全局安装 AI 工具 (opencode + oh-my-pi)
|
||||||
RUN bun install -g opencode-ai
|
RUN bun install -g opencode-ai @oh-my-pi/pi-coding-agent
|
||||||
|
|
||||||
# 5. SSH & 目录预设 (为 Zed 准备)
|
# 5. SSH & 目录预设 (为 Zed 准备)
|
||||||
RUN ssh-keygen -A && \
|
RUN ssh-keygen -A && \
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ check:
|
|||||||
@docker exec -it $(CONTAINER_NAME) rustc --version || echo "❌ Rust 未就绪"
|
@docker exec -it $(CONTAINER_NAME) rustc --version || echo "❌ Rust 未就绪"
|
||||||
@docker exec -it $(CONTAINER_NAME) go version || echo "❌ Go 未就绪"
|
@docker exec -it $(CONTAINER_NAME) go version || echo "❌ Go 未就绪"
|
||||||
@docker exec -it $(CONTAINER_NAME) bun --version || echo "❌ Bun 未就绪"
|
@docker exec -it $(CONTAINER_NAME) bun --version || echo "❌ Bun 未就绪"
|
||||||
@docker exec -it $(CONTAINER_NAME) aider --version || echo "❌ Aider 未就绪"
|
|
||||||
@docker exec -it $(CONTAINER_NAME) opencode version || echo "❌ OpenCode 未就绪"
|
@docker exec -it $(CONTAINER_NAME) opencode version || echo "❌ OpenCode 未就绪"
|
||||||
|
@docker exec -it $(CONTAINER_NAME) omp --version || echo "❌ Oh My Pi 未就绪"
|
||||||
@echo "✨ 自检完成!"
|
@echo "✨ 自检完成!"
|
||||||
|
|
||||||
add-key:
|
add-key:
|
||||||
|
|||||||
@@ -72,6 +72,28 @@ opencode "优化当前目录下 main.rs 的错误处理逻辑"
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 使用 Oh My Pi (交互式 AI Coding Agent)
|
||||||
|
|
||||||
|
[oh-my-pi](https://github.com/can1357/oh-my-pi)(命令名 `omp`)是一个终端优先的 AI Coding Agent,内置 LSP / DAP / 浏览器 / 子代理 / Hindsight 记忆等能力,与 Zed 通过 ACP 协议深度集成。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 首次使用:登录某个 provider (Anthropic / OpenAI / Codex / Cursor 等)
|
||||||
|
omp /login
|
||||||
|
|
||||||
|
# 交互式启动 (默认进入 TUI)
|
||||||
|
omp
|
||||||
|
|
||||||
|
# 单次指令模式
|
||||||
|
omp -p "为当前 Cargo 项目补全 unit test"
|
||||||
|
|
||||||
|
# 指定模型
|
||||||
|
omp --model anthropic/sonnet-4.5
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
* 配置与登录态保存在 `/root/.omp`(已挂载为命名卷 `omp-data`),`docker compose down` 后不会丢失。
|
||||||
|
* 若已在 `.env` 中配置了 `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`,omp 会自动识别,可跳过 `/login`。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 性能说明
|
## 🚀 性能说明
|
||||||
@@ -89,7 +111,6 @@ opencode "优化当前目录下 main.rs 的错误处理逻辑"
|
|||||||
| 任务 | 命令 |
|
| 任务 | 命令 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| **彻底重启环境** | `docker compose restart` |
|
| **彻底重启环境** | `docker compose restart` |
|
||||||
| **更新 AI 工具 (Aider)** | `pip install --upgrade aider-chat` (容器内运行) |
|
|
||||||
| **更换基础镜像 (OS)** | 修改 `docker-compose.yml` 中的 `dockerfile` 后运行 `docker compose up --build` |
|
| **更换基础镜像 (OS)** | 修改 `docker-compose.yml` 中的 `dockerfile` 后运行 `docker compose up --build` |
|
||||||
| **清理所有构建缓存** | `docker compose down -v` (警告:这将清空 Cargo/Bun 缓存) |
|
| **清理所有构建缓存** | `docker compose down -v` (警告:这将清空 Cargo/Bun 缓存) |
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ services:
|
|||||||
- TERM=xterm-256color
|
- TERM=xterm-256color
|
||||||
ports:
|
ports:
|
||||||
- "${SSH_PORT:-2222}:22"
|
- "${SSH_PORT:-2222}:22"
|
||||||
- "6300:3000"
|
- "${PORT_WEB:-6300}:3000"
|
||||||
- "6173-6175:5173-5175"
|
- "6173-6179:5173-5179"
|
||||||
volumes:
|
volumes:
|
||||||
- ${HOST_PROJECT_PATH:-.}:${CONTAINER_WORKSPACE_PATH:-/workspace}:cached
|
- ${HOST_PROJECT_PATH:-.}:${CONTAINER_WORKSPACE_PATH:-/workspace}:cached
|
||||||
# 1. 使用命名卷持久化整个 .ssh 目录
|
# 1. 使用命名卷持久化整个 .ssh 目录
|
||||||
@@ -31,6 +31,8 @@ services:
|
|||||||
# --- 新增:Zed 远程开发缓存 ---
|
# --- 新增:Zed 远程开发缓存 ---
|
||||||
- zed-server:/root/.zed_server
|
- zed-server:/root/.zed_server
|
||||||
- zed-share:/root/.local/share/zed
|
- zed-share:/root/.local/share/zed
|
||||||
|
# --- 新增:Oh My Pi 配置/记忆/OAuth 登录态持久化 ---
|
||||||
|
- omp-data:/root/.omp
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
restart: always
|
restart: always
|
||||||
@@ -42,3 +44,4 @@ volumes:
|
|||||||
go-cache:
|
go-cache:
|
||||||
zed-server:
|
zed-server:
|
||||||
zed-share:
|
zed-share:
|
||||||
|
omp-data:
|
||||||
|
|||||||
@@ -7,17 +7,19 @@ chmod 700 /root/.ssh
|
|||||||
touch /root/.ssh/authorized_keys
|
touch /root/.ssh/authorized_keys
|
||||||
touch /root/.ssh/environment
|
touch /root/.ssh/environment
|
||||||
|
|
||||||
printenv | grep -E '^(PATH|BUN|CARGO|RUST|ANTHROPIC|OPENAI|OPENCODE|TERM|SHELL|WORKSPACE)' > /root/.ssh/environment
|
# 仅同步非敏感环境变量到 SSH environment
|
||||||
# 2. 动态注入挂载的公钥 (解决只读冲突的核心逻辑)
|
# (API Keys 通过 compose env_file 注入进程环境,不落盘,避免明文泄露)
|
||||||
|
printenv | grep -E '^(PATH|BUN|CARGO|RUST|TERM|SHELL|WORKSPACE)' > /root/.ssh/environment
|
||||||
|
|
||||||
|
# 2. 动态注入挂载的公钥 (每次启动重建 authorized_keys,避免旧公钥残留)
|
||||||
|
# 持久化公钥请通过 .env 的 SSH_PUB_KEY_PATH 配置
|
||||||
if [ -f /tmp/host_id_ed25519.pub ]; then
|
if [ -f /tmp/host_id_ed25519.pub ]; then
|
||||||
echo "检测到挂载的公钥,正在注入..."
|
echo "检测到挂载的公钥,正在注入..."
|
||||||
# 仅当公钥不存在时才追加,避免重复
|
cp /tmp/host_id_ed25519.pub /root/.ssh/authorized_keys
|
||||||
if ! grep -qf /tmp/host_id_ed25519.pub /root/.ssh/authorized_keys 2>/dev/null; then
|
echo "✅ 公钥注入成功"
|
||||||
cat /tmp/host_id_ed25519.pub >> /root/.ssh/authorized_keys
|
else
|
||||||
echo "✅ 公钥注入成功"
|
# 没有挂载公钥时保留已有 authorized_keys (用户可能用 make add-key 手动加过)
|
||||||
else
|
touch /root/.ssh/authorized_keys
|
||||||
echo "ℹ️ 公钥已存在,无需重复注入"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. 强制修复权限 (SSH 对此非常敏感)
|
# 3. 强制修复权限 (SSH 对此非常敏感)
|
||||||
|
|||||||
Reference in New Issue
Block a user