已发布 / Published 2026-02-16T00:57:34+08:00

部署两个应用就吃光服务器?Dokploy 部署避坑指南 · 从"在服务器上 build"到"外部 build + 拉镜像"

⚠️ 声明:本文所有信息均整理自公开互联网资源,仅供学习参考。技术方案请结合自身实际情况选用。

🐳 部署两个应用就吃光服务器?

用 GitHub Actions + ghcr.io 外部构建一招搞定

Dokploy 部署避坑指南 · 从"在服务器上 build"到"外部 build + 拉镜像"

关键词拆解 · 完整 SOP Checklist · 可直接照抄

📌 TL;DR(太长不看版):

你在 Dokploy 上部署了两三个应用,发现 CPU 和内存就快拉满了?问题不在你部署了多少个应用,而在你直接在服务器上 build

解决方案:用 GitHub Actions 在 GitHub 的免费服务器上构建 Docker 镜像,推送到 ghcr.io(GitHub 容器注册表),然后让 Dokploy 只做一件事——拉取现成镜像并运行

服务器从此只干"跑服务"的活,不再干"编译代码"的苦力。

✦ ✦ ✦

 问题诊断:为什么部署两个应用就吃光资源?

很多人第一次用 Dokploy 部署应用时会遇到这个经典困境:明明只部署了两三个项目,服务器 CPU 就飙到 70%+ ,内存也快吃满。Monitoring 面板里一片飙红,看得人心跳加速。

第一反应:是不是服务器太小了?要不要升级配置?

❌ 真正原因:你在服务器上 build!

Dokploy 默认的部署方式是:拉取你的源码 → 在服务器上执行 docker build → 生成镜像 → 运行容器。

问题是,构建过程极其吃资源。一个 Next.js 项目 build 一次,轻松吃掉 2GB+ 内存和大量 CPU。如果同时跑两三个项目的构建,小规格 VPS(2核4G/2核8G)直接被按在地上摩擦。

"You're building on this machine, of course the resource consumption is high."

「你在这台机器上 build,当然消耗大。」

而且不少 Dokploy 用户反馈过:服务器负载高的时候,构建会直接失败。你的代码没问题,Dockerfile 没问题,纯粹是服务器"累到罢工"了。

✅ 正确姿势:把构建(build)这个"体力活"甩给外部——用 GitHub Actions 在 GitHub 的服务器上构建镜像,构建完推送到 ghcr.io,Dokploy 只需要拉取现成镜像运行即可。

"A better approach is to use external Docker to build."

「更好的方法是用外部 Docker 来 build。」

✦ ✦ ✦

 三个关键词拆解:到底是什么?

想搞明白这套方案,你需要理解三个核心概念。别急,一个一个来:

🤖 关键词一:GitHub Actions

📋 一句话解释

GitHub Actions 是 GitHub 提供的免费 CI/CD 自动化平台。你写好一个配置文件(YAML 格式),每次代码 push 到仓库,GitHub 就自动帮你执行你定义的一系列任务。

"GitHub Actions automates your build, test, and deployment pipeline."

「GitHub Actions 帮你自动化 构建 → 测试 → 部署 的整个流水线。」

用人话说就是:你往 GitHub 推代码,GitHub 自动帮你干活——编译、打包、测试、部署,全套一条龙服务。而且这个"干活"用的是 GitHub 自己的服务器(叫 runner),不占你的 VPS 资源。

关键点:

1 公开仓库完全免费,私有仓库每月有 2000 分钟免费额度(个人版),足够用

2 Runner 配置是 2核 7GB 内存 14GB SSD,比大多数人的小 VPS 还要强

3 配置文件放在 .github/workflows/ 目录下,一次配好永久生效

📦 关键词二:ghcr.io(GitHub Container Registry)

📋 一句话解释

ghcr.io 是 GitHub 提供的容器镜像仓库(Container Registry)。你可以把构建好的 Docker 镜像存在这里,就像把代码存在 GitHub 一样。

你可以把它理解成一个"Docker 镜像的网盘"

✦ Docker Hub(docker.io)= Docker 官方的"镜像网盘"

✦ ghcr.io = GitHub 自家的"镜像网盘",和你的代码仓库天然绑定

镜像地址长这样:

ghcr.io/你的GitHub用户名/你的仓库名:标签

