📚前言
📒FDE系列内容总纲:
【大纲】FDE 前沿部署工程师学习系列教程-CSDN博客
🚄前置课程列表:
见文档结尾附录。
🚀阶段2·Day 44:Nginx 反向代理 + Git 版本控制
FDE 学习系列教程 · 第二阶段 · 第 5 周 · Day 4预计时长:3 小时 | 难度:★★★☆☆ | 前置知识:Day 41-43 Docker/Compose、Linux 基础
📌一句话目标:配置 Nginx 反向代理让标准 80 端口转发到 FastAPI,理解负载均衡原理;掌握 Git 的提交、分支、回滚、远程推送全流程,让代码有历史、可协作。
🧑🤝🧑 开场:今天补齐两块"标配拼图"
到昨天为止,你的服务已经能docker compose up一键跑起来了。但还剩两个绕不开的现实问题:
问题一:用户记不住 8000 端口。你的 API 跑在 8000,数据库在 3306,phpMyAdmin 在 8080。用户在浏览器敲http://服务器地址:8000?既不专业,也不安全。正常网站都是直接http://域名(走 80 端口),没人带端口号。中间需要一个"前台接待"把 80 端口的请求转进内部服务——这就是Nginx 反向代理。
问题二:代码还在裸跑。你现在改代码靠什么?改坏了想退回昨天的版本怎么办?多人一起开发怎么合并?用文件夹复制出项目_备份1、项目_最终版、项目_最终版_真的最终?这就是Git要解决的。
上午 Nginx,下午 Git,都是 FDE 每天打交道的基础设施,走起。
第一部分:Nginx 反向代理
📖 一、正向代理 vs 反向代理
两个名字都带"代理",但代理的对象完全相反。先分清这个,配置就好理解了。
对比 | 正向代理 | 反向代理 |
|---|---|---|
代理谁 | 客户端 | 服务端 |
谁知道代理存在 | 用户知道 | 用户不知道 |
典型工具 | VPN、HTTP 代理 | Nginx、网关 |
解决的问题 | 帮用户访问外部 | 帮服务器统一接待、隐藏内部结构 |
Nginx 当反向代理能干啥
两种安装方式
在WSL 和这容器里安装,主要是载体的区别,WSL 和容器(Docker)是两个层面、目标不同但常配合使用的技术。:
| 维度 | WSL(Windows Subsystem for Linux) | 容器(Docker) |
|---|---|---|
| 是什么 | Windows 上运行 Linux 的兼容层/轻量虚拟机 | 基于 Linux 内核特性的进程级隔离 |
| 隔离单位 | 一个完整的 Linux 发行版(Ubuntu 等) | 单个应用进程(一个容器跑一个服务) |
| 内核 | WSL2 有自己的真实 Linux 内核(跑在轻量 VM 里) | 共享宿主机内核(Linux namespace + cgroup) |
| 解决的问题 | 让 Windows 用户用上 Linux 工具链 | 让应用及其依赖打包、随处一致运行 |
| 粒度 | 粗(整个发行版) | 细(单服务) |
| 启动 | 秒级 | 毫秒~秒级 |
| 典型用途 | 开发环境、命令行、跑 Linux 程序 | 部署、微服务、环境一致性 |
Windows 上的Docker Desktop 默认用 WSL2 作为后端:它在 WSL2 里跑一个专用发行版docker-desktop来承载 Docker Engine,你在 Windows 的 PowerShell 或 WSL 终端里都能用docker命令,容器实际跑在 WSL2 内核上。
| 场景 | 容器内核来源 |
|---|---|
| 普通 Linux 服务器跑 Docker | 宿主 Linux 内核 |
| Windows + Docker Desktop(WSL2 后端) | WSL2 的 Linux 内核 |
| WSL2 里直接装 Docker Engine | WSL2 的 Linux 内核 |
| WSL1 里跑 Docker | 不行(WSL1 无真实内核,无 namespace/cgroup) |
🖥️ 二、方式一:直接在 WSL 安装 Nginx
先体验最朴素的安装方式(和客户传统服务器一致),打开你的 WSL 终端,依次执行:
sudo apt update sudo apt install -y nginx # 验证 nginx -v # nginx version: nginx/1.18.0 (Ubuntu) # Nginx 安装后通常自动启动了 curl http://localhost # 看到 <!DOCTYPE html>... Welcome to nginx! 说明 80 端口已在服务配置文件结构(Ubuntu/Debian 系)
/etc/nginx/ ├── nginx.conf # 主配置文件(全局设置) ├── sites-available/ # 可用的站点配置(写在这里) │ └── fde-api # ← 我们要建的 └── sites-enabled/ # 已启用的站点(放软链接到这里才生效) └── fde-api -> ../sites-available/fde-api这种"available + enabled"的两段式设计很经典:配置写在 available,想启用就在 enabled 里建个软链接(快捷方式),想下线删软链接即可,配置文件本身不删。
写反向代理配置
# 以 root 权限,用 nano 编辑器打开(或新建)一个名为 fde-api 的 Nginx 站点配置文件 sudo nano /etc/nginx/sites-available/fde-api写入:
server { listen 80; # Nginx 监听 80 端口 server_name localhost; # 域名/IP;本地练习用 localhost # 所有请求(/)都转发给 FastAPI location / { proxy_pass http://127.0.0.1:8000; # ⭐ 核心:转发目标 proxy_set_header Host $host; # 把原始域名带给后端 proxy_set_header X-Real-IP $remote_addr; # 真实客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 原始协议 http/https } }启用 + 生效:
# ① 建软链接启用站点 sudo ln -s /etc/nginx/sites-available/fde-api /etc/nginx/sites-enabled/ # ② 删掉默认站点(它也占 80 端口,会冲突) sudo rm /etc/nginx/sites-enabled/default # ③ 测试配置语法(改配置后必做!) sudo nginx -t # nginx: configuration file /etc/nginx/nginx.conf test is successful # ④ 重载配置(不断连接的平滑生效,改完配置用 reload 而非 restart) sudo systemctl reload nginx确保 FastAPI 在 8000 跑着(用第 4 周学的 nohup,或 docker 跑昨天的 api),然后验证:
# 直接访问 80(不带端口),Nginx 转给 8000 的 FastAPI curl http://localhost/ # {"msg":"FDE Stack",...} curl http://localhost/health # {"status":"ok","db":"connected"}proxy_pass 与请求头逐项解释
用户请求 Nginx :80 FastAPI :8000 http://localhost/ ─────────────proxy_pass─────────────► │ ├─ Host: $host │ 告诉后端"用户原本访问的域名" │ 后端生成跳转链接时要用 │ ├─ X-Real-IP: $remote_addr │ 后端日志里记录的不再是 Nginx 的 IP, │ 而是真实用户 IP(审计、限流要用) │ └─ X-Forwarded-For / -Proto 经过的代理链、原始协议💡 为什么要传这些头?经过反向代理后,FastAPI 直接看到的"来访者"是 Nginx(127.0.0.1),不是真实用户。这些
X-开头的请求头负责把"原始信息"一路带进去,行业标准做法,照抄即可。
🖥️ 三、方式二:用容器跑 Nginx(和 Compose 一体化,推荐)
既然整个技术栈都容器化了,Nginx 也应该进 Compose,而不是装在宿主机上。这样整套环境还是"一条 up 全起来"。
在昨天fde_stack的docker-compose.yml里加第三个服务:
# ---------- 服务 3:Nginx 反向代理 ---------- nginx: image: nginx:alpine container_name: fde-nginx ports: - "80:80" # 对外只暴露 80 volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件 depends_on: - api restart: unless-stopped新建nginx.conf(注意:容器版的转发地址写服务名 api,不是 127.0.0.1):
# 定义后端服务器组(负载均衡在这里配) upstream fde_backend { server api:8000; # api 是 Compose 服务名,内部 DNS 解析 } server { listen 80; server_name localhost; location / { proxy_pass http://fde_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }⚠️两种部署方式的转发地址区别(极易错):
Nginx 装在宿主机、FastAPI 也在宿主机:
proxy_pass http://127.0.0.1:8000Nginx 在容器里、FastAPI 在另一个容器:
proxy_pass http://api:8000(用服务名,走 Compose 内部网络)此时 api 服务不需要再把 8000 映射到宿主机(可以删掉它的
ports),让它只通过内部网络供 Nginx 访问——更安全,外部无法绕过 Nginx 直连 API。
启动并验证:
docker compose up -d curl http://localhost/ # 走 80 → Nginx → api:8000 # {"msg":"FDE Stack",...}完整架构图
用户浏览器 │ http://服务器地址(80端口) ▼ ┌──────────────────┐ │ Nginx 容器 :80 │ ← 唯一对外暴露的入口 │ 反向代理 │ └────────┬─────────┘ │ proxy_pass(内部网络,服务名 api) ┌────────▼─────────┐ ┌────────────────┐ │ FastAPI :8000 │ ───► │ MySQL :3306 │ │ (不对外暴露) │ │ (内部网络) │ └──────────────────┘ └────────────────┘ 对外只开一个 80 端口;api/db 都藏在内部网络📖 四、负载均衡:了解原理(高频面试点)
upstream块的真正威力是后端有多台服务器时分发请求。假设你部署了 3 个 API 实例:
upstream fde_backend { # 默认轮询:请求 1→api1,2→api2,3→api3,循环 server api1:8000 weight=3; # weight 权重:分到的概率是别人的3倍 server api2:8000 weight=1; server api3:8000 backup; # backup 备用:前两台全挂了才启用 }Nginx ┌───────┼───────┐ ▼ ▼ ▼ api1 api2 api3 (权重3) (权重1) (备用) 常见调度策略: · 轮询(默认) 一个接一个均匀分发 · weight 加权轮询 性能强的机器多分点 · ip_hash 同一用户IP固定打到同一台(会话保持) · least_conn 分给当前连接数最少的这块先理解原理,小项目单实例用不上。但 FDE 遇到客户高并发、或要做"灰度发布/多实例"时,就是这套配置。
💡 Nginx 改配置的标准三步,养成肌肉记忆:改配置 →
nginx -t测语法 → reload 平滑生效。永远不要不测试就 reload,一个语法错误可能让整个站点挂掉。
第二部分:Git 版本控制
📖 五、Git 解决什么问题
先看没有 Git 的世界:
工单系统_最终版.doc 工单系统_最终版2.doc 工单系统_最终版_真的最终.doc 工单系统_最终版_真的最终_改.doc 工单系统_最终版_真的最终_改_给客户.doc ……代码同理。这种"复制改名"式版本管理有三个死穴:
看不出差异:两个"最终版"到底改了哪几行?
回不去:今天改坏了,想退到上周能跑的版本?难
合不了:你和同事同时改 main.py,谁覆盖谁?
Git 是分布式版本控制系统:每次提交都是一个带说明的"存档点",记录了那一刻所有文件的快照。你可以随时查看历史、对比差异、退回任意版本、开分支并行开发。
提交(commit)就像游戏存档: ●────●────●────● 时间线 初始 加登录 修bug 加工单 ▲ ▲ └─ 任何时候都能读档回到这个点🖥️ 六、Git 基础操作全流程
git简介
Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年为管理 Linux 内核开发而创建。它的核心作用是记录代码/文件的历史变化,支持多人协作,并能随时回退到任意历史版本。
核心特点
分布式:每个克隆都是完整仓库,含全部历史,可离线提交、查看历史,不依赖中央服务器。
快照式存储:每次提交保存项目完整快照(通过内容寻址去重,存储上并不浪费),而非逐版本存差异。
内容寻址:所有数据以 SHA-1/SHA-256 哈希为键存入对象库,内容不可变,天然防篡改。
轻量分支:分支只是一个指向提交的指针文件,创建/切换极快,鼓励频繁分支。
完整性校验:任何数据损坏或篡改都会导致哈希不匹配,易于发现。
强大的合并能力:支持三方合并、变基、cherry-pick 等,能处理复杂的并行开发。
基本工作模型
三个区域:工作区、暂存区、仓库。提交历史构成有向无环图(DAG),合并提交有多个父节点。
git原理
Git 仓库的本质是一个键值存储(key-value store)。所有数据都以对象的形式保存在.git/objects目录下,每个对象用其内容的 SHA-1(或 SHA-256)哈希值作为唯一键。
四种对象类型
| 对象类型 | 作用 | 存储内容 |
|---|---|---|
| blob | 存储文件内容 | 只存文件字节,不含文件名 |
| tree | 存储目录结构 | 条目列表:模式、类型、哈希、文件名 |
| commit | 存储一次提交 | 指向一个 tree、父 commit 列表、作者/提交者、时间、消息 |
| tag(annotated) | 附注标签 | 指向某对象、标签名、tagger、消息 |
关键点:
blob 不含文件名。文件名和权限存在 tree 对象里。同样内容的不同文件只存一份 blob,天然去重。
tree 可以指向 blob 或其他 tree,形成目录树。
commit 指向一棵 tree(该提交的完整快照根目录)和零到多个父 commit。
每个对象的内容一旦写入就不可变,哈希值由内容决定。改一个字节,哈希全变。
对象如何存储
对象先经 zlib 压缩,再以objects/xx/yyyy...的松散对象形式存放(前两位做目录)。对象多了之后会打包成packfile(.git/objects/pack/*.pack+.idx),使用 delta 压缩存储相似对象,节省空间并加速传输。
哈希计算
Git 对对象做哈希时,会在内容前加一个头:"<类型> <字节数>\0",再对整体求 SHA-1。所以blob、tree、commit的哈希空间互不冲突。
安装
安装 Git 的方法取决于你使用的操作系统。安装完成后,通常还需要配置一下用户名和邮箱,才能开始提交代码。
Windows 系统
最推荐的方式是从官网下载安装包,或者使用包管理器。
方式一:安装包(推荐)
- 访问 Git 官网下载页面 (
git-scm.com/install/windows),下载最新的 64 位安装程序。 - 双击运行安装包。安装过程中有多个选项,对于大多数用户,保持默认选项一路“Next”即可。
- 关键一步:在“Adjusting your PATH environment”界面,建议选择中间的“Git from the command line and also from 3rd-party software”。这样你才能在 CMD 或 PowerShell 中直接使用
git命令。 - 安装完成后,你可以在桌面或文件夹空白处右键,选择 “Git Bash Here” 来打开 Git 终端。
方式二:命令行(WinGet)
如果你习惯用命令行,可以在 PowerShell 或 CMD 中运行以下命令:
winget install --id Git.Git -e --source wingetmacOS 系统
macOS 上最简便的方法是使用 Xcode 命令行工具或 Homebrew。
方式一:Xcode 命令行工具(最简单)
打开“终端”,直接输入git --version。如果系统检测到未安装,会自动弹窗提示你安装“命令行开发者工具”,点击安装即可。
方式二:Homebrew
如果你已经安装了 Homebrew,运行以下命令即可安装最新版:
brew install gitLinux 系统
直接使用你所用发行版的包管理器安装即可。
- Debian / Ubuntu:
sudo apt install git - Fedora:
sudo dnf install git - Arch Linux:
sudo pacman -S git - openSUSE:
sudo zypper install git
Git 通常已经随系统或开发工具装好。先确认:
git --version # git version 2.34.x第 1 步:一次性配置身份(只做一次)
git config --global user.name "你的名字" git config --global user.email "你的邮箱@example.com" # 可选:让默认分支名叫 main(新版惯例) git config --global init.defaultBranch main # 查看配置 git config --list第 2 步:初始化仓库
cd ~/docker_lab/fde_stack # 进入你的项目目录 git init # Initialized empty Git repository in /home/fde/docker_lab/fde_stack/.git/这会建一个隐藏的.git/目录——Git 的全部历史和数据都存在这里面,别动它。
第 3 步:写 .gitignore(和 .dockerignore 同样重要)
新建.gitignore,告诉 Git 哪些文件不纳入版本管理:
# Python __pycache__/ *.pyc venv/ .venv/ # 环境变量(密码!绝不提交) .env # 日志 *.log # 操作系统/IDE .DS_Store .vscode/ .idea/ # 数据库数据卷(如果在本地目录) mysql_data/📌
.env、密钥、venv、数据卷这些必须忽略:密码进了 Git 历史(尤其是推到 GitHub 公开仓库)等于公开泄露;venv 几百 MB 也不该进版本库(别人用 requirements.txt 自己装)。
第 4 步:查看状态、暂存、提交
# ① 看状态:哪些文件新增/修改/被忽略(最高频命令,随时敲) git status # ② 暂存(add):把改动放进"购物车" git add . # 暂存所有改动 git add docker-compose.yml # 或只暂存指定文件 # ③ 提交(commit):把购物车的东西结账,生成一个存档点 git commit -m "feat: 初始化 FastAPI+MySQL+Nginx 技术栈" # -m 后面是提交信息,说清楚这次干了啥Git 的三个工作区(核心模型)
为什么要多一个"暂存区"?让你能挑选改动分批提交:比如你一次改了 3 个文件,其中 2 个是新功能、1 个是修 bug,可以分两次 add + commit,历史更清晰。
第 5 步:查看历史与差异
# 看提交历史 git log git log --oneline # 简洁版:每个提交一行(最常用) # a1b2c3d feat: 初始化 FastAPI+MySQL+Nginx 技术栈 # d4e5f6g docs: 添加 README git log --oneline --graph # 图形化显示分支 # 看【还没暂存】的改动内容(工作区 vs 暂存区) git diff # 看【已暂存】将被提交的内容 git diff --staged🖥️ 七、分支:平行宇宙式开发
分支让你能在不影响主线的情况下开发新功能,这是 Git 的灵魂。
main(主线,始终保持可用) ●───────────●───────────●──────── \ ╱ ●──────●──────●────╱ feature/user-api(功能分支:在这折腾,坏了不影响 main)# 查看分支(* 表示当前所在分支) git branch # * main # 创建并切换到新分支 git checkout -b feature/user-api # 等价于:git branch feature/user-api + git checkout feature/user-api # 新版也可以用:git switch -c feature/user-api git branch # * feature/user-api # main # ……在分支上改代码、提交…… git add main.py git commit -m "feat: 添加用户查询接口" # 切回主线(工作区文件会变回 main 的样子) git checkout main # 把功能分支合并进 main git merge feature/user-api # 合并后删除功能分支(已合并且不再需要) git branch -d feature/user-api常见分支约定(了解即可):
分支 | 用途 |
|---|---|
| 稳定可发布版本,始终能跑 |
| 团队开发集成线(大项目) |
| 开发新功能 |
| 线上紧急修 bug |
💡 FDE 个人项目最小工作流:
main保持可用 → 每个新功能开feature/xxx→ 做完测好合并回main→ 删分支。简单有效。
🖥️ 八、远程仓库:GitHub/GitLab 协作与备份
本地历史再全,硬盘坏了也白搭。远程仓库既是云端备份,又是多人协作中心。
推送你的项目到 GitHub
注册 GitHub 账号(https://github.com),建议装好 SSH key 或用凭据管理器
在 GitHub 网页点New repository,名字如
fde-stack,不要勾选初始化 README(本地已有内容)关联远程并推送:
# 给本地仓库添加远程地址,惯例命名为 origin git remote add origin https://github.com/你的用户名/fde-stack.git # 第一次推送:-u 把本地 main 和远程 main 关联,以后直接 git push git push -u origin main # 以后提交完推送 git push协作三件套
# 把远程最新改动拉下来并合并(开工前先 pull,避免冲突) git pull # 把别人的仓库完整克隆到本地(含全部历史) git clone https://github.com/某人/某项目.git # 查看远程地址 git remote -v典型协作循环: ① git pull 先拉最新(拿到同事的提交) ② 改代码 ③ git add / commit 本地存档 ④ git push 推上去 如果 push 被拒(远程有新提交)→ 先 pull 合并 → 再 push冲突(conflict)怎么处理
你和同事改了同一文件的同一行,Git 无法自动决定听谁的,就会报冲突:
Auto-merging main.py CONFLICT (content): Merge conflict in main.py打开冲突文件,会看到冲突标记:
<<<<<<< HEAD return {"msg": "我的版本"} ← 当前分支的内容 ======= return {"msg": "同事的版本"} ← 要合并进来的内容 >>>>>>> feature/xxx手动编辑:删掉<<<<<<<、=======、>>>>>>>标记,保留你想要的最终内容,然后:
git add main.py git commit # 保存合并结果(Git 会自动生成合并提交信息)📖 九、后悔药:常见撤销操作
你想干嘛 | 命令 | 说明 |
|---|---|---|
撤销工作区某文件的改动(还没 add) |
| 恢复成上次提交的样子,改动丢失 |
把文件移出暂存区(add 错了) |
| 撤销 add,改动还在工作区 |
修改最近一次提交信息 |
| 还没 push 时用 |
撤销某次提交(安全,留痕) |
| 生成一个"反向提交"抵消改动,历史不被篡改 |
回到历史版本(危险) |
| 直接移动分支指针,之后的提交"消失" |
revert vs reset 的区别(重要): 历史:A ── B ── C(C 是有问题的提交) git revert C: A ── B ── C ── C'(C' 是"撤销C所做改动"的新提交) 历史完整保留,安全,适合已 push 的提交 ⭐ git reset --hard B: A ── B(C 直接从历史抹掉) 改写历史,只适合【没 push】的本地提交⚠️红线:已经 push 到共享分支的提交,不要用
reset --hard+ 强制推送(git push -f),会把同事的提交搞丢。共享分支用revert。
📝 本课小结
Nginx 部分
知识点 | 一句话 |
|---|---|
反向代理 | 代理服务端,用户不知道后端结构 |
listen 80 / proxy_pass | 监听 80,转发到内部 API |
proxy_set_header | 传递真实 IP、域名等原始信息 |
upstream | 定义后端服务器组,负载均衡基础 |
容器内转发地址 | 写服务名 |
改配置三步 | 改 → |
Git 部分
知识点 | 一句话 |
|---|---|
git init | 初始化仓库 |
.gitignore | 排除 venv/.env/日志 |
add → commit | 先暂存后提交的两个区 |
git status / log --oneline | 随时看状态和历史 |
branch / checkout / merge | 开分支、切换、合并 |
remote / push / pull / clone | 远程协作 |
冲突 | 手动编辑标记后 add + commit |
revert | 安全撤销(加反向提交) |
reset --hard | 危险回退(仅限未 push) |
🧠 核心认知:
Nginx 是系统的统一门面:对外只暴露 80/443,内部服务藏在后面,转发、负载、SSL、安全都在这一层处理。
Git 是代码的时间机器 + 协作底座:小步提交、分支隔离、远程备份,是每个工程师的基本功。FDE 写的 Dockerfile、compose、脚本都应该进 Git。
📋 课后练习
练习 1:Nginx 反向代理(约 25 分钟)
在 Compose 栈中加入 nginx 服务和 nginx.conf,
up -d启动用
curl http://localhost/(不带端口)访问到 API故意把 proxy_pass 改成错误地址,
nginx -t还能通过吗?reload 后访问现象是什么?改回来尝试删掉 api 服务的
ports: 8000:8000,验证通过 Nginx 仍能访问,但直接访问 localhost:8000 不通了
练习 2:Git 本地全流程(约 30 分钟)
给 fde_stack 项目
git init,写好 .gitignore,完成首次提交用
git log --oneline查看创建
feature/device-api分支,给 main.py 加一个/devices/hot(返回温度>80的设备)接口,提交切回 main,确认新接口"消失"了;再 merge 分支,确认它"回来"了
删除功能分支
练习 3:推送到 GitHub(约 20 分钟)
在 GitHub 新建仓库,
git remote add origin关联并push -u origin main在网页上确认文件都上去了,并确认
.env、venv没有被提交小实验:删掉本地某个文件 →
git status看到删除 →git checkout -- 文件名恢复
🔭 下节预告
Docker、Compose、Nginx、Git 四样东西今天各自学了。明天是本周收官,来一次完整的端到端实战,把它们串成一条真实交付流水线:
Git 拉代码 → 配置环境变量 → Compose 构建 → 一键启动 API+MySQL+Nginx → curl 全链路验证 → 改代码后重新部署。
你会得到一个可以放进作品集的完整项目结构,并用一张大图把第 5 周知识全部串起来。明天见!
🌍附录:前置课程列表
阶段一:认知启蒙(AI 认知与 FDE 角色)
AI 认知
【FDE系列】阶段1Day 1:AI 层级关系 — 四个嵌套的圈-CSDN博客
【FDE系列】阶段1Day 2:AI 三阶段发展史 — 会认 → 会判断 → 会创造-CSDN博客
【FDE系列】阶段1Day 3:符号 AI vs 机器学习 — 两条路线的本质区别-CSDN博客
【FDE系列】阶段1Day 4:Transformer 的历史意义 — 2017 年的分水岭-CSDN博客
【FDE系列】阶段1Day 5:本周复习与自测 — 检验你的 AI 认知地基-CSDN博客
【FDE系列】阶段1Day 6:Transformer 架构 — 一张图纸盖出千千万万栋楼-CSDN博客
【FDE系列】阶段1Day 7:LLM 本质 — 文字接龙机器-CSDN博客
【FDE系列】阶段1Day 8:Token — 模型眼中的最小单位-CSDN博客
【FDE系列】阶段1Day 9:AI 幻觉 — 为什么会一本正经地胡说八道-CSDN博客
【FDE系列】阶段1Day 10:上下文窗口 — 模型的记忆力上限 + 本周复习-CSDN博客
【FDE系列】阶段1Day 11:Prompt — 给模型立规矩-CSDN博客
【FDE系列】阶段1Day 12:Memory — 让模型记住上下文
【FDE系列】阶段1Day 13:RAG — 给模型配图书管理员-CSDN博客
【FDE系列】阶段1Day 14:Tool Use — 让模型动手操作-CSDN博客
【FDE系列】阶段1Day 15:MCP — 统一的工具接口标准 + 第三周复习-CSDN博客
FDE 基础概念
【FDE系列】阶段1Day 16:什么是 FDE — 把 AI 变成客户结果的人-CSDN博客
【FDE系列】阶段1Day 17:FDE vs 传统实施 — 三大本质区别-CSDN博客
【FDE系列】阶段1Day 18:FDE 三重身份 + C6 胜任力模型-CSDN博客
【FDE系列】阶段1Day 19:七阶段行动路径 + 行业经验的价值-CSDN博客
【FDE系列】阶段1Day 20:阶段总结与产出物 — 第一阶段收官-CSDN博客
阶段二:技术地基(Python + FastAPI + SQL + Docker + API 集成)
Python基础
【FDE系列】阶段2:Day 21:Python 环境搭建 — 写出你的第一行代码-CSDN博客
【FDE系列】阶段2:Day 22:变量、数据类型、条件判断 — Python 的“记忆“和“判断“-CSDN博客
【FDE系列】阶段2:Day 23:循环与函数 — 让代码跑 100 遍、把逻辑打包复用-CSDN博客
【FDE系列】阶段2:Day 24:数据结构 — 列表、字典、集合、元组-CSDN博客
【FDE系列】阶段2:Day 25:文件读写与 JSON — 让程序连通外部数据(第一周收官)-CSDN博客
【FDE系列】阶段2:Day 26:模块化编程 — 把代码拆成“抽屉柜“-CSDN博客
【FDE系列】阶段2:Day 27:异常处理与日志 — 让程序“摔不烂、查得到“-CSDN博客
FastAPI入门到进阶
【FDE系列】阶段2:Day 28:FastAPI 入门 — 把你的函数变成 API 服务-CSDN博客
【FDE系列】阶段2:Day 29:FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战-CSDN博客
【FDE系列】阶段2:Day 30:生产代码规范 — 测试、类型注解、配置管理(第二周收官)-CSDN博客
SQL基础
【FDE系列】阶段2:Day 31:SQL 基础 — 增删改查一把梭-CSDN博客
【FDE系列】阶段2:Day 32:多表查询 — JOIN 与聚合-CSDN博客
【FDE系列】阶段2:Day 33:进阶查询 — 窗口函数与 CTE-CSDN博客
【FDE系列】阶段2:Day 34:数据清洗 — 把脏数据捋干净-CSDN博客
【FDE系列】阶段2:Day 35:Python + SQL — 工单接入 MySQL + 本周收官-CSDN博客
Linux基础
【FDE系列】阶段2:Day 36:Linux 入门与文件操作 — 扔掉鼠标的第一天-CSDN博客
【FDE系列】阶段2:Day 37:权限、进程与文本三剑客-CSDN博客
【FDE系列】阶段2:Day 38:Shell 脚本 — 把命令串起来自动跑-CSDN博客
【FDE系列】阶段2:Day 39:Linux 综合实战 — 让服务无人值守-CSDN博客
【FDE系列】阶段2:Day 40:Shell 进阶 — 生产级脚本与本周收官-CSDN博客
Docker
【FDE系列】阶段2:Day 41:Docker 入门 — 把环境装进盒子-CSDN博客
【FDE系列】阶段2:Day 41(up详细版):Docker 入门 — 把环境装进盒子-CSDN博客
【FDE系列】阶段2:Day 42:Dockerfile 实战 — 把你的应用打包成镜像-CSDN博客
【FDE系列】阶段2:Day 42(UP详细版):Dockerfile 实战 — 把你的应用打包成镜像-CSDN博客
【FDE系列】阶段2:Day 43:Docker Compose — 多容器一键编排-CSDN博客
【FDE系列】阶段2:Day 43(UP详细版):Docker Compose — 多容器一键编排-CSDN博客