Lionel · 李豪个人兴趣、文章、摄影、视频和音乐
Article · 文章

从零搭了个个人网站,聊聊我是怎么搞的

Lionel
2026/05/03 · 3 min read

从搭起个人网站到把它长期跑稳,记录 Next.js、MySQL、R2、部署与备份里需要提前想清楚的事。

为什么要做这个站

我一直想有个自己的小站。写过的东西、拍的照片、常听的歌、最近玩的游戏,散在各种平台上很容易就忘了。把它们放到同一个地方,至少以后还能找回来。

这个站前后折腾了一阵,终于能稳定跑着。我把几个真正踩过的坑记下来,留给以后维护,也给同样想做个人网站的人参考。

站里用了什么

页面用 Next.js 15。它能在服务端把内容先渲染出来,公开页面打开得快些。表单和管理操作用 Server Actions,前后端都写 TypeScript,接口改动时少一点靠记忆对齐的麻烦。

数据放在 MySQL 8.4,Prisma 负责模型和迁移。文章、兴趣、媒体、歌单和留言都在这里。图片和音频已经迁到 Cloudflare R2,浏览器通过预签名地址直接上传,数据库只保存元数据和公开地址。

线上跑着 Next.js、MySQL、Nginx 和 Cloudflare Tunnel。容器把应用和数据库隔开,Nginx 处理反向代理,Tunnel 把公开域名接到服务器。整套东西谈不上复杂,真正费心的是升级、备份和出了问题以后能不能恢复。

几个后来才补上的规矩

服务器直接访问 GitHub 并不总是顺畅。我现在让本地的 Mac 做中转,先在本地拿到代码,再同步到服务器构建。这个流程一开始有点别扭,写成脚本以后就稳定多了。

Prisma 的迁移也让我吃过亏。开发迁移应该在本地生成和检查,生产只应用已经确认过的迁移。把两件事混在服务器上做,环境一有差别就很难收拾。

文件上传同样不能只看表单能不能提交。后台负责签名,浏览器直接把文件传到对象存储,前端还得处理 CORS 和失败提示。看起来只是一个上传按钮,少了其中一环,问题会在用户手里出现。

备份比功能重要

没有备份的网站,用起来总有点悬。服务器故障、误删数据和账号问题都不稀奇,照片和文章一旦丢掉,后悔通常来得很晚。

数据库会定期导出并压缩,保留日备份和周备份。对象存储也会同步到另一份本地副本。备份脚本每天跑一次,结束后清理过期文件。它平时几乎没有存在感,真出问题时才知道它有没有用。

恢复也得提前想清楚。数据库从备份导入,代码和环境变量重新部署,对象文件继续从 R2 读取。流程最好偶尔真正走一遍,只有能恢复的备份才算备份。

这个网站以后还会慢慢加内容和功能。现在回头看,最有用的经验很普通。先把一个能用的版本跑起来,把每次踩坑写下来,再把部署和备份做成不需要人盯着的流程。

#文章
Lionel Written by
我叫李豪,来自云南昭通,现居杭州 喜欢摄影、足球 、Vibe Coding 和老婆一起养了两只猫
Scinentistcoldplay