比如:ghcr.io/zhangsan/my-saas-app:latest

⚠️ 为什么选 ghcr.io 而不是 Docker Hub?

因为你的代码就在 GitHub 上,用 GitHub Actions 构建后直接推到 ghcr.io,全程一体化无缝衔接,认证用的就是 GitHub 自带的 GITHUB_TOKEN,不用额外注册账号、不用额外配密钥。

🚀 关键词三:Dokploy Docker 部署方式

📋 一句话解释

Dokploy 是一个开源自托管 PaaS 平台(Platform as a Service),可以装在你自己的 VPS 上,替代 Vercel / Netlify / Heroku 来部署项目。它基于 Docker + Traefik 构建,提供可视化界面管理你的应用。

Dokploy 支持两种部署模式:

❌ 模式 A:Git 源码构建(默认,不推荐)

Dokploy 拉取你的源码 → 在服务器上执行 docker build → 生成镜像 → 运行

问题:构建过程吃 CPU 和内存,小服务器扛不住

✅ 模式 B:Docker 镜像部署(推荐!)

GitHub Actions 在外部构建好镜像 → 推送到 ghcr.io → Dokploy 只拉取现成镜像 → 直接运行

优势:服务器只干"跑服务"的活,资源消耗大幅降低

"This approach uses GitHub Actions to build Docker images. After the build completes, Dokploy directly pulls the image and starts it, significantly reducing server load."

「这种方式使用 GitHub Actions 构建 Docker 镜像。构建完成后,Dokploy 直接拉取镜像并启动,大幅降低服务器负载。」

✦ ✦ ✦

 整体流程:代码从推送到上线

理解了三个关键词,现在看整个流水线是怎么串起来的:

Step 1 ✍️ 推代码
你把代码 push 到 GitHub 仓库的 main 分支

Step 2 🤖 触发 Actions
GitHub 检测到 push 事件,自动触发你定义的 workflow

Step 3 🔨 外部构建
在 GitHub 的 runner(2核7G免费服务器)上执行 docker build,你的 VPS 完全不参与

Step 4 📦 推送镜像
构建完成的镜像被推送到 ghcr.io(GitHub 容器注册表)

Step 5 🔔 触发部署
通过 Webhook 或手动触发,通知 Dokploy:有新镜像了!

Step 6 🚀 拉取运行
Dokploy 从 ghcr.io 拉取镜像(只下载,不需要 build),直接启动容器

用一句话总结:

"Build on GitHub's servers (free), store in ghcr.io, pull and run on your VPS."

「在 GitHub 的服务器上构建(免费),存到 ghcr.io,在你的 VPS 上拉取运行。」

💡 类比理解

想象你开了一家餐厅(VPS)。模式 A 是"在餐厅后厨自己杀鱼、磨面粉、烤面包"——后厨忙到炸。模式 B 是"让中央厨房(GitHub Actions)把半成品做好,送到你的餐厅(ghcr.io → Dokploy)"——你只需要装盘上菜。

✦ ✦ ✦

 手把手配置:照着做就行

初始配置只需要一次,以后永久生效

阶段 A:创建 GitHub Personal Access Token

这个 Token 让 Dokploy 有权限从 ghcr.io 拉取你的私有镜像。

1 打开 GitHub → Settings → Developer Settings → Personal Access Tokens → Tokens (classic)

2 点击 Generate new token (classic)

3 勾选以下权限:

repo — 访问仓库

workflow — 访问 GitHub Actions

write:packages — 上传镜像包

delete:packages — 删除旧镜像包(可选)

⚠️ 重要:生成后的 Token 只会显示一次,立即复制保存到密码管理器,丢了只能重新生成。

阶段 B:在 Dokploy 中配置 Registry

1 进入 Dokploy 后台 → Registry 页面 → 添加 Registry

2 填写:Registry URL = ghcr.io

3 Username = 你的 GitHub 用户名

4 Password = 刚才生成的 Personal Access Token

5 点 Test 测试连接 → 点 Create 保存

阶段 C:配置 Dokploy 应用为 Docker 模式

1 创建 Service → General → Provider 选择 Docker(不是 Git!)

2 Docker Image 填:ghcr.io/用户名/仓库名:分支名

3 Advanced → Cluster Settings → 选择刚才创建的 ghcr.io Registry

4 Deployments → 复制 Webhook URL(后面要用)

