192 lines
6.4 KiB
Markdown
192 lines
6.4 KiB
Markdown
---
|
||
title:
|
||
source:
|
||
author: shenwei
|
||
published:
|
||
created:
|
||
description:
|
||
tags: [remote-ssh, trae, ubuntu]
|
||
---
|
||
|
||
|
||
#trae #ubuntu #remote-ssh
|
||
|
||
```table-of-contents
|
||
```
|
||
|
||
### 1. 整体架构图示
|
||
|
||
- **Ubuntu 2 (Dev Server):** 存放源码,运行 `tiktok_pm` 容器(代码挂载),Trae 通过 SSH 远程连接此处。
|
||
|
||
- **Ubuntu 1 (Prod Server):** 运行 `tiktok_pm` 容器(镜像打包),通过 Docker 卷持久化数据,不挂载源码。
|
||
|
||
- **ThinkBook (Local):** 仅作为 UI 端,通过 Trae 连接 Ubuntu 2 进行开发。
|
||
|
||
### 2. Ubuntu 2:开发环境配置 (Dev)
|
||
|
||
这是您主要的工作区。路径:`/home/shenwei/docker/tiktok_pm`
|
||
|
||
#### A. 目录结构
|
||
|
||
``` bash
|
||
/home/shenwei/docker/tiktok_pm/
|
||
├── src/ # Django 源代码仓库
|
||
├── docker-compose.yml # 开发环境 Compose
|
||
├── .env.dev # 开发环境变量
|
||
└── Dockerfile # 开发/生产共用基础镜像定义
|
||
```
|
||
|
||
#### B. 开发环境 `docker-compose.yml`
|
||
|
||
开发环境的核心在于 **Bind Mount**(绑定挂载),实现代码修改实时生效。
|
||
|
||
### 3. 具体配置 (ThinkBook)
|
||
#### 第一阶段:基础设施层配置 (Connectivity & Permissions)
|
||
|
||
在配置 IDE 之前,必须确保 SSH 连接是免密的,并且你的 Ubuntu 用户有权直接操作 Docker,否则 Trae 的远程插件会因为权限弹窗而连接失败或功能受限。
|
||
|
||
##### 1. 配置 SSH 免密登录 (本地机器 -> Ubuntu2 Server)
|
||
|
||
Trae 的远程连接依赖于非交互式登录。
|
||
|
||
- **本地机器(客户端)生成密钥对**(如果已有可跳过):
|
||
|
||
Bash
|
||
|
||
```
|
||
ssh-keygen -t rsa -b 4096
|
||
```
|
||
|
||
- **将公钥上传至 Ubuntu2 Server**:
|
||
```
|
||
# 替换 user 和 ip
|
||
ssh-copy-id -i ~/.ssh/id_rsa.pub shenwei@192.168.3.45
|
||
```
|
||
|
||
- **配置 SSH Config 文件**(推荐): 在本地 `~/.ssh/config` (Mac/Linux) 或 `%USERPROFILE%\.ssh\config` (Windows) 中添加别名,方便 Trae 读取。
|
||
|
||
```
|
||
Host ubuntu2
|
||
HostName 192.168.3.45
|
||
User shenwei
|
||
Port 22
|
||
IdentityFile "C:\Users\ishenwei\.ssh\id_rsa" # 你的私钥路径
|
||
Host ubuntu2-ext # 公网访问
|
||
HostName ubuntu2.ishenwei.online:60024
|
||
User shenwei
|
||
Port 22
|
||
IdentityFile "C:\Users\ishenwei\.ssh\id_rsa" # 你的私钥路径
|
||
Host ubuntu1
|
||
HostName 192.168.3.47
|
||
User shenwei
|
||
Port 22
|
||
IdentityFile "C:\Users\ishenwei\.ssh\id_rsa" # 你的私钥路径
|
||
Host ubuntu1-ext # 公网访问
|
||
HostName ubuntu1.ishenwei.online:60022
|
||
User shenwei
|
||
Port 22
|
||
IdentityFile "C:\Users\ishenwei\.ssh\id_rsa" # 你的私钥路径
|
||
```
|
||
|
||
在 Ubuntu Server 上,你的用户必须在 `docker` 用户组中,否则 Trae 无法列出容器。
|
||
|
||
- **SSH 登录服务器执行:**
|
||
|
||
Bash
|
||
|
||
```
|
||
sudo usermod -aG docker $USER
|
||
# 必须注销并重新登录,或执行以下命令使组变更立即生效
|
||
newgrp docker
|
||
```
|
||
|
||
- **验证:** 执行 `docker ps`,如果不需要 sudo 且能列出容器,则配置成功。
|
||
|
||
|
||
---
|
||
|
||
#### 第二阶段:Trae 客户端配置 (IDE Setup)
|
||
|
||
Trae 原生支持 VS Code 的插件生态,我们需要利用 Remote Development 能力。
|
||
|
||
##### 1. 安装 Trae 及必要插件
|
||
|
||
打开 Trae,在左侧扩展市场(Extensions)中搜索并安装(如果尚未预装):
|
||
|
||
- **Remote - SSH** (必装)
|
||
|
||
- **Docker** (Microsoft 出品,必装)
|
||
|
||
- **Dev Containers** (如果你计划使用 `.devcontainer` 模式开发,强烈推荐)
|
||
|
||
|
||
##### 2. 建立远程连接
|
||
|
||
1. 使用快捷键 `Ctrl/Cmd + Shift + P` 调出命令面板。
|
||
|
||
2. 输入并选择:`Remote-SSH: Connect to Host...`。
|
||
|
||
3. 选择你在 SSH Config 中配置的 `ubuntu2`。
|
||
|
||
4. Trae 会在远程服务器上安装 **VS Code Server (Trae Server)** 代理组件。首次连接需要几十秒。
|
||
|
||
|
||
---
|
||
|
||
#### 第三阶段:开发模式选择 (Workflow Configuration)
|
||
|
||
针对 Docker 项目,你有两种主要的开发模式,根据你的需求选择:
|
||
|
||
##### 模式 A:Attach 到正在运行的容器 (推荐用于调试)
|
||
|
||
这种模式下,你直接“进入”已经在 Ubuntu 上跑起来的 Docker 容器进行代码修改。
|
||
|
||
1. **连接成功后**,在 Trae 左侧侧边栏找到 **Docker** 图标。
|
||
|
||
2. 在 **Containers** 列表中,找到你的目标项目容器。
|
||
|
||
3. 右键点击该容器,选择 **"Attach Visual Studio Code"** (或 Trae 对应选项)。
|
||
|
||
4. Trae 会打开一个新的窗口,此时你的 IDE **实际上是运行在 Docker 容器内部**。
|
||
|
||
5. **优点**:环境完全隔离,直接使用容器内的 Python/Node/Go 环境,无需在 Ubuntu 宿主机安装语言环境。
|
||
|
||
|
||
##### 模式 B:远程编辑宿主机文件 + Docker CLI (推荐用于编排)
|
||
|
||
这种模式下,你编辑的是 Ubuntu 文件系统上的代码 (`/home/user/project`),但在终端调用 Docker 命令。
|
||
|
||
1. **连接成功后**,点击 "Open Folder"。
|
||
|
||
2. 选择 Ubuntu 上 `docker-compose.yml` 或项目代码所在的路径。
|
||
|
||
3. 打开终端 (`Ctrl + ~`),直接执行 `docker compose up -d` 等命令。
|
||
|
||
4. **优点**:适合管理 `docker-compose.yml` 文件本身,或者同时管理多个微服务容器的配置。
|
||
|
||
|
||
---
|
||
|
||
#### 第四阶段:解决常见“坑” (Troubleshooting)
|
||
|
||
根据经验,在内网开发 Docker 项目常遇到以下问题,请提前规避:
|
||
|
||
1. **Git 凭证问题**:
|
||
|
||
- 如果在容器内开发(模式 A),容器内可能没有你的 SSH Key 或 Git 配置。
|
||
|
||
- **解决**:Trae/VS Code 通常会自动转发本地的 SSH Agent。确保本地运行了 SSH Agent (`eval "$(ssh-agent -s)" && ssh-add`),这样容器内拉取代码使用的是你本地的 Key。
|
||
|
||
2. **文件权限 (UID/GID) 问题**:
|
||
|
||
- 如果使用 Volume 挂载(将 Ubuntu 目录挂载进容器),容器内生成的 Build 文件可能归属于 `root`,导致你在宿主机无法删除或修改。
|
||
|
||
- **解决**:在 Dockerfile 中创建与宿主机相同 UID 的用户,或在 `docker-compose.yml` 中指定 `user: "${UID}:${GID}"`。
|
||
|
||
3. **内网穿透 (如果不只是局域网)**:
|
||
|
||
- 如果你离开办公地点,需要从公网访问这个内网 Server。
|
||
|
||
- **建议**:不要直接暴露 SSH 端口。在 Ubuntu 上安装 **Tailscale** 或 **Cloudflare Tunnel**。
|
||
|
||
- 如果使用 Tailscale,Trae 的 SSH Config HostName 可以直接填 Tailscale 的 IP (如 `100.x.x.x`),实现无缝切换。 |