Dokploy 的极简教程
本文介绍如何在个人服务器上安装、配置和使用 dokploy,实现 Github 项目利用 Github Actions 自动编译构建镜像、Dokploy 自动拉取镜像部署上线。
Dokploy 的极简教程
Dokploy 是开源的应用部署解决方案,可以简单将它理解为是一个可以在自己服务器上部署运行的 Vercel/Netlify。如果你希望享受到 Vercel/Netlify 上轻松部署项目的便利性,又不想收到天价的 Vercel 账单的话,那么可以考虑购买一台服务器,然后部署 Dokploy 试试看。
本文主要介绍如何在个人服务器上安装、配置和使用 dokploy,实现 Github 项目利用 Github Actions 自动编译构建镜像、Dokploy 自动拉取镜像部署上线,并支持绑定域名、配置 https 证书,最终可以安全访问等流程。
1、什么是 Dokploy?
Dokploy 可以让你实现像 Vercel 一样简单高效地管理你的应用和数据,并且还可以监控你服务器的状态、备份数据库、管理证书、管理多个服务器等等。
dokploy website
2、安装 Dokploy
安装参考文档:https://docs.dokploy.com/docs/core/installation
2.1 服务器配置
服务器的操作系统建议选择 Ubuntu 22.04,环境配置确保已安装 Docker。
本文以腾讯云轻量云服务器为例,配置是 2 核+4G 内存,服务器位置是在新加坡,这样拉取 Docker 镜像就不容易出现问题,或者你可以直接选择国外的服务器提供商,例如 Hostinger,费用也很便宜,2 核 8G 服务器 1 个月 7 美刀,4 核 8G 服务器 1 个月 10 美刀,比腾讯云服务器要便宜很多,有兴趣的朋友可以点击下面链接买台试试。
2.2 安装 Dokploy
登录机器,执行命令:
curl -sSL https://dokploy.com/install.sh | sh
script to install dokploy
命令执行成功之后,就可以看到访问 Dokploy 的链接,默认端口是 3000
install dokploy
2.3 配置防火墙
在服务器的防火墙配置中新增一条规则,允许 3000 端口可以被外界访问。
访问 `http://
dokploy setup the server
2.4 绑定域名
每次通过 http 协议+服务器 IP 地址访问 Dokploy 不安全,所以先绑定一个域名。
图片中设置的是个子域名,你也可以设置主域,设置完成后,在域名的 DNS 解析中添加一条记录,类型是 A,将配置的域名指向服务器的 IP 地址。
dns record
DNS 解析配置后,我们就可以通过 https+域名的方式来访问服务器上的 Dokploy。
visit dokploy with https://domain
3、配置 Dokploy
我们的目的是希望,每次 push 代码到 Github 仓库中,Dokploy 会像 Vercel 一样,自动拉取最新的代码,重新编译,然后部署上线,那就要做些配置。
3.1 配置 Github 应用
点击左侧菜单Git,选择Github,依次操作,完成Github应用的创建和配置,完成之后你可以在 https://github.com/settings/apps 中查看这个 Github 应用。
setup github
create github app
等 Github 应用创建完成之后,可以点击这个应用,进行 Github 授权,这样的话 Dokploy 就可以访问你的 Github 账号下的代码仓库。
config git providers
authorize the Github app
3.2 部署 Nextjs 应用
我新建了一个默认的Nextjs工程,配置output为standalone,并在根目录下放了一个Dockfile文件(文件的写法可以参考这个提交记录),我们希望 Dokploy 根据 Dockfile 文件就可以构建出镜像,然后部署上线。
GitHub - javayhu/dokploy-demo at javayhu.com
在 Dokploy 的 Projects 中,新建 Project,再新建 Application,配置 Provider 为 Github,选择项目仓库和分支,构建类型选择 Dockerfile,并设置 Dockerfile 文件的路径。配置好之后,点击 Deploy 触发构建。
deploy settings for github repository
deploy settings for build type
首次构建失败了,可以查下编译日志,原因是 pnpm-lock.yaml 文件缺失。
build fail logs
新增pnpm-lock.yaml文件(提交记录)后,Dokploy 会触发自动构建,这次构建成功。
deployments
3.3 绑定域名
构建成功之后,我们就可以绑定域名,然后通过域名访问这个应用。在 Application 的 Domain 中,点击 Add Domain,如果你有自己的域名,那么输入一个域名,如果没有域名可以点击右侧的骰子,它会自动生成一个 xxx.traefik.me 的域名。
bind domain
这里我设置的是一个自定义子域名,然后在 DNS 解析中配置子域名指向服务器 IP。
add dns record
等待一段时间之后,就可以通过 https+域名访问这个 Nextjs 应用。
visit nextjs app by https://domain
3.4 利用 Github Actions 构建镜像
前面的流程是直接在服务器上构建并部署,这样的操作一般情况下没啥问题,但在服务器高负载时,网站性能可能受到影响,所以我们可以考虑利用 Github Actions 来构建镜像,镜像托管在 Github 镜像注册中心,服务器上的 Dokploy 只负责从 Github 容器镜像中心拉取最新镜像,然后部署上线就行。
3.4.1 创建 Github Token
首先要创建一个Github Token,这个Token需要有权限拉取你上传到Github镜像注册中心的镜像,你可以在这里创建一个 Token。
personal access token
3.4.2 配置 Registry
在Dokploy的Docker Registry配置中,新建一个外部Registry,Username是你的Github账号名,Password是上面创建的Token,URL是 https://ghcr.io 。
add external registry
3.4.3 重新配置部署方式
为了演示,这里我新建一个 Application,这次我们换成 Docker 的部署方式。首先在应用的高级设置中,设置 Registry 是我们刚才创建的 Registry。
cluster settings
然后,配置部署参数,Docker Image 是 ghcr.io/[Github 账号名]/[Repository 项目名]:[分支名],然后保存。意思是,部署时,Dokploy 去 Registry 中找到这个 Docker 镜像,把最新镜像拉取下来并部署上线。
deploy settings
3.4.4 配置 Github Actions
上面的流程只配置了如何拉取镜像,现在还剩下如何利用 Github Actions 构建镜像。这需要在 Github Actions 中新增一个 workflow,当我们提交代码到 main 分支的时候,workflow 会自动执行,构建镜像并 push 到 Github 镜像中心。
workflow的代码可以参考这个提交记录,需要注意的是结尾有个触发 Dokploy 重新部署的逻辑,这里涉及到 Deployment Webhook URL,Dokploy 上部署的项目都有一个 Deployment Webhook URL,只要访问这个 URL 就会自动触发重新构建。
deployment webhook url
3.4.5 测试访问
待部署成功之后,我们同样可以绑定域名,配置 DNS 解析,然后就可以通过 https+域名进行安全地访问了。
deployment success
visit by https://domain
4、Dokploy 其他功能
Dokploy 的功能还有很多,一篇文章很难讲完,下面列举几个我觉得不错的功能。
4.1 自动清理 Docker 容器
如果你长期使用服务器既构建又部署,很容易导致太多没用的 Docker 容器占用磁盘空间,导致磁盘空间满了而访问不了,可以在 Server 设置中开启 Daily Docker Cleanup,就会每天自动清理不用的 Docker 容器。
daily docker cleanup
4.2 服务器监控
Dokploy 还自带了服务器监控的能力,你可以直接查看服务器的 CPU 利用率、内存利用率、磁盘空间,以及网络 IO 等。
dokploy monitoring
4.3 数据库部署和备份
Dokploy 也可以部署数据库,常见的数据库 Postgres、MySQL、MongoDB 都支持,部署之后,设置了外网访问端口就可以访问了。
select a database
在 External Port 中设置一个端口号,然后保存就可以得到一个 DB URL,只要防火墙配置中允许访问服务器的这个端口号,那么就可以连接数据库了。
external host
下面用免费的 Navicat Premium Lite 配置好数据库连接信息测试连接没问题。
navicat premium lite
Dokploy 还支持备份数据库,可以在 S3 Destinations 中配置 AWS S3 或者 Cloudflare R2,然后将它作为目标备份点添加到这里,最后在 Database 的备份配置中选择这个备份点就可以实现数据库备份了。
4.4 模板
我最喜欢的就是模板功能,很多优秀的开源项目都可以一键部署,例如我现在的个人博客 Ghost、统计分析工具 Plausible 都是通过 Dokploy 一键部署的。你甚至可以一键部署 Supabase、Wordpress、Pocketbase 等项目,希望将来支持的应用越来越多。
除此之外,Dokploy 还支持管理其他的服务器,支持管理证书等等,有些功能我也还没有用上,等将来用上了再来分享。
5、其他
Custom Dokploy installation to free up port 80 and 443
Dokploy 在创建时, traefik 默认会占用 80/443 端口, 只需要修改安装时的脚本, 让 traefik 的容器,不占用 80/443 即可
但是由于 traefik 的创建是 Dokploy 动态生成的 Docker 脚本。
所以需要修改 Dokploy 的启动脚本, 参考如下
# Installation
docker service create \
--name dokploy \
--replicas 1 \
--network dokploy-network \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
--mount type=bind,source=/etc/dokploy,target=/etc/dokploy \
--mount type=volume,source=dokploy-docker-config,target=/root/.docker \
--publish published=3000,target=3000,mode=host \
--update-parallelism 1 \
--update-order stop-first \
--constraint 'node.role == manager' \
-e ADVERTISE_ADDR=$advertise_addr \
# Custom traefik port to free up port 80 and 443
-e TRAEFIK_SSL_PORT=444 \
-e TRAEFIK_PORT=81 \
dokploy/dokploy:latest