阶段 D:创建 GitHub Actions 配置文件

在项目根目录创建 .github/workflows/docker-image.yml 文件,核心内容:

name: Build and Push Docker Image
on:
  push:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
    - Checkout 代码
    - Login to ghcr.io
    - Build Docker image
    - Push to ghcr.io
    - Trigger Dokploy webhook

阶段 E:配置 Webhook 自动触发

1 到 GitHub 仓库 → Settings → Webhooks → Add webhook

2 Payload URL = 从 Dokploy 复制的 Webhook URL

3 选择触发事件:仅勾选 Registry packages

4 确认 Active → 保存

✅ 搞定!以后每次 push 代码到 main 分支,GitHub Actions 自动构建 → 推送 ghcr.io → Webhook 通知 Dokploy → 自动拉新镜像部署。全程自动化,服务器零构建负担。

✦ ✦ ✦

 别忘了:环境变量怎么处理?

一个很多人踩的坑:用 GitHub Actions 构建时,.env 文件通常不会上传到 GitHub(也不应该上传),那构建时怎么拿到环境变量?

📋 两种环境变量的处理方式

🔒 需要加密的(API Key、数据库密码等):放到 GitHub Repo → Settings → Secrets and variables → Actions → Secrets

🔓 不需要加密的(NEXT_PUBLIC_ 开头的公开变量等):放到 → Variables

🏃 运行时变量(不参与构建,只在容器跑起来后需要的):在 Dokploy 的 Environment 里配置

✦ ✦ ✦

 进阶技巧:让你的部署更丝滑

🧹 技巧一:定期清理旧镜像

每次构建都会产生新镜像,旧镜像堆积会吃磁盘空间。建议在 Dokploy 的 Web Server 模块中打开每日自动清除废弃镜像功能。ghcr.io 免费账号也有存储限制,记得定期清理。

📏 技巧二:Docker 多阶段构建瘦身

在 Dockerfile 里用多阶段构建(Multi-stage build),把编译依赖和运行依赖分开。最终镜像只包含运行所需的文件,体积可以从 1GB+ 缩到 200MB 以下,拉取速度大幅提升。

🏷️ 技巧三:用版本标签代替 latest

别只打 latest 标签。用 v1.0.3 或 sha-abc1234 这样的版本标签,方便回滚和追踪。

🔄 技巧四:手动触发重新构建

如果代码没变但想重新部署,可以在 GitHub Actions 页面手动触发 workflow(在 YAML 里加上 workflow_dispatch 触发器即可)。

"Initial configuration only needs to be set up once and can be used permanently."

「初始配置只需要设置一次,就可以永久使用。」

✦ ✦ ✦

 SOP Checklist:一步步照着勾

Ship(交付)前的完整检查清单,每一项都告诉你"是什么意思"和"怎么弄"

📋 Part 1:准备工作 Checklist

☐ 项目有 Dockerfile → 意思是你的项目根目录要有一个 Dockerfile 文件,定义怎么打包成镜像。没有的话需要先写一个

☐ 代码已推到 GitHub → 你的项目源码在 GitHub 仓库里,不是 GitLab 或本地。(GitLab 有自己的 CI/CD,流程类似但工具不同)

☐ 有一台 VPS 且已装好 Dokploy → Dokploy 安装很简单,一行命令搞定(官方文档有)

☐ 域名已做好 DNS 解析 → A 记录指向你的 VPS IP(用 CloudFlare 的话 SSL 选"完全")

🔑 Part 2:GitHub 端配置 Checklist

☐ 创建 Personal Access Token (Classic) → 去 GitHub Settings → Developer Settings 创建,勾选 repo / workflow / write:packages 权限

☐ Token 已安全保存 → 复制到密码管理器或安全笔记,只显示一次!

☐ 创建 .github/workflows/docker-image.yml → 这是 GitHub Actions 的工作流配置文件,定义构建和推送的全部步骤

☐ 环境变量已配置到 Secrets/Variables → 加密的放 Secrets,公开的放 Variables,别把 .env 直接上传仓库

☐ Webhook 已配置 → 仓库 Settings → Webhooks → 添加 Dokploy 的 Webhook URL,事件选 Registry packages

🐳 Part 3:Dokploy 端配置 Checklist

