# M2.4 环境搭建

> 目标：搭好"本地写代码 → Git 管理 → 服务器运行"的开发闭环。你已有阿里云服务器 47.110.93.196，正好用上。

## 1. Python 虚拟环境（venv）隔离依赖

不同项目需要不同版本的库，用 venv 隔开后互不干扰。

```bash
# 在项目目录里创建虚拟环境
python -m venv venv

# 激活（Windows）
venv\Scripts\activate
# 激活（Mac/Linux）
source venv/bin/activate

# 激活后安装依赖
pip install openai requests
pip freeze > requirements.txt    # 把依赖清单保存下来
```

> 之后别人 `pip install -r requirements.txt` 就能复现你的环境。

## 2. Git 基本操作（提交、推送）

```bash
git init                      # 初始化仓库
git add .                     # 暂存所有改动
git commit -m "feat: 初版 Agent 脚本"   # 提交
git remote add origin <仓库地址>          # 关联远程
git push -u origin main       # 推送
```

**必须加 `.gitignore`**，避免把密钥、虚拟环境提交上去：

```text
# .gitignore
.env
venv/
__pycache__/
*.key
```

## 3. 云服务器基础（买、登录、传文件）

你这台服务器信息：
- IP：`47.110.93.196`
- 系统：Ubuntu 22.04（前面已部署 Caddy + Flask 站点）

**登录**（之前上传视频就是这么连的）：

```bash
ssh -i 你的私钥.pem root@47.110.93.196
```

**传文件**：`scp`（本地 → 服务器）

```bash
scp -i 私钥.pem app.py root@47.110.93.196:/var/www/ruidong-ai/
```

## 4. 本地到服务器的开发闭环

```
本地写代码 (VS Code + venv)
   │ git commit / scp
   ▼
服务器运行 (ssh 登录，python app.py 或 systemctl 守护)
   │ 访问 http://47.110.93.196
   ▼
浏览器/接口测试，发现问题本地改，再推上去
```

**守护进程**（让脚本一直跑，不掉线）：

```bash
# 简单后台
nohup python app.py > app.log 2>&1 &

# 正经做法：写 systemd service（你站点就是这么跑的 ruidong-ai.service）
```

## 动手任务

1. 本地建一个 venv，装 `openai`，导出 `requirements.txt`。
2. 建一个 GitHub 仓库，把今天写的 `ask.py` 提交上去（确认 `.gitignore` 生效、私钥没被传）。
3. 用 `scp` 把一个测试文件传到你的服务器 `/tmp/`，再用 `ssh` 登录确认它在。

## 自测

1. 为什么需要 venv？不隔离会怎样？
2. `.gitignore` 里为什么要加 `.env` 和 `venv/`？
3. `scp` 和 `ssh` 分别用来干什么？你能说出来吗？
