一台 2C4G 的 VPS,装上 Dokploy,就有了自己的部署平台:连 Git 仓库自动构建、一键发数据库、自动签 HTTPS、监控 CPU 内存。开源、可自托管,官方一句话概括它的定位——a free, self-hostable Platform as a Service (PaaS)。
一、项目介绍
Dokploy 是 TypeScript 写的自托管 PaaS。和 Vercel 的区别在于:Vercel 帮你管服务器,Dokploy 帮你管你自己的服务器。
官方 README 的定位写得很直白:Open Source Alternative to Vercel, Netlify and Heroku。三个对标产品分别对应三种典型场景——Vercel 管前端、Netlify 管静态站、Heroku 管应用托管,Dokploy 把这三件事都做了,另外加了数据库管理和多节点。
技术上它不重新造轮子:底层用 Docker Swarm 编排,路由交给 Traefik。这一点很重要,后面排查问题时你会反复用到。
仓库 3.8 万 star,主分支最近提交 2026 年 10 月 31 日。
二、功能拆解
按官方 README 的 Features 逐条拆:
应用部署 - Applications:支持 Node.js、PHP、Python、Go、Ruby 等任意类型的应用,本质是给你一个构建 + 运行的容器环境 - Docker Compose:原生支持 compose 文件,复杂的多容器项目直接扔进去 - Templates:一键部署开源模板(Plausible、Pocketbase、Calcom 等),省掉手写 compose
数据与存储 - Databases:MySQL、PostgreSQL、MongoDB、MariaDB、libsql、Redis 六种,点几下建库 - Backups:数据库自动备份到外部存储(S3 兼容等)
网络与路由 - Traefik Integration:自动接管路由和负载均衡,域名绑上就自动签证书 - Multi Server:可以把应用部署到其它服务器,集中管理
可观测与通知 - Real-time Monitoring:每个资源的 CPU、内存、存储、网络实时曲线 - Logs & Metrics:容器日志和主机指标可以转发到 Grafana(Loki/Prometheus/Mimir)、Datadog、New Relic、InfluxDB、VictoriaMetrics、Better Stack、Elasticsearch/OpenSearch、Splunk、AWS CloudWatch,并且按项目/环境/应用打标签 - Notifications:部署成功或失败时推送到 Slack、Discord、Telegram、邮件
管理与扩展 - Multi Node:基于 Docker Swarm 横向扩节点 - CLI/API:命令行和 API 都能操作,方便接 CI - Self-Hosted:整个平台自己托管
一句话总结取舍:它不是 Kubernetes。想要 K8s 那套 CRD、Operator、弹性伸缩,Dokploy 给不了;但如果你只是想让几台 VPS 跑起十几个服务、改完代码自动上线,它的复杂度刚刚好。
三、官方链接
- GitHub 仓库:https://github.com/Dokploy/dokploy
- 官网:https://dokploy.com
- 官方文档:https://docs.dokploy.com
- 安装脚本:https://dokploy.com/install.sh
- 云托管版(跳过安装):https://app.dokploy.com
- 社区:Discord https://discord.gg/2tBnJ3jDJc
四、环境要求
官方安装脚本在开头就做了一串前置检查,所以这些要求不是"建议",是硬性的:
| 项目 | 要求 | 脚本中的检查 |
|---|---|---|
| 系统 | Linux(Debian/Ubuntu 系最稳) | uname 非 Linux 直接退出 |
| 权限 | 必须 root | 非 root 直接报错退出 |
| 端口 80 | 必须空闲 | 占用则报错退出 |
| 端口 443 | 必须空闲 | 占用则报错退出 |
| 端口 3000 | 必须空闲 | 占用则报错退出 |
| Docker | 脚本自动装 28.5.0 | 已装则复用 |
| 架构 | x86_64 / arm64 | — |
关于机器规格,官方没有硬性指标,但按实际使用给个参考:
- 最低:1C1G,只跑 Dokploy 本身和两三个小服务
- 推荐:2C4G,能跑十个左右的应用 + 数据库
- 磁盘:40GB 起步,Docker 镜像很吃盘
云厂商的安全组要放行 80、443、3000 三个端口,少一个都装不成或访问不了。
五、部署步骤
第一步:以 root 登录服务器
ssh root@your-server-ip
如果不是 root,先 sudo -i。脚本会检查 id -u,非 0 直接退出。
第二步:确认端口没被占用
ss -tulnp | grep -E ':(80|443|3000) '
有输出说明被占了(常见是系统自带的 nginx 或 apache)。先停掉:
systemctl stop nginx apache2 2>/dev/null
systemctl disable nginx apache2 2>/dev/null
第三步:执行官方安装命令
官方 README 给的就是这一行,直接照抄:
curl -sSL https://dokploy.com/install.sh | bash
如果你在 LXC 容器里(Proxmox 等)或内核不支持 IPVS,加一个环境变量:
curl -sSL https://dokploy.com/install.sh | sudo ENDPOINT_MODE=dnsrr bash
如果服务器有多张网卡、脚本探测不到公网 IP,手动指定:
curl -sSL https://dokploy.com/install.sh | sudo ADVERTISE_ADDR=192.168.1.100 bash
脚本到底做了什么
这一步值得说清楚,因为后面运维全靠它。按脚本实际执行顺序:
- 装 Docker:固定版本
28.5.0,装不上会回退到 Docker 官方源的最新版 - 初始化 Swarm:
docker swarm init --advertise-addr <探测到的IP>。如果之前初始化过,先docker swarm leave --force - 建覆盖网络:
dokploy-network,所有服务都挂在这上面 - 建数据目录:
/etc/dokploy,chmod 777 - 生成两个随机密钥:Postgres 密码和认证密钥,都以 Docker Secret 形式存储(
dokploy_postgres_password、dokploy_auth_secret),不落明文 - 起数据库:
dokploy-postgres服务,镜像postgres:16,数据放dokploy-postgres卷 - 起主服务:
dokploy服务,1 副本,挂载/var/run/docker.sock和/etc/dokploy,端口3000:3000(host 模式) - 起 Traefik:容器
dokploy-traefik,镜像traefik:v3.6.25,占 80/443(含 443/udp 给 HTTP/3),配置文件读/etc/dokploy/traefik/
跑完终端会打印:
Congratulations, Dokploy is installed!
Wait 15 seconds for the server to start
Please go to http://<your-ip>:3000
第四步:创建管理员账号
浏览器打开 http://<服务器IP>:3000,等十几秒让服务起来。首次访问会让你注册第一个账号,这个账号就是管理员。
这一步做完立刻去把 3000 端口关掉,只留 80/443 给 Traefik,控制台不要裸奔在公网。
第五步:绑定域名并开启 HTTPS
在 Dokploy 里给控制台和应用配域名时,DNS 要先解析到这台机器:
A dokploy.your-domain.tld -> 服务器公网IP
A app.your-domain.tld -> 服务器公网IP
Traefik 会自动向 Let's Encrypt 申请证书。前提是 80 端口可以从公网访问(HTTP-01 验证需要)。
六、配置参数详解
Dokploy 的配置分两层:安装期环境变量(脚本读)和运行时配置(Web 界面里改)。
安装期环境变量
这些只在执行 install.sh 时生效:
| 变量 | 取值 | 说明 |
|---|---|---|
DOKPLOY_VERSION |
latest / canary / v0.29.10 |
装哪个版本,不填则自动探测最新稳定版 |
ADVERTISE_ADDR |
IP 地址 | Swarm 广播地址,多网卡或 NAT 环境必须手动指定 |
ENDPOINT_MODE |
dnsrr |
无 IPVS 内核(ZimaOS、Buildroot、部分 LXC)时加上,否则服务发现异常 |
DOCKER_SWARM_INIT_ARGS |
字符串 | 透传给 docker swarm init 的额外参数 |
三种写法:
# 指定版本
curl -sSL https://dokploy.com/install.sh | sudo DOKPLOY_VERSION=v0.29.10 bash
# 指定广播地址
curl -sSL https://dokploy.com/install.sh | sudo ADVERTISE_ADDR=10.0.0.5 bash
# LXC 环境
curl -sSL https://dokploy.com/install.sh | sudo ENDPOINT_MODE=dnsrr bash
运行时关键路径
| 路径 / 对象 | 用途 |
|---|---|
/etc/dokploy |
主数据目录:配置、Traefik 配置、应用元数据 |
/etc/dokploy/traefik/traefik.yml |
Traefik 静态配置 |
/etc/dokploy/traefik/dynamic/ |
Traefik 动态配置(证书、路由中间件自动写入这里) |
/var/run/docker.sock |
Dokploy 靠它操控宿主机 Docker,这是它权限最大的地方 |
Docker Secret dokploy_postgres_password |
内置 Postgres 的密码 |
Docker Secret dokploy_auth_secret |
会话签名密钥 |
Volume dokploy-postgres |
数据库数据 |
Volume dokploy |
映射到容器 /root/.docker |
端口
| 端口 | 谁在用 |
|---|---|
| 3000 | Dokploy 控制台(脚本固定,不建议改) |
| 80 | Traefik,HTTP 与证书验证 |
| 443/tcp | Traefik,HTTPS |
| 443/udp | Traefik,HTTP/3 |
七、启动与运维
Dokploy 由三个组件构成,运维命令要分清对象:
# 主服务(Swarm service)
docker service ls
docker service ps dokploy
docker service logs -f dokploy
# 数据库(Swarm service)
docker service ps dokploy-postgres
# Traefik(普通容器,不是 service)
docker ps --filter name=dokploy-traefik
docker logs -f dokploy-traefik
重启控制台:
docker service update --force dokploy
重启 Traefik:
docker restart dokploy-traefik
备份。Dokploy 自身的数据分两块:
# 1. 平台配置与应用元数据
tar czf dokploy-etc-$(date +%F).tar.gz /etc/dokploy
# 2. 内置 Postgres
docker exec $(docker ps -qf name=dokploy-postgres) \
pg_dump -U dokploy dokploy > dokploy-db-$(date +%F).sql
两块都要备,只备 /etc/dokploy 不够——应用、用户、环境变量都存在 Postgres 里。
八、实操验证
装完之后按这个顺序验证,一步不对就停在那一步排查。
1. Swarm 起来了没
docker info --format '{{.Swarm.LocalNodeState}}'
应该输出 active。inactive 说明 Swarm 初始化失败。
2. 两个 service 是否在跑
docker service ls
预期看到两行,REPLICAS 都是 1/1:
ID NAME MODE REPLICAS IMAGE
xxxx dokploy replicated 1/1 dokploy/dokploy:latest
yyyy dokploy-postgres replicated 1/1 postgres:16
0/1 说明起不来,去看 docker service ps dokploy --no-trunc 的 Error 列。
3. Traefik 是否在跑
docker ps --filter name=dokploy-traefik --format '{{.Status}}'
应该显示 Up X minutes。
4. 控制台端口是否通
curl -I http://127.0.0.1:3000
返回 HTTP/1.1 200 OK 或 302 都算正常(302 是跳登录页)。
5. 从外网访问
浏览器开 http://<公网IP>:3000,能看到注册页就说明整条链路通了。
6. 跑一个真实应用
在控制台里新建 Project → 新建 Application → 选一个 Git 仓库或 Docker 镜像 → 部署。日志里看到构建完成、容器 Running,再点开分配的域名能访问,整个平台就算通了。
九、故障排查
安装脚本报 "something is already running on port 80"
有别的 Web 服务占着端口。按上面第二步停掉 nginx/apache,或者 ss -tulnp | grep ':80 ' 找出进程 kill 掉。
报 "Could not determine server IP address automatically"
多网卡或纯内网环境探测失败。按脚本提示手动指定:
curl -sSL https://dokploy.com/install.sh | sudo ADVERTISE_ADDR=<你的IP> bash
报 "Failed to initialize Docker Swarm"
常见原因:机器之前加入过别的 Swarm 集群。先清理再重装:
docker swarm leave --force
装完访问 3000 一直转圈 / 连接被拒
先确认 service 真的起来了:
docker service ps dokploy --no-trunc
如果 Error 里是 no suitable node,是 Swarm 的节点约束问题(脚本限制了 node.role==manager),检查 docker node ls 里本机是否是 Manager。
如果是云服务器,八成是安全组没放行 3000。
应用部署成功但域名打不开
按顺序查三层:
- DNS 解析对不对:
dig +short app.your-domain.tld是否指到本机 IP - Traefik 有没有收到路由:
docker logs dokploy-traefik | grep your-domain - 证书签下来没:
docker logs dokploy-traefik | grep -i acme
如果日志里有 acme: error: 403,通常是 80 端口被防火墙挡了,Let's Encrypt 的 HTTP-01 验证过不去。
LXC / ZimaOS 里服务之间互相访问不到
典型 IPVS 缺失症状。用 ENDPOINT_MODE=dnsrr 重装:
curl -sSL https://dokploy.com/install.sh | sudo ENDPOINT_MODE=dnsrr bash
磁盘被 Docker 撑满
docker system df
docker system prune -a --volumes
注意 --volumes 会删掉未被使用的数据卷,跑之前确认没有要保留的数据。
十、升级、回滚与卸载
升级
官方脚本自带 update 子命令,本质是 docker pull + docker service update --image:
curl -sSL https://dokploy.com/install.sh | sudo sh -s update
指定版本升级:
curl -sSL https://dokploy.com/install.sh | sudo DOKPLOY_VERSION=v0.29.10 sh -s update
升级前先备份 /etc/dokploy 和 Postgres 数据,跨大版本时数据库迁移不可逆。
回滚
Docker Swarm 保留了上一个版本的镜像,可以直接回退:
# 查看历史
docker service ps dokploy --no-trunc
# 回退到上一个版本
docker service rollback dokploy
如果要回到某个具体版本:
docker service update --image dokploy/dokploy:v0.28.0 dokploy
同时把备份的 /etc/dokploy 和数据库还原回去。
卸载
官方没有提供卸载脚本,下面是按安装产物反推的清理步骤,执行前务必先备份:
# 1. 停掉并删除 Swarm 服务
docker service rm dokploy dokploy-postgres
# 2. 删除 Traefik 容器
docker rm -f dokploy-traefik
# 3. 删除网络与密钥
docker network rm dokploy-network
docker secret rm dokploy_postgres_password dokploy_auth_secret
# 4. 删除数据卷(确认不再需要数据再执行)
docker volume rm dokploy dokploy-postgres
# 5. 删除配置目录
rm -rf /etc/dokploy
# 6. 退出 Swarm
docker swarm leave --force
Dokploy 部署的应用本身是 Swarm service,逐个 docker service ls 查名字再删。如果这台机器以后还要跑 Docker,Docker 本身可以留着。
十一、商用许可
Dokploy 的许可比较特殊,仓库根目录有三份文件:LICENSE.MD、LICENSE_PROPRIETARY.md、TERMS_AND_CONDITIONS.md。
LICENSE.MD 的原文结构是:
/proprietary目录下的内容:适用LICENSE_PROPRIETARY.md定义的专有许可- 其余内容:适用 Apache License 2.0
实操上怎么理解:
- 内部使用完全没问题。自己公司部署一套管内部应用,Apache 2.0 允许,不需要付费
- 可以修改和分发。Apache 2.0 允许商用、允许闭源衍生,只需要保留版权声明和许可证副本,并说明修改过哪些文件
/proprietary目录是例外。那部分代码不能按 Apache 2.0 自由使用,具体限制要看LICENSE_PROPRIETARY.md- 有单独的条款文件。
TERMS_AND_CONDITIONS.md可能涉及云服务或商标使用,做商业产品集成前建议完整读一遍
如果你的用途是「自建一套给团队部署业务系统」,正常用即可;如果是「把 Dokploy 打包进自己的商业产品对外销售」,务必先读 LICENSE_PROPRIETARY.md 和 TERMS_AND_CONDITIONS.md,必要时联系官方确认授权。