☐ 添加 ghcr.io Registry → Dokploy 后台 → Registry → 填入 ghcr.io + GitHub 用户名 + Token 密码 → Test 通过 → Save

☐ 创建 Service,Provider 选 Docker → 意思是告诉 Dokploy "我不需要你帮我 build,我给你现成镜像"

☐ Docker Image 地址填写正确 → 格式:ghcr.io/用户名/仓库名:标签

☐ Cluster Settings 关联 Registry → Advanced → 选择刚添加的 ghcr.io registry

☐ 运行时环境变量已配置 → Dokploy 的 Environment 里填入运行时需要的变量

☐ 域名已配置 → Domains → 添加域名 → 打开 HTTPS → 选 Let's Encrypt

✅ Part 4:验证 Checklist

☐ 推一次代码,验证 Actions 自动触发 → 去 GitHub 仓库的 Actions 标签页,看 workflow 是否正常执行

☐ 确认镜像已推送到 ghcr.io → 去 GitHub → Packages 标签页,看是否有你的镜像

☐ Dokploy 自动拉取并部署成功 → Dokploy 后台 → Deployments 看日志是否成功

☐ 通过域名正常访问 → 浏览器打开你的域名,页面正常显示

☐ 检查 Monitoring 面板 → CPU 和内存消耗应该大幅下降,因为不再有 build 过程

🔧 Part 5:日常维护 Checklist

☐ 开启 Dokploy 每日自动清除废弃镜像 → Web Server 模块里的设置,防止磁盘被旧镜像塞满

☐ 定期检查 GitHub Actions 分钟数 → 私有仓库免费 2000 分钟/月,超了会收费

☐ 定期轮换 Personal Access Token → 安全起见,建议设 90 天过期并提前更新

☐ 关注 ghcr.io 存储用量 → 免费账号有容量限制,定期清理旧版本镜像

✦ ✦ ✦

 一句话总结

问题:在 Dokploy 上直接 build,服务器资源拉满甚至构建失败。

方案:GitHub Actions 外部构建 → 推到 ghcr.io → Dokploy 只拉镜像运行。

效果:服务器资源消耗大幅下降,部署更稳定,支持更多项目。

成本:公开仓库完全免费,私有仓库每月 2000 分钟免费额度。

"After understanding the principles, you can let AI help you write the entire configuration."

「在明白原理以后,你可以让 AI 帮你写出完整的配置。」

没错,理解了 GitHub Actions + ghcr.io + Dokploy Docker 模式这三个核心概念和它们之间的关系后,你完全可以把具体的 YAML 配置文件交给 AI 来生成。关键不是会写代码,而是理解整套流程的原理

🎯 你用 Dokploy 部署了几个项目?

用了外部构建之后服务器资源下来了吗?评论区聊聊你的部署方案 👇

📚 参考来源:

1. Dokploy 官方文档 - Docker Registry 配置

2. Dokploy 官方文档 - GHCR 集成指南

3. 知乎 - 自部署Dokploy和Vercel、Zeabur项目迁移手册

4. Medium - Deploying Next.js Projects with Dokploy

5. DEV Community - How to Automate Your Docker Workflow

6. GitHub Marketplace - Dokploy Deployment Suite

7. NEXTY.DEV - Deploy to Dokploy 完整指南

8. jabed.dev - Automating self-hosted deployments

参考原文信息列表:

1. https://docs.dokploy.com/docs/core/Docker

2. https://docs.dokploy.com/docs/core/registry/ghcr

3. https://zhuanlan.zhihu.com/p/26882068371

4. https://medium.com/@weijunext/deploying-next-js-projects-with-dokploy-a0ecc386da3c

5. https://dev.to/coder7475/how-to-automate-your-docker-workflow-publish-images-to-github-container-registry-3jei

6. https://github.com/marketplace/actions/dokploy-deployment-suite

7. https://docs.nexty.dev/docs/start-project/dokploy

8. https://www.jabed.dev/posts/automating-self-hosted-deployments

9. https://blog.csdn.net/BigYe_ChengPu/article/details/145910988

10. https://blog.einverne.info/post/2024/07/dokploy-paas.html

11. https://github.com/ruanyf/weekly/issues/6005

12. https://medium.com/@DynamoDevOps/complete-guide-ci-cd-with-github-actions-and-docker-deploy-to-ghcr-with-ssh-authentication-75fcce3e87a2

— END —