Flask 个人站 iProfile 上线笔记(k3s + Nginx + Let‘s Encrypt)

一、技术栈全景

选型 说明
Web 框架 Flask 3.0 + Jinja2 零构建,模板直出 HTML
前端 Bootstrap 5 + Bootstrap Icons + Google Fonts CDN 引入,无需打包
WSGI Gunicorn 2 worker,0.0.0.0:8000
容器 Docker (python:3.12-slim) 非 root 运行,多阶段缓存依赖
编排 k3s + Kubernetes 清单 无状态,NodePort 30081 暴露
反代 Nginx 静态资源直出 + gzip + 反代 8000
证书 Let's Encrypt (certbot) 自动续期 HTTPS
邮件提醒 smtplib (SMTP_SSL) 询盘实时发邮件,未配置则静默跳过

二、服务整体编排结构

复制代码
                        ┌────────────────────────────┐
   浏览器(HTTPS 443) ──►│  Nginx 反向代理            │
                        │  - 静态 /static/ 直接返回    │
                        │  - 动态 / 转发到 upstream    │
                        └────────────┬───────────────┘
                                     │ proxy_pass
                                     ▼
                         ┌──────────────────────────┐
                         │ k3s NodePort :30081       │
                         │ ┌──────────────────────┐ │
                         │ │ Service iprofile-web  │ │
                         │ └──────────┬───────────┘ │
                         │            │  selector    │
                         │ ┌──────────▼───────────┐ │
                         │ │ Deployment           │ │
                         │ │  iprofile-web:latest │ │
                         │ │  replicas=1          │ │
                         │ │  probes: 就绪+存活    │ │
                         │ └──────────┬───────────┘ │
                         │            │             │
                         │   Secret: SECRET_KEY ◄──┘ (env 注入)
                         └──────────────────────────┘

  邮件(SMTP_SSL): 环境变量 MAIL_HOST/PORT/USER/PASSWORD/TO

三、关键设计点

1. 配置全走环境变量,代码零硬编码

复制代码
app.secret_key = os.environ.get('SECRET_KEY', os.urandom(24))
# SMTP 未配置时静默降级,不影响站点可用性
if not (host and user and password and to):
    print('[mail] SMTP not configured; skipping')
    return False

2. 容器安全

  • python:3.12-slim 精简镜像
  • PYTHONDONTWRITEBYTECODE / PYTHONUNBUFFERED 生产优化
  • 新建 appuser 非 root 运行
  • .dockerignore 排除敏感/冗余目录

3. k8s 清单三段式(Namespace / Secret / Deployment+Service)

  • SecretstringData 注入 SECRET_KEY
  • Deployment 配了 readinessProbelivenessProbe(GET /
  • RollingUpdatemaxSurge:1, maxUnavailable:0 滚动无中断
  • 资源限制 :request 50m/64Mi,limit 500m/256Mi(一台小 VPS 也能扛)
  • ServiceNodePort 30081(和已有服务 30080 同一套暴露模式)

4. Nginx 双层配置(上线顺序的关键)

  • init.conf先上 HTTP 版,跑完 certbot 拿到证书
  • web.liousa.site.conf再切换 HTTPS 版,带完整 SSL + 安全头 + gzip

5. Nginx 性能细节

  • 静态资源 expires 30d 强缓存 + gzip
  • proxy_http_version 1.1 + keepalive 8 连接复用
  • 安全头:X-Frame-Options / X-Content-Type-Options / Referrer-Policy

四、部署步骤

复制代码
# 1. 构建镜像(k3s 节点本地)
docker build -t iprofile-web:latest .

# 2. 应用 k8s 清单(自动建 ns/secret/deploy/svc)
kubectl apply -f k8s/iprofile.yaml

# 3. 验证
kubectl -n iprofile get pods,svc

# 4. Nginx 先上 HTTP 引导配置
sudo cp deploy/nginx/web.liousa.site.init.conf /etc/nginx/sites-available/web.liousa.site
sudo ln -sf /etc/nginx/sites-available/web.liousa.site /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

# 5. 申请证书(免费 HTTPS)
sudo certbot --nginx -d web.liousa.site

# 6. 切换正式 HTTPS 配置
sudo cp deploy/nginx/web.liousa.site.conf /etc/nginx/sites-available/web.liousa.site
sudo nginx -t && sudo systemctl reload nginx

五、上线遇到的问题

  1. 容器内 vs 宿主机端口要分清 :Gunicorn 在容器里监听 0.0.0.0:8000,k8s 再映射到 NodePort 30081,最终 Nginx 反代到 30081。三层端口别搞混。
  2. SSL 必须先 HTTP 引导再切 HTTPS:certbot 需要先用 HTTP 验证域名,所以上线脚本里 init.conf 和最终 conf 是两份。
  3. 探针救了服务 :加了 readinessProbe 后,容器没起来前 k8s 不会把流量打给它,避免"502 风暴"。

项目演示地址:https://iprofile.liousa.site(https://iprofile.liousa.site)

相关推荐
John_ToDebug35 分钟前
判断力无法被 AI 替代,但它正在被你亲手扔掉
经验分享·笔记
柳鲲鹏2 小时前
运气学概论:提纲草案
笔记
迷途呀3 小时前
CI/CD 自动化部署实践:让代码提交后自动上线
linux·运维·nginx·ci/cd·自动化
疯狂打码的少年5 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php
自小吃多6 小时前
PCB Editor软件复制、改变、删除操作笔记
笔记·嵌入式硬件
动词ing8 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
彧azz8 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
David猪大卫10 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
江湖人称菠萝包10 小时前
【Windows】《深入浅出Windows API程序设计:核心编程篇》笔记-Chapter6-动态链接库
windows·笔记
宵时待雨11 小时前
linux笔记归纳18:传输层协议TCP
linux·网络·笔记·网络协议·tcp/ip