Dokploy 的极简教程

本文介绍如何在个人服务器上安装、配置和使用 dokploy,实现 Github 项目利用 Github Actions 自动编译构建镜像、Dokploy 自动拉取镜像部署上线。

|

Dokploy 的极简教程

Dokploy 是开源的应用部署解决方案,可以简单将它理解为是一个可以在自己服务器上部署运行的 Vercel/Netlify。如果你希望享受到 Vercel/Netlify 上轻松部署项目的便利性,又不想收到天价的 Vercel 账单的话,那么可以考虑购买一台服务器,然后部署 Dokploy 试试看。

本文主要介绍如何在个人服务器上安装、配置和使用 dokploy,实现 Github 项目利用 Github Actions 自动编译构建镜像、Dokploy 自动拉取镜像部署上线,并支持绑定域名、配置 https 证书,最终可以安全访问等流程。

1、什么是 Dokploy?

官网:https://dokploy.com/

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://:3000·,就可以看到 Dokploy 的管理员注册界面。

|

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