Dokploy 10 分钟上手:VPS 自建开源 PaaS,告别 Heroku 与 Vercel 高额账单
结论先行:出海团队手上有 3 个以上长期运行的微服务或 SaaS 原型、又不想每月为 Vercel、Railway 或 Render 的账单持续买单时,在一台 2 核 4G 的 VPS 上自建 Dokploy 是成本最优解。基于 Docker 与 Traefik 架构,一行命令即可搭建属于自己的开源 PaaS 平台。支持 GitHub/GitLab 的 Git Push 代码自动触发构建、免费全自动 Let’s Encrypt 证书签发、一键拉起独立 PostgreSQL/Redis 数据库。业务代码与数据完全掌控在自己手中,告别平台锁死与计费刺客。
0、写在前面
做海外 SaaS 或独立开发产品,在产品跑通盈利前,每一分基础设施成本都要精打细算。
商业托管平台的收费陷阱普遍存在:
- Vercel:Serverless 架构对前端友好,但一旦涉及常驻后端、长时间定时任务或超过免费配额,每月账单迅速蹿升至几十美元;
- Railway / Render:早期的免费套餐逐步缩水或休眠,冷启动耗时动辄半分钟,多个微服务按月付费后年开销往往超出数百美元;
- 数据隐私与平台锁死:生产数据库托管在第三方平台,导出受限且容易遭遇策略变更。
若完全回到手动运维,配置反向代理、申请 SSL 证书、配置 Webhook 脚本又会吞噬宝贵的开发时间。
Dokploy 是为了平衡「PaaS 便捷体验」与「VPS 极低成本」而诞生的开源解决方案。它基于 Docker 与高性能边缘代理 Traefik,在一台便宜的 Linux VPS 上提供了媲美 Vercel 的自动化部署体验。
1、期望目标
阅读并实操本文后,你将达成以下目标:
- [ ] 在全新 Linux VPS 上通过官方脚本一键部署 Dokploy 控制中心;
- [ ] 配置泛域名解析并实现基于 Traefik 的全自动 Let’s Encrypt SSL 签发;
- [ ] 关联 GitHub/GitLab 仓库,配置 Webhook 实现
git push自动触发构建部署; - [ ] 掌握 Nixpacks / Dockerfile 多种构建模式,免去手工编写复杂部署脚本;
- [ ] 在 Web 控制台一键拉起独立 PostgreSQL、MySQL、MongoDB 与 Redis 数据库;
- [ ] 掌握宿主机 Swap 虚拟内存扩展与 Traefik 路由排障技巧。
2、技术架构与工具对比
主流部署方案横向对比
| 评估维度 | 商业 PaaS (Vercel / Railway) | Coolify | Dokploy | 原生 Docker Compose |
|---|---|---|---|---|
| 每月费用 | $20 - $100+ / 月(超额按量付费) | VPS 成本(约 $5 - $10/月) | VPS 成本(约 $5 - $10/月) | VPS 成本 |
| 内存底噪开销 | 0 MB(由平台托管) | 较高(面板底噪 1.5GB - 2GB) | 极低(面板底噪约 300MB - 500MB) | 0 MB |
| 反向代理引擎 | 平台专有云网关 | Traefik | Traefik | 手动 Nginx / Caddy |
| 自动化部署 | Git Push 触发(开箱即用) | Git Push / Webhook | Git Push / Webhook | 需自建 CI/CD 脚本 |
| 数据库一键创建 | 额外按实例收费 | 支持多种数据库一键启停 | 支持一键创建多类型数据库 | 手写 YAML 编排 |
| 数据主权 | 存储在第三方云端 | 完全自管,在宿主机磁盘 | 完全自管,在宿主机磁盘 | 完全自管 |
Dokploy 核心运作流程
3、实操步骤
3.1 准备硬件与泛域名解析
硬件要求
- 操作系统:Ubuntu 22.04 LTS 或 Ubuntu 24.04 LTS(纯净系统为佳);
- 最低配置:1 核 CPU、2GB 内存(建议增加 2GB Swap 虚拟内存);
- 生产推荐:2 核 CPU、4GB 内存(可轻松平稳并发跑 5 至 10 个全栈项目与数据库)。
DNS 域名解析配置
在 Cloudflare 或 Namecheap 等域名控制台添加两条解析记录:
| 记录类型 | 主机名 (Name) | 指向目标 (Target / Value) | 代理状态 (Proxy) | 说明 |
|---|---|---|---|---|
| A | dokploy |
<你的VPS公网IP> |
DNS only (仅解析) | 用于访问 Dokploy 后台面板 |
| A | *.app |
<你的VPS公网IP> |
DNS only (仅解析) | 泛域名解析,供后续子应用秒级分配 |
提示:初次签发 Let’s Encrypt 证书时,若使用 Cloudflare,务必先将小黄云切换为「DNS Only(灰云)」,避免 CDN 阻断 ACME HTTP-01 验证挑战。
3.2 一键部署 Dokploy 控制中心
登录 VPS 终端,运行 Dokploy 官方提供的标准安装脚本:
1 | # 执行官方自动化安装 |
该安装脚本会自动完成以下动作:
- 检测并安装最新版 Docker 引擎与 Compose 运行时;
- 拉取 Traefik 边缘代理容器与 Dokploy 管理后台容器;
- 初始化数据存储目录
/etc/dokploy; - 启动并在 3000 端口提供服务。
安装完成后,终端会打印出访问提示:
1 | Dokploy is installed! |
3.3 首次初始化与管理员配置
在本地浏览器打开:
1 | http://<你的服务器IP>:3000 |
- 设置管理员:输入你的电子邮箱与强密码完成初始管理员注册;
- 绑定主面板域名:
- 登录后台后,点击左下角 Settings → Server;
- 在 Domain 输入框中填入规划好的主域名(例如
dokploy.example.com); - 勾选 HTTPS (Let’s Encrypt) 并输入通知邮箱;
- 保存后,Traefik 会在后台向 Let’s Encrypt 自动完成证书申领并切换为安全连接。
3.4 实操:从 GitHub 部署一个全栈 Node.js 应用
步骤 1:创建项目与关联应用
- 在 Dokploy 左侧点击 Projects → 点击 Create Project,命名为
my-saas; - 进入项目后,点击 Create Service → 选择 Application(应用服务);
- 命名服务为
api-server。
步骤 2:连接 Git 代码仓库
在服务配置的 Provider 选项中选择你的代码托管源:
- GitHub / GitLab:可直接通过 OAuth 授权连接私有仓库;
- Git:支持填入任何公共或私有 Git URL(配合 Deploy Key SSH 密钥)。
填入仓库分支(如 main)。
步骤 3:配置构建模式(无需手动编写 Dockerfile)
Dokploy 内置了由 Railway 研发的开源构建引擎 Nixpacks:
- 它会自动检测仓库中的
package.json、requirements.txt、go.mod或Cargo.toml; - 自动识别 Node.js / Python / Go 版本并安装对应依赖;
- 自动运行
build与start脚本,开发者无需在仓库中维护繁复的Dockerfile。
步骤 4:注入环境变量与绑定二级域名
- 点击 Environment 标签页,以键值对形式粘贴你的应用环境变量(例如
DATABASE_URL、JWT_SECRET); - 点击 Domains 标签页,点击 Add Domain,填入
api.app.example.com,端口选择应用内部监听端口(通常为3000或8080),勾选 HTTPS。
步骤 5:开启 Webhook 自动部署
在应用详情页的 Deployments 栏目中复制 Webhook URL。
打开 GitHub 仓库的 Settings → Webhooks → Add webhook:
- Payload URL:粘贴复制的 Dokploy Webhook 链接;
- Content type:选择
application/json; - Which events:选择
Just the push event。
现在,只要本地敲下 git push,GitHub 会毫秒级通知 Dokploy。Dokploy 在后台自动拉取代码、利用 Nixpacks 增量打包镜像、无缝热更新容器,全程耗时不到两分钟。
3.5 实操:一键创建独立托管数据库
在同一个项目中,点击 Create Service → 选择 Database:
- 支持选择 PostgreSQL、MySQL、MongoDB、Redis 或 MariaDB;
- 输入数据库账号与自定义密码;
- 点击 Deploy。
数据库拉起后,Dokploy 会在界面上清晰展示内部连接地址 (Internal Connection):
1 | postgresql://postgres:MySecretPass2026@my-saas-db:5432/postgres |
此连接地址运行在 Docker 内部桥接网络上,完全不对公网开放,避免了暴露在公网遭恶意扫描攻击的安全风险。你的应用直接使用该地址连接即可。
4、生产级运维避坑与加固
避坑 1:宿主机原有 Nginx 占用 80/443 导致 Traefik 崩溃
- 现象:启动 Dokploy 后,无法访问应用,Traefik 容器持续报错重启。
- 根因:Dokploy 依赖 Traefik 独占宿主机的 80 与 443 端口以处理域名路由和 ACME 证书。如果服务器之前手工安装了
nginx或caddy服务,端口冲突会导致 Traefik 无法监听。 - 解法:在安装 Dokploy 前彻底释放 80/443 端口:
1
2sudo systemctl stop nginx
sudo systemctl disable nginx
避坑 2:小内存 VPS 在应用构建期间被 OOM 强行杀死
- 现象:执行部署时,Next.js 或 Nuxt.js 在执行
npm run build阶段突然中断,日志提示Killed或Command failed with exit code 137。 - 根因:Node.js Webpack / Turbopack 编译打包时峰值内存容易瞬间突破 1.5GB。1GB 或 2GB 内存的服务器若无交换分区,会被 Linux 内核 OOM Killer 强制终结进程。
- 解法:为 VPS 配置 4GB 的 Swap 分区缓冲:
1
2
3
4
5
6# 创建 4GB Swap 交换文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
避坑 3:Let’s Encrypt 证书签发超时或失败
- 排查路径:
- 确认 Cloudflare 解析记录未开启黄色小云朵代理(需先设为 DNS Only);
- 确认云服务器安全组(Security Group)与 UFW 防火墙均放行了 TCP 80 与 443 端口;
- 执行
curl -I http://你的域名/.well-known/acme-challenge/test确认流量能够到达 Traefik。
5、FAQ
Q1:Dokploy 与 Coolify 相比怎么选?
如果你追求界面清爽、极度轻量的系统底噪(512MB 到 2GB 内存 VPS 也能平稳运行),选 Dokploy;如果你需要极度庞大的应用模板市场或多服务器集群网格调度,选 Coolify。对于大多数单机出海独立开发者,Dokploy 的运行响应速度明显更快。
Q2:如果 VPS 磁盘故障,如何进行灾难恢复?
Dokploy 的所有关键应用元数据、Traefik 证书、项目配置均保存在宿主机的 /etc/dokploy 目录下。只需配置一个简单的定时任务,每天将 /etc/dokploy 目录打包压缩并同步到 AWS S3 或 Cloudflare R2 对象存储,重装系统后解压即可完全复原。
