搭建这个博客,我选了 Next.js + Docker 的一万个理由
前言
作为一个有几年 Java 开发基础、但对现代前端和 DevOps 比较手生的开发者,我决定搭建一个个人的技术博客。
这篇文章记录了从零到一的全过程——不仅仅是写代码,更重要的是技术决策的思考过程。

为什么要有这个博客?
面试的时候最怕什么?"你有没有什么项目可以讲讲?"
这个博客,就是我的项目。它不是一个简单的 Hexo 静态站,而是一个:
- 前后端分离的全栈应用
- 容器化部署的实践案例
- 持续集成/持续部署的落地项目
面试官看到这个博客,可以聊技术选型、可以聊架构设计、可以聊部署流程——这不比背八股文强?
技术选型
前端:Next.js
选择 Next.js 的理由:
- SSR + SSG:博客内容可以被搜索引擎收录(比纯 SPA 强)
- 全栈能力:Next.js 的 API Routes 可以直接做后端,但我选择分离——职责单一更符合工程实践
- React 生态:组件化开发,可复用,好维护
- 性能:自动代码分割、图片优化、ISR 增量静态生成
后端:Fastify + Prisma
- Fastify:比 Express 快 2-3 倍,原生支持 TypeScript
- Prisma:ORM 界的扛把子,类型安全、自动迁移、查询优化
数据库:PostgreSQL
选 PG 不选 MySQL 的原因:
- JSONB 支持(灵活存储)
- 全文检索(博客天然需要)
- 开源社区活跃,文档完善
部署:Docker Compose
- 三服务编排:PostgreSQL + Backend + Frontend
- 统一管理,一键启动
- 环境隔离,开发/生产配置分离
架构图
用户 → Nginx (443/80) → [Frontend:3000] → API → [Backend:4000] → [PostgreSQL:5432]
遇到的坑
1. Docker 网络问题
一开始后端连不上数据库——没注意 service 之间的通信要用容器名而不是 localhost。
解决:DATABASE_URL 里用 postgres:5432 而不是 localhost:5432
2. Prisma 在 Docker 中找不到 schema
在 Docker 构建时需要运行 prisma generate。Dockerfile 里要注意 copy schema 文件。
3. Next.js 的 standalone 模式
默认 docker build 出来的 image 很大(200MB+)。用 output: 'standalone' 可以降到 ~50MB。
总结
这个博客不是一个内容平台,它是我的能力展示。
- 想看我怎么组织代码?→ 看 GitHub repo
- 想看我怎么设计架构?→ 读这篇文章
- 想看我怎么部署?→ 看 docker-compose.yml
一切都在代码里。