Linux 与 Ubuntu 手动部署学习
[!summary] 这份笔记的用途 记录 Y1shu Personal Blog 从 Windows 开发机手动部署到 Ubuntu VPS 的过程。重点不是背命令,而是理解:命令在哪里执行、以谁的身份执行、改变了什么、怎样验证、出错后看哪里。
![[Linux学习索引.base#学习笔记]]
0. 当前部署进度
[!success] 已正式上线
https://y1shucheng.online与https://www.y1shucheng.online均已返回200 OK。HTTP 会以301跳转到 HTTPS,Certbot 自动续期演习成功。
上线主线:已完成
- [x] DigitalOcean VPS 与 Ubuntu 24.04 基线检查
- [x] SSH Key 登录、Host Key 与管理员
cheng - [x] 创建无登录权限的服务用户
y1shu - [x] 系统更新、新内核与 1 GiB Swap
- [x]
/srv/y1shu代码、venv、配置和数据目录 - [x] GitHub 只读 Deploy Key、仓库转移与 remote 更新
- [x] Python venv、生产依赖和真实环境变量
- [x] SQLite 一致性迁移、权限与完整性校验
- [x] Gunicorn 直连测试及 Control Socket 权限问题修复
- [x] systemd 安装、启动、日志与开机启用
- [x] Nginx 安装、静态目录权限、反向代理和默认站点移除
- [x] 域名 A/CNAME 记录与 DNS 验证
- [x] Nginx
server_name与 FlaskTRUSTED_HOSTS同步 - [x] Let’s Encrypt HTTPS 证书和 HTTP 301 跳转
- [x] Certbot 自动续期
--dry-run
当前生产状态
| 项目 | 当前值 |
|---|---|
| 正式网址 | https://y1shucheng.online |
| 别名网址 | https://www.y1shucheng.online |
| VPS | DigitalOcean SGP1 |
| 系统 | Ubuntu 24.04.4 LTS |
| 公网 IP | 165.22.50.111 |
| 资源 | 1 vCPU / 512 MB RAM / 10 GB SSD |
| 内核 | 6.8.0-138-generic |
| Swap | /swapfile,1 GiB |
| 管理用户 | cheng |
| 程序用户 | y1shu |
| Nginx 用户 | www-data |
| Gunicorn | systemd 服务 y1shu.service,127.0.0.1:8000 |
| 项目代码 | /srv/y1shu/app |
| 虚拟环境 | /srv/y1shu/venv |
| 生产配置 | /srv/y1shu/config/y1shu.env |
| 数据库 | /srv/y1shu/data/blog.db |
| GitHub | Y1shu-cheng/y1shu-personal-blog |
| 已部署提交 | 097144b |
Phase 7 剩余运维收尾
- [ ] 浏览器验证管理员登录、退出、文章、评论和静态资源
- [ ] 配置 UFW,并用第二条 SSH 会话验证没有锁死
- [ ] 做一次真实 SQLite 备份与恢复演习
- [ ] 完整重启 VPS,验证 systemd、Nginx、HTTPS 和数据写入
- [ ] 演练以后如何安全更新 Git 代码
- [ ] 演练分层故障排查
- [ ] 理解恢复方案后决定是否启用 HSTS
[!note] “已经上线”与“所有运维演练完成”是两件事 网站公网与 HTTPS 主线已经完成;UFW、备份恢复、重启恢复等属于上线后的可靠性和维护验收。
1. 先看懂整个网站架构
flowchart LR
B[浏览器] -->|HTTP 80 / HTTPS 443| N[Nginx]
N -->|转发到本机| G[Gunicorn]
G --> F[Flask 应用]
F --> D[(SQLite)]
S[systemd] -.启动/重启/记录状态.-> G
每一层的职责
| 组件 | 是什么 | 主要职责 | 是否直接暴露公网 |
|---|---|---|---|
| Nginx | Web 服务器、反向代理 | 接收公网请求、HTTPS、静态文件、转发请求 | 是,80/443 |
| Gunicorn | Python WSGI 生产服务器 | 运行 Flask 应用,管理工作进程 | 否,只监听服务器本机 |
| Flask | Python Web 框架 | 路由、登录、文章、评论等业务逻辑 | 由 Gunicorn 调用 |
| SQLite | 文件型数据库 | 保存文章、评论等业务数据 | 否 |
| systemd | Linux 服务管理器 | 开机启动、异常重启、状态和日志管理 | 不适用 |
一句话:Nginx 守公网入口,Gunicorn 运行 Python 网站,Flask 处理业务,SQLite 保存数据,systemd 负责让服务稳定运行。
[!important] 为什么 Gunicorn 不直接暴露公网 Gunicorn 擅长运行 Python 应用,但 TLS、静态文件、公网连接管理、安全响应头等不是它的主要职责。让 Nginx 做公网边界,职责更清楚,也更容易维护。
哇哦