Loading...

文章背景图

Dokploy:开源自托管 PaaS|一条命令把 VPS 变成 Vercel

2026-11-02
1
- 字
- 分钟
|

一台 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 跑起十几个服务、改完代码自动上线,它的复杂度刚刚好。

三、官方链接

四、环境要求

官方安装脚本在开头就做了一串前置检查,所以这些要求不是"建议",是硬性的:

项目 要求 脚本中的检查
系统 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

脚本到底做了什么

这一步值得说清楚,因为后面运维全靠它。按脚本实际执行顺序:

  1. 装 Docker:固定版本 28.5.0,装不上会回退到 Docker 官方源的最新版
  2. 初始化 Swarm:docker swarm init --advertise-addr <探测到的IP>。如果之前初始化过,先 docker swarm leave --force
  3. 建覆盖网络:dokploy-network,所有服务都挂在这上面
  4. 建数据目录:/etc/dokploy,chmod 777
  5. 生成两个随机密钥:Postgres 密码和认证密钥,都以 Docker Secret 形式存储(dokploy_postgres_password、dokploy_auth_secret),不落明文
  6. 起数据库:dokploy-postgres 服务,镜像 postgres:16,数据放 dokploy-postgres 卷
  7. 起主服务:dokploy 服务,1 副本,挂载 /var/run/docker.sock 和 /etc/dokploy,端口 3000:3000(host 模式)
  8. 起 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。

应用部署成功但域名打不开

按顺序查三层:

  1. DNS 解析对不对:dig +short app.your-domain.tld 是否指到本机 IP
  2. Traefik 有没有收到路由:docker logs dokploy-traefik | grep your-domain
  3. 证书签下来没: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,必要时联系官方确认授权。

评论交流

文章目录