最近在做一个新的Side Project,老问题又来了:环境搭建。
Node.js装哪个版本?数据库用MySQL还是PostgreSQL?Redis要不要?Nginx配不配?每次新项目光搞这些就要花半天。
然后我突然意识到一件事——这玩意儿应该一次搞定,反复用。
所以我花了两个晚上,写了一个Docker Compose模板。现在任何新项目,git clone -> docker compose up -d -> 开始写代码。3分钟。
这篇文章就拆一下这个模板的结构,也聊聊为什么我觉得每个独立开发者都该有自己的”启动模板”。
模板长什么样
project-starter/
├── docker-compose.yml
├── .env.example
├── services/
│ ├── app/ # 主应用
│ ├── db/ # 数据库
│ ├── cache/ # 缓存
│ └── proxy/ # 反向代理
└── scripts/
├── setup.sh # 一键初始化
└── reset.sh # 重置环境
核心思路就一个:把最常用的服务打包成可插拔的模块。
为什么自己写而不是用现成的
网上现成的Docker模板不少。Laravel Sail、Next.js的Docker示例、各种Starter Kit。
但我发现一个问题——它们都太”完美”了。
一个模板恨不得装10个服务:Elasticsearch、Redis、RabbitMQ、MinIO……我一个小项目哪用得上这些。而且每个模板都有自己的目录结构,自己的配置习惯,切来切去反而增加了心智负担。
我的需求其实很简单:
- Node.js(具体版本看项目)
- PostgreSQL(大部分项目够用了)
- Redis(需要session或者缓存的时候)
- Nginx做反向代理(本地开发用)
- 没了。
所以我写了一个最精简的版本。想加东西?docker-compose.override.yml自己加。
模板的核心设计
1. 环境变量驱动
.env.example里定义所有可变参数:
APP_PORT=3000
DB_PORT=5432
DB_NAME=myapp
DB_USER=myapp
DB_PASSWORD=changeme
REDIS_PORT=6379
第一次跑的时候 cp .env.example .env,改密码,完事。
2. 数据持久化分离
数据卷单独定义,不会因为docker compose down就丢数据:
volumes:
postgres_data:
redis_data:
这点太重要了。早期我踩过这个坑,docker compose down -v直接清库,欲哭无泪。
3. 开发模式优先
docker-compose.override.yml里挂载源码目录、开启热更新:
services:
app:
volumes:
- ./services/app:/app
environment:
- NODE_ENV=development
生产部署再换个prod配置。开发环境永远是可写的、可调试的。
实际使用感受
用了两周,最大的变化是启动新项目的心理门槛降低了。
以前想试一个新想法,光是环境搭建就劝退一半热情。现在就是:
git clone my-template new-project
cd new-project
./scripts/setup.sh
code .
然后就开始写业务代码了。这种流畅感很难描述——有点像你写代码的时候编辑器秒开,没人喜欢等。
而且有个意外的收获:模板本身也在进化。每次遇到新需求,比如加了Elasticsearch、换了数据库版本,我都会更新模板。下次另一个项目直接用。
数据支撑:根据2025年Stack Overflow开发者调查,开发者平均每周花7.5小时在环境配置和工具链维护上。我自己的模板帮我省了大约80%的这个时间——从半天降到3分钟。按一年20个Side Project算,省出来的时间够做一个完整的产品了。
给独立开发者的建议
如果你还没自己的启动模板,我建议你花一个周末搞一个。
不一定非要是Docker。可以是:
- 你的Next.js Starter(Auth + DB + 支付 + 邮件)
- 你的Go API骨架(路由 + 中间件 + ORM + 测试)
- 你的WordPress主题开发环境
- 你的AI工作流模板
关键是”你的”。不用管别人觉得好不好,你觉得顺手最重要。
我现在有5个模板在不同场景用:
- 全栈Web App(上面这个Docker模板)
- Chrome Extension Starter(TypeScript + Vite + Tailwind)
- AI API Proxy(Cloudflare Workers + Hono)
- 数据分析Notebook(Jupyter + Pandas + 常用可视化库)
- WordPress工具脚本(批量处理markdown转文章、图片压缩)
每个都是踩过坑之后沉淀下来的。下次再踩同样的坑,说明你没认真总结。
模板在哪
这个Docker模板我放在GitHub上了,MIT协议,随便用。
但说真的,我建议你看完自己写一个。自己写一遍才能理解每个配置为什么这么设,下次出问题也知道怎么修。
复制粘贴别人的模板,本质上跟手动搭环境没什么区别——出了问题你一样不知道怎么排查。
这篇文章是我的”可复用技术资产”系列之一。我打算把这个系列做成一个持续更新的库,每个模板都有详细的文档和实际使用案例。下篇写Chrome Extension Starter,聊聊怎么从零搭一个现代化的插件开发环境。
