豪子博客开源,附上源码和部署方法

从 870 行到 3000 行:我为什么还要手搓一个博客系统?

之前我写过一篇《用 Flask + SQLite 手搓一个完整博客系统》,讲的是它的原型 NeonScript——一个 870 行代码的玩具。当时不少朋友留言说“等它长大一点再告诉我”。半年过去,它长大了不少:870 行变成了 3000 多行,从“能跑”变成了“真在用”,现在我把代码开源了。

Python 版本停更;现在 PHP + MySQL 持续更新:https://www.infowe.site/projects/9

这篇文章回答两件事:我为什么放着现成的不用,非要自己写;以及,如果你也想搭一个,怎么把这份代码跑起来——我会尽量写得让完全没部署过服务器的人也能跟着做。


先说结论:自己写博客系统,多半不划算

我不是要劝你也手搓一个。真的,写博客系统是那种“别人一小时搭完、我要写一个季度”的事。如果你只是想好好写文章,用现成的就行,省下的时间够你多写五十篇。

但我还是写了,而且不后悔。原因下面一个个说。

1. 我受够了“换个工具丢一次配置”

早期我用过静态博客生成器:Hexo、Hugo 都折腾过。它们的好处是快、免费、能放 GitHub Pages,但坏处也很实在:

  • 每次换电脑,先装 Node 或 Go 环境,再 npm install 或下载主题,装完还经常因为版本对不上跑不起来;
  • 想加个评论?要么挂第三方服务(国内访问时好时坏),要么自己折腾 gitment / giscus 之类;
  • 想要个后台管理界面?不存在的,改个分类都要去翻 Markdown 的 frontmatter;
  • 图床、代码高亮、阅读统计,全是零零散散拼起来的,哪天某个服务挂了,页面就少一块。

文章越写越多,配置越来越散,我越来越烦。我真正想要的东西其实特别朴素:文章是纯 Markdown 存在本地,数据是能被一个文件带走的,管理有界面,部署之后不用天天伺候。

找了一圈:WordPress 功能全但太重(一台 1G 内存的小鸡跑它加 PHP + MySQL 有点喘);Typecho 轻一些,但主题和插件生态这些年明显沉寂;动态博客三件套(服务器 + 数据库 + 框架)里又没有什么“开箱即用还轻”的选项。最后我决定自己写一个——反正我是写 Python 的,Flask 又不重。

2. 数据要能“一整个拷走”

这是我特别在意的一点。这个博客的数据库是 SQLite,单文件 data/blog.db,加上 posts/ 里 Markdown 源文件、uploads/ 里上传的图片,整个博客的全部内容就是几个文件夹。备份 = 拷贝;迁移服务器 = 打包带走;想导出 = 直接把 Markdown 拿走,永不绑定。

数据在自己手里,才谈得上“这是我的博客”。平台再好,哪天它关了、或者我账号没了,文章还在,这个安全感是现成方案给不了的。

3. 有些需求,只有自己写才会被认真对待

用现成系统时,遇到不满意的地方,你的选择只有“忍着”或“换一个”。自己写之后,需求会变成一行行真实代码,你会发现很多“我以为很简单”的功能其实坑很深。举几个这半年真实踩过的:

  • 评论盖楼。评论要做到树形回复(楼中楼)不难,难的是“删一条评论要把它的整棵子树一起删掉”“待审核的回复不能先通知对方,审核通过后才补发”“博主自己回复不用走审核也不打扰自己”。这些细节,用第三方评论系统你根本碰不到,自己写才懂。
  • 头像是个玄学。我做了 Cravatar → Gravatar → QQ 头像逐级回退,结果某些精简版服务器连证书校验都过不了,还得加“校验证书失败就降级重试”。最后又补了一个本地上传头像的选项——传上去之后还出过一个很隐蔽的 bug:上传目录从 /static/uploads 挪到根目录 /uploads 之后,判断“头像文件是否存在”的函数还只认 /static/ 开头的路径,结果头像明明在,页面却一直显示“未设置”。
  • 移动端是真的烦。做文章列表卡片时,鼠标悬停有背景色,桌面看着挺好。结果手机上、以及把浏览器窗口拖窄时,问题全来了:卡片用了负 margin 外扩,移动端悬停底色会把整行顶到屏幕边缘、圆角被裁掉;更诡异的是触摸屏上“悬停”状态会一直黏住,点完一篇文章底色还亮着。这些不拿真机一个个试,永远发现不了。
  • 登录安全不敢马虎。后台登录我加了基于 IP 的失败计数 + 验证码,防爆破。虽然个人博客被爆破的概率不高,但“后台裸奔”这件事我心理上过不去。

这些坑,单个看都不大,但加起来就是“为什么现成系统满足不了我”的答案——不是它们做不到,是它们没理由为“我”做到。


现在的样子

简单介绍一下这套系统现在(v1.3.20)的能力,仓库 README 里有完整清单,这里挑重点:

  • 写作:后台是 Markdown 编辑器(Vditor),支持传图、代码高亮、Mermaid 流程图、数学公式、思维导图一类的扩展;
  • 前台:首页、文章详情、分类/标签筛选、搜索、分页、关于页、时间线都有;内置两套主题(default / tech),代码里主题是独立目录,可以照着写自己的;
  • 动态能力:评论系统(可开关)、友情链接申请与审核、GitHub 项目自动抓取展示、文章阅读时长;
  • 后台管理:文章、设置、友情链接、项目、评论、站点信息都在 /admin 里管;
  • 零外部服务:除了可选的第三方头像源,整站不依赖任何外部 API,静态资源全部本地。

技术栈非常简单,没有一处是为了炫技:

层次 用啥 原因
Web 框架 Flask 轻,一个文件能塞下整个应用
数据库 SQLite 单文件、零配置、备份就是拷文件
模板 Jinja2 Flask 标配,继承机制够用
Markdown Python-Markdown 栅栏代码块、表格、列表都能开
前端 原生 CSS / JS 无框架、无构建步骤,加载快
图标 内联 SVG 按需引入,不引图标库

架构上最“离谱”但也最省事的一点:整个后端就一个 app.py 文件。从 870 行的原型长到现在 3000 多行,还是单文件。好处是部署就拷一个文件、逻辑跳转 Ctrl+F 就行;坏处是……也明显,超过 3000 行之后单文件已经有点“缝合怪”了。等它再长大,我可能会拆成包结构,但目前没有拆的紧迫理由——能用就别动,是我写个人项目最大的原则。


开源了,仓库在这里

如果你想先看看再决定要不要部署,README 里写了功能、目录结构、快速开始;这篇博客剩下的大半篇幅,就是给“看完了,我想自己部署一个”的人准备的。


保姆级部署教程

目标读者:有一台 Linux 服务器(或云服务器),有一个域名(没有也能部署,后面说),但没怎么碰过 Nginx、systemd 的人。我会把每一步该敲什么、为什么敲,都写清楚。

本教程基于 Ubuntu / Debian。其它发行版把 apt 换成你的包管理器即可。整个流程走完大概需要 20~40 分钟。

第 0 步:准备

你需要:

  1. 一台 Linux 服务器(内存 1G 就非常够用,这套系统真的不挑);
  2. 一个解析到这台服务器的域名(想先用 IP 访问也可以,跳过第 8 步 HTTPS 部分即可);
  3. SSH 能连上服务器,并且用户有 sudo 权限。

第 1 步:装环境

SSH 登录服务器,先更新软件源,然后安装 Python 3、pip、venv 和 Nginx:

评论 4

豪子
豪子 博主 重庆

在使用过程中遇到bug;可在评论区留言,我第一时间修复。

𤠌again
𤠌again 重庆

宝塔面板,怎么配置?

豪子
豪子 博主 @𤠌again 重庆

Github上有bt的教程

麒麟猪
麒麟猪 广东 江门

哈哈哈,测试评论

写评论
0 / 2000