全栈项目上线实录:从代码到可访问的 https
以本站真实上线为例,拆解域名/服务器/Docker/HTTPS 各环节的角色关系、典型坑与系统化排障方法。
技术广度基础12 分钟读完更新于 2026-09-08
📌 一句话结论
部署不是"把代码传上去",而是打通五层链路:代码 → 容器 → 端口 → 防火墙 → DNS/证书——每一层都可能断,排障的方法是逐层探测,而容器日志是唯一真相源。
🧠 知识要点
各角色是什么关系(先建地图,再动手)
| 角色 | 大白话 | 关键认知 |
|---|---|---|
| GitHub | 配方手册 | 唯一真相源;本地/服务器都从它拉 |
| 服务器 | 商铺 | 公网可达的营业场所;选香港是免备案+大陆快 |
| Docker | 标准化厨房 | 环境100%一致;配置改了必须重启容器才生效 |
| 域名 | 门牌 | 唯一属于你的资产;子域名免费无限,可随时改指向 |
| DNS 解析 | 指路牌 | A 记录把名字翻译成 IP;分钟级生效 |
| HTTPS 证书 | 营业执照 | Caddy 这类工具全自动申请续期,别手动买 |
一次上线的标准步骤(实测可照抄)
- 服务器:
apt update && upgrade→ 装 Docker → clone 代码 → 加 swap(小内存机跑构建防 OOM) - DNS:
@和www两条 A 记录 → 服务器 IP - 防火墙:放行 22/80/443(云厂商默认模板经常缺 443!)
- 配
.env(站点 URL 等)→docker compose up -d --build - 验收四件套:https 绿锁 → 注册打卡 → 换设备登录进度还在 → www 跳转正常
本次真实踩过的五个坑(都是通用坑)
- 空环境变量炸构建:
env.X ?? fallback只防"不存在"不防"空字符串"——边界测试必须在与生产一致的变量状态下做 - 配置更新未重启:文件改了、容器还在跑旧配置——改配置必须配
docker compose restart - 云防火墙缺 443:容器端口映射正常 ≠ 公网可达;
docker ps一切正常但外面超时,先查云防火墙 - 检测工具自身故障:探测报错 ≠ 网站坏了;对照实验(同样的工具访问百度)一招隔离变量
- 第三方安装脚本 404:教程会过时,以官方文档为准;修完把文档改对,让下一个人不踩
系统化排障五步(可迁移到任何技术问题)
① 看报错找"主角"(报错在对谁操作?域名/IP/文件名直接暴露问题层)
② 逐层探测:DNS → 防火墙 → 端口 → 容器 → 应用,哪层断修哪层
③ 日志为准:docker compose logs 是唯一真相源,不猜
④ 对照实验:怀疑工具本身时,先测已知正常的对象
⑤ 复现验证:修复要在和生产一致的条件下验证,再上线
💼 面试怎么问
"你部署过项目吗?讲讲过程。"——面试官想听的不是成功,是你遇到问题怎么想。推荐叙事结构:
"我部署全栈站点时遇到一个典型问题:容器全部健康、本机 curl 正常,但公网 HTTPS 一直超时。我逐层探测:80 通、HTTP 返回 308 证明应用健康,443 不通——问题锁定在云防火墙,默认模板没开 443。放行后 Caddy 十秒拿到证书。这次给我的最大收获是:容器端口映射正常不等于公网可达,中间还有云厂商防火墙这层;以及排障要逐层隔离,日志是唯一真相源。"
"为什么选香港服务器/Caddy/SQLite?"——每个选型都要能讲出"按场景取舍":免备案省 2-4 周、Caddy 零配置证书省心智、SQLite 零运维但用 volume 保数据——展示的不是用了什么,而是为什么这么选(这正是售前的核心能力:方案设计)。
✅ 自检清单
- 能画出"访客 → DNS → 防火墙 → Caddy → 应用 → 数据卷"的完整链路图
- 能解释:为什么改了配置文件还要重启容器
- 知道
??和||对"空字符串"的行为差异 - 公网服务器必做:系统更新 + 关密码登录 + 只开必要端口
- 排障时能说出"我现在在验证哪一层"
- 续费日历已设:服务器和域名到期前提醒(断费 = 简历链接失效)