2026.08.24 — LAB — 2 MIN
个人博客项目概述
大一暑假从零到上线的个人博客,Obsidian + GitHub + Spring Boot,完整拉通了一条从需求到部署的链路。
个人博客项目概述
这是我做的第一个完整上线的个人项目。
从想做一个东西的念头开始,到现在 https://vansye.asia 能访问了。第一次完整拉通了一个项目的全流程——从需求分析、设计、编码到部署上线。

项目背景
大一下学了 JavaWeb,跟着教程做过几个 CRUD 项目,但总觉得差点什么。面试的时候被问到「你做过什么项目」,能说都是教程里的东西,没有自己的东西。
所以决定:做一个真正属于自己的 JavaWeb 项目。
三个动机:面试加分项、学真正从零开始的东西、有一个地方持续记录学习历程。
功能特性
博客的核心功能:
- 文章发布:写完 push 上去,博客自动更新
- Markdown 渲染:代码块、图片、表格正常显示
- 归档页:按时间浏览历史文章
- About 页:介绍自己
- 移动端适配:手机上也能正常阅读
架构上三条铁律:
- vault 是唯一内容源,数据库只是派生读模型
- 发布闸门 fail-closed,三重判定
- GitHub 是传输层,不另造同步通道
技术要点
- JGit:在 Java 里操作 git,fetch + diff 拿到变更文件清单
- Redis SETNX:webhook 防重复投递锁
- 内容哈希:幂等同步,同一 commit 多次同步结果一致
- 纯静态前端:HTML + CSS,约 800 行,没有构建工具
项目结构
后端(Spring Boot)
├── PublicationGate # 发布闸门(含单元测试)
├── MarkdownRenderer # Markdown 渲染
├── SyncService # Webhook + 轮询兜底
└── VaultPoller # 定时全量同步
遇到的坑
SnakeYAML 布尔词表
publish: yes 会被解析为 Boolean.TRUE,不是 null。
图片路径
Obsidian 默认把附件放到 _assets/,但这个目录不在 git 白名单里——文章引用了图片,但图片没跟着 push,博客上全部裂开。
浅克隆
用 --depth 1 时,文章日期全是今天,部分图 404。
时间线
8/15「准备开始做个人网站博客」 → 8/24 上线,13 天完成全流程。
心得
做完这个项目最大的收获是:
从一个想法变成一个实际的东西——不是 demo,是实打实上线的项目。
技术上可能感觉没什么高深的,也就是做了一个简单的流程。但这个过程里学到的东西,比教程里的多得多。
以后再面对一个新项目,不会再是从零开始的迷茫,而是知道该从哪一步开始。
技术栈
- Java, Spring Boot, JGit, SnakeYAML
- MySQL, Redis
- Docker Compose, nginx
- HTML + CSS(纯静态,约 800 行)
End of plate