资讯详情

资讯详情

前端转 AI 100 天 Day 30:正式上线——从零部署一个完整服务(含 30 天复盘)

前端转 AI 第 30 天正式上线 - 从零部署一个完整服务含 30 天复盘说在前面今天是第 30 天一个里程碑。前 29 天把 Python 基础和整个后端工程化走完了今天我们做两件事把服务真正部署到一个云服务器上公网可访问复盘 30 天的收获调整下一阶段计划Day 30 目标上线一个域名 HTTPS 的正式服务同时回顾第一阶段的全部成果。一、先看目标上线后的样子今天结束你将拥有用户 ──► https://api.your-domain.com ──► Nginx ──► FastAPI ──► SQLite ↑ │ Lets Encrypt SSL │ CI/CD 自动部署 │ Docker 容器化一个真实的、有域名、有 HTTPS、能自动化部署的服务。简历上可以写独立设计并上线命令行 AI 助手服务采用 FastAPI SQLAlchemy Pydantic Docker GitHub Actions实现自动化测试覆盖率 90%、CI/CD 全流程自动化、Nginx 反代 HTTPS 生产级部署。这已经是一个能拿得出手的项目。二、准备工作服务器 域名1. 租服务器选哪家云厂商优点价格阿里云 / 腾讯云国内快备案方便¥60-100/月学生机更便宜Vultr / DigitalOcean国外不用备案$5-6/月Oracle Cloud免费额度大免费AWS / GCP / Azure大厂有免费额度我的建议国内用户→ 阿里云/腾讯云轻量应用服务器¥60/月起不备案→ Vultr/DO$6/月折腾→ Oracle Cloud 免费机但要抢配置建议项目推荐CPU2 核内存2GB硬盘40GB SSD带宽按流量或 3-5 Mbps系统Ubuntu 22.04 LTS为什么选 Ubuntu生态最全教程最多Docker 一键装。2. 域名注册便宜域名渠道阿里云 / 腾讯云国内需备案Namecheap国外$10/年Cloudflare成本价卖$10/年推荐.com/.dev/.io——别选.xyz/.top这类廉价感太强的。3. 域名解析在域名商后台加 A 记录类型 主机记录 记录值 A api 1.2.3.4 # 你的服务器 IP A 1.2.3.4 # 根域名也指向等 5-10 分钟生效验证digapi.your-domain.com# 应该返回你的服务器 IP国内服务器要备案才能用 80 / 443 端口。不备案可以先用其他端口测试。备案周期一般 1-2 周。4. 服务器初始化SSH 登录sshroot1.2.3.4创建普通用户不要用 root 操作adduser deployusermod-aGsudodeploy配置 SSH 免密本地# 生成密钥如果还没有ssh-keygen-ted25519-Cdeployai-assistant# 上传公钥到服务器ssh-copy-id deploy1.2.3.4禁用 root 密码登录安全服务器上编辑/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no重启 SSHsudosystemctl restart sshd之后只能用密钥登录无法暴力破解。三、服务器环境搭建1. 安装 Docker# 一键安装官方脚本curl-fsSLhttps://get.docker.com|sh# 把 deploy 用户加入 docker 组不用 sudosudousermod-aGdockerdeploy# 重新登录生效exit# 重新 ssh 进来# 验证docker--version# Docker version 27.x.x2. 安装 docker compose pluginDocker 27 已经内置 composedocker compose命令——不用再单独装。验证dockercompose version# Docker Compose version v2.x.x3. 基础配置设置时区sudotimedatectl set-timezone Asia/Shanghai配置防火墙sudoufw allow22# SSHsudoufw allow80# HTTPsudoufw allow443# HTTPSsudoufwenable开了防火墙后只有 22 / 80 / 443 端口能从外部访问其他端口安全了。装一些常用工具sudoaptupdatesudoaptinstall-ygitcurlvimhtop四、部署项目1. 代码推到 GitHub本地gitinitgitadd.gitcommit-mready for productiongitbranch-Mmain# 在 GitHub 创建仓库后gitremoteaddorigin gitgithub.com:yourname/ai-assistant.gitgitpush-uorigin main2. 服务器上拉代码cd/optsudomkdirai-assistantsudochowndeploy:deploy ai-assistantcdai-assistantgitclone gitgithub.com:yourname/ai-assistant.git.用deploy用户操作避免权限问题。3. 创建生产.envcat.envEOF API_KEY$(openssl rand-hex32)ENVprod LOG_LEVELINFO EOFchmod600.envopenssl rand -hex 32生成强随机 API Key。chmod 600只有自己可读——.env里有密钥不能让别人看到。4. 准备 SSL 证书先申请证书先用 HTTP 起一个临时服务# 修改 nginx 配置暂时只用 80vimnginx/conf.d/api.conf临时配置只用 80server { listen 80; server_name api.your-domain.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 200 ok; } }起 Nginxmkdir-pnginx/www nginx/certsdockerrun-d--nametemp-nginx\-p80:80\-v$(pwd)/nginx/www:/var/www/certbot:ro\-v$(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro\nginx:alpine申请证书dockerrun--rm\-v$(pwd)/nginx/certs:/etc/letsencrypt\-v$(pwd)/nginx/www:/var/www/certbot\certbot/certbot certonly\--webroot-w/var/www/certbot\-dapi.your-domain.com\--emailyouexample.com\--agree-tos --no-eff-email成功的话Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/api.your-domain.com/fullchain.pem证书目录lsnginx/certs/live/api.your-domain.com/# cert.pem chain.pem fullchain.pem privkey.pem README停掉临时 Nginxdockerstop temp-nginxdockerrmtemp-nginx5. 切换到完整 HTTPS 配置恢复nginx/conf.d/api.conf为完整版本Day 29 写的把域名替换成你的upstream api_backend { least_conn; server api:8000; keepalive 32; } server { listen 80; server_name api.your-domain.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; http2 on; server_name api.your-domain.com; ssl_certificate /etc/nginx/certs/live/api.your-domain.com/fullchain.pem; ssl_certificate_key /etc/nginx/certs/live/api.your-domain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; add_header Strict-Transport-Security max-age31536000 always; add_header X-Content-Type-Options nosniff always; client_max_body_size 10M; location / { proxy_pass http://api_backend; proxy_http_version 1.1; proxy_set_header Connection ; 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; proxy_read_timeout 60s; } }6. 启动完整服务dockercompose-fdocker-compose.prod.yml up-d--build看状态dockercompose-fdocker-compose.prod.ymlps应该看到NAME IMAGE STATUS ai-api ai-assistant:prod Up (healthy) ai-nginx nginx:alpine Up7. 验证上线本机验证# HTTP 跳转curl-Ihttp://api.your-domain.com# HTTP/1.1 301 Moved Permanently# Location: https://api.your-domain.com/# HTTPS 访问curlhttps://api.your-domain.com/health/live# {status: alive}# 带认证的业务接口curl-HX-API-Key:$(grepAPI_KEY .env|cut-d-f2)\https://api.your-domain.com/api/sessions# {sessions: [], total: 0}用浏览器打开https://api.your-domain.com/docs——Swagger UI 可以访问且浏览器显示连接安全。 服务正式上线五、上线后的运维1. 配置自动续期证书加一个 certbot 服务# docker-compose.prod.yml 里加certbot:image:certbot/certbotvolumes:-./nginx/certs:/etc/letsencrypt-./nginx/www:/var/www/certbotentrypoint:/bin/shcommand:-c trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 12h wait $${!}; donerestart:unless-stopped注意需要先docker compose up -d certbot起它。2. 日志轮转Docker 日志默认无限制会撑爆磁盘。配置 Docker 日志限制/etc/docker/daemon.json{log-driver:json-file,log-opts:{max-size:10m,max-file:3}}重启 Dockersudosystemctl restartdocker每个容器最多 30MB 日志——不会撑爆服务器。3. 定期备份备份数据库和配置# 加一个 cron 任务crontab-e内容# 每天凌晨 3 点备份03* * *cd/opt/ai-assistanttar-czf/opt/backups/ai-$(date\%Y\%m\%d).tar.gz data/ .envfind/opt/backups-nameai-*.tar.gz-mtime7-delete这行做了打包data/和.env存到/opt/backups/删除 7 天前的旧备份4. 简易监控查看服务器状态# 系统负载htop# 磁盘df-h# Docker 占用dockersystemdf# 容器状态dockercompose-fdocker-compose.prod.ymlps清理 Docker 无用资源每周dockersystem prune-f# 清理停止的容器、无用镜像、网络dockersystem prune-a--volumes# 更彻底小心 volume5. 应用日志查看# API 日志dockercompose-fdocker-compose.prod.yml logs-fapi# Nginx 日志dockercompose-fdocker-compose.prod.yml logs-fnginx# Nginx 访问日志最近 100 行tail-100/var/lib/docker/volumes/ai-assistant_nginx_logs/_data/access.log# 慢请求排查rt 1stail-1000/var/lib/docker/volumes/ai-assistant_nginx_logs/_data/access.log|\awk$NF 1.0|head-206. 故障排查清单常见问题及排查步骤现象可能原因排查502 Bad Gateway后端挂了docker compose ps看 api 状态503健康检查失败curl localhost:8000/health/ready504后端超时看 nginx error.logSSL 错误证书过期docker compose logs certbot域名不通DNS 没生效dig api.your-domain.com服务崩了OOMdmesg排错顺序docker compose ps— 容器都起来了吗docker compose logs api— 有报错吗curl localhost:8000/health/ready— 后端健康吗curl localhost/health/live— Nginx 通吗dig api.your-domain.com— DNS 对了吗从内到外一层层测。六、上线检查清单正式上线前逐项确认安全✅ SSH 只用密钥登录✅ 防火墙只开 22 / 80 / 443✅.env权限 600✅ API Key 强随机✅ 没有敏感信息提交到 git✅ Nginx 隐藏版本号server_tokens off✅ HTTPS 强制无 HTTP✅ HSTS 已启用✅ 常用安全头全加可用性✅ 容器restart: always✅ 健康检查配置正确✅ Docker 日志限制✅ SSL 证书自动续期✅ 数据库定时备份可观测性✅ 结构化日志JSON✅ Trace ID 全链路✅ Prometheus 指标接口✅ 关键错误有告警性能✅ Nginx Gzip✅ 连接池配置✅ 常用查询有索引✅ 静态资源缓存自动化✅ CI 自动跑测试✅ CD 自动构建镜像✅ Tag 自动部署这份清单能让你从能跑到能上生产。上线前刷一遍避免低级事故。七、30 天复盘走了多远1. 知识地图回顾┌──────────────────────────────────────────────────┐ │ 第 1 阶段Day 1-15 │ │ Python 基础 项目起步 │ ├──────────────────────────────────────────────────┤ │ Day 1-12 Python 语法12 天 │ │ Day 13-14 命令行 AI 助手 v1 / v2 │ │ Day 15 阶段复盘 │ ├──────────────────────────────────────────────────┤ │ 第 2 阶段Day 16-30 │ │ 后端工程化 上线 │ ├──────────────────────────────────────────────────┤ │ Day 16-17 数据库 ORM │ │ Day 18-19 pytest 测试 │ │ Day 20 CLI 打包发布 │ │ Day 21-24 FastAPI 全链路 │ │ Day 25 性能优化 │ │ Day 26 可观测性 │ │ Day 27-30 Docker CI/CD Nginx 上线 │ └──────────────────────────────────────────────────┘2. 30 天收获清单技术能力✅ Python 从 0 到能写生产代码✅ 异步编程asyncio✅ 数据库设计 ORM✅ 单元测试 集成测试✅ FastAPI 全栈后端✅ Docker 容器化✅ CI/CD 自动化✅ Nginx HTTPS 部署✅ 可观测性日志 / 指标 / 追踪工程能力✅ 从写脚本到做项目✅ 分层架构API / 业务 / 存储✅ 依赖注入✅ 接口契约✅ 测试驱动✅ 生产级配置软实力✅ 遇到问题先查文档✅ 学会看报错栈✅ 习惯记录踩坑✅ 每天有产出3. 项目进化史从 Day 13 到 Day 30项目长成这样v1Day 13命令行助手Mock LLM500 行代码本地跑v2Day 14加记忆系统800 行代码支持长对话v3-v4Day 16-17接入数据库1200 行代码会话持久化v5Day 18-20加测试 CLI2000 行代码90% 覆盖率v6Day 21-26转 HTTP 服务3000 行代码完整 FastAPI 后端v7Day 27-30上线4000 行代码公网可访问从一个玩具脚本到真实服务30 天。这就是项目驱动的学习的威力。4. 数据说话指标Day 1Day 30代码行数2~4000测试数040覆盖率0%90%Python 文件130部署方式无Docker CI/CD访问方式本地公网 HTTPS这不是感觉学到了是数字证明了。八、反思做得好和做得差做得好的1. 每天固定时间学 2 小时工作日晚上 9-11 点周末白天。比周末猛学一天效果好太多。2. 每天有产出哪怕只是 20 行代码也要落到文件上。这是学习和看视频的本质区别。3. 项目驱动不追求学完再做而是边做边学。Day 13 就有第一个可跑的版本后面是持续迭代。4. 记录踩坑每次遇到报错都记一句为什么错 / 怎么解。30 天积累下来就是一份宝贵的自留地。做得差的1. 前期过早引入 PydanticDay 11 讲 Pydantic 时其实还没到真正需要它的场景。应该在做 API 时再引入效果会更好。2. 异步一块练得太少asyncio 的概念过了但真正写 async 代码的机会不多。后面 Day 46 接真 LLM 时要补上。3. 没有开源项目贡献一直在自己写没读过大项目源码。后面要抽时间读一读 FastAPI / LangChain 的代码。4. 英文文档看得少一直在中文社区找答案英文一手资料看得不够。AI 领域更新快英文能力是长期刚需。调整方向1. 每周至少读一次英文文档Python / FastAPI / OpenAI 官方文档都是英文的直接从源头学。2. 开始读开源项目源码从 LangChain 开始理解大型项目的组织方式。3. 多写生产级代码接下来的 LLM 部分从第一天就按能上线的标准写。九、下一阶段预告Day 31-45大模型 API Prompt 工程核心任务把 Mock LLM 换成真 LLM。内容大纲Day内容31LLM 是什么大模型基础概念32OpenAI API 入门33流式输出SSE34Function Calling 入门35结构化输出36Prompt 工程基础37Few-shot / CoT38Token 管理与成本优化39多模型适配OpenAI / Claude / 通义 / DeepSeek40错误处理与重试策略41本地模型Ollama42流式 工具调用的组合43对话历史与上下文管理44LLM 应用测试策略45阶段复盘把 Mock 换成真 LLM这一阶段会实现✅ 真实 LLM 调用✅ 流式输出打字机效果✅ Function Calling工具调用雏形✅ 多模型切换✅ 成本控制做完 Day 45你的助手就是一个真 AI 助手了。Day 46-60RAG 向量数据库核心任务让助手读懂你的文档。Day 61-80Agent 框架核心任务让助手会用工具。Day 81-100完整 Agent 项目核心任务做一个能上线、有用户的完整 Agent 产品。十、给跟我一起学的你30 天了感谢还在跟着看的你。几个想说的1. 不要打卡式学习“看了 30 篇文章不等于学会了 30 天”。真正的学习是每一篇的代码都跑过、改过、想过。哪怕只跟着做了 10 天也比看了 30 天强。2. 慢一点没关系有人 30 天能做完的事你 60 天做完不丢人。重要的是持续不是速度。3 个月后回头看每天 1 小时也是 90 小时。3. 不要怕答不出来遇到不懂的先记下来别停在那。继续往下走回头再看“不懂可能会自己变懂”。4. 找个人一起学评论区是很好的交流场。看到别人卡在哪你也能学到东西你卡住的地方别人可能已经踩过坑。5. 30 天后你回头看如果你从 Day 1 跟到现在请你此刻回头看看 Day 1 的那段代码。你会发现——“这么简单的东西当时怎么卡了半天。”这就是成长。十一、今日总结今天核心收获三件事完整走通了从代码到上线的全流程租服务器 → 配域名 → 装 Docker → 部署 → HTTPS → 运维上线不只是跑起来还要 SSL、限流、日志、备份、监控、告警30 天从 0 到 1从 Python 语法到能上线服务一个人、一台电脑、每天 2 小时一个感受很多人问学 Python 要多久才能做项目。答案不是学完语法后而是从第一天就开始做。Day 1 写 Hello WorldDay 30 上线 HTTPS 服务。中间隔的不是学了多少知识是坚持了多少天。你的项目在线上跑着了。这件事本身就是最好的证明——你不再是学 Python 的人而是用 Python 做出东西的人。Day 30 完成度✅明日预告Day 31进入大模型世界的第一天。大模型到底是什么从 GPT 到 ChatGPTToken / 上下文窗口 / 温度这些概念主流大模型对比GPT-4o / Claude / DeepSeek / 通义怎么选成本、速度、能力三角注册 OpenAI / 通义 / DeepSeek 账号拿到第一个 API Key明天我们的助手要接入真正的大脑。最后如果这篇对你有用请一定点个赞——30 天的成果值得一个赞。评论区互动你从第几天开始跟的30 天里最大的收获是什么下一阶段最期待学什么说出来我们互相见证。100 天第 31 天见。附录系列目录第一阶段已完成 ✅天数内容状态01-06Python 语法基础✅07-08HTTP 异步✅09-12工程基础正则/装饰器/Pydantic/日志✅13-14命令行 AI 助手 v1 / v2✅15阶段复盘✅16-17数据库 ORM✅18-19pytest 测试✅20CLI 打包发布✅21-24FastAPI 全链路✅25性能优化✅26可观测性✅27Docker 容器化✅28CI/CD✅29Nginx HTTPS✅30正式上线 阶段复盘✅第二阶段进行中 阶段天数内容大模型31-45LLM API Prompt 工程RAG46-60向量数据库 知识库Agent61-80LangChain / 工具调用实战81-100完整 Agent 项目上线30 天已过70 天还在。一起从切图仔变成 Agent 开发者。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →