Web
基于 Dokploy 与 GitHub Actions 的 Next.js 极致部署实战
2核2G服务器的救星
前言
说实话,在预算有限的情况下(比如初创项目常用的 2核2G 轻量服务器),部署一个 Next.js 应用简直是场“噩梦”。你可能遇到过在服务器上直接 npm run build 导致内存溢出(OOM)瞬间死机,或者构建一次要等半个世纪。
今天分享一套我亲测好用的“生产级”部署方案:利用 GitHub Actions 在云端免费构建,配合 Dokploy 进行自动化运维。这套方案不仅能让你的小服务器跑得稳,还能实现“代码一推,秒级上线”的丝滑体验。
一、 方案亮点:为什么选它?
- 构建与运行分离:最吃内存的 Docker Build 任务丢给 GitHub Actions 的服务器,咱们的小服务器只负责跑成品。
- Next.js 运行瘦身:通过
standalone模式,仅打包运行必需的依赖,内存占用瞬间缩减。 - 全链路自动化:推送到
main分支即刻触发部署,通过 Webhook 自动通知服务器拉取镜像。 - 专业网络架构:内置 SSL 自动续签、
www域名自动重定向,SEO 和安全两手抓。
二、 准备工作
1. 域名解析 (DNS) 设置
在你的域名商(如阿里云、Cloudflare)后台,先给 www.seeyouart.com 把路铺好,配置两条 A 记录:
| 记录类型 | 主机记录 | 记录值 | 说明 |
|---|---|---|---|
| A | www | 你的服务器IP | 主访问地址(www.seeyouart.com) |
| A | @ | 你的服务器IP | 确保不带 www 的根域名也能自动跳转 |
2. 性能插件安装
在本地项目根目录运行,别问,就是为了快:
npm install sharp说明:安装 sharp 后,Next.js 会自动调用它处理图片。在 2G 内存的服务器上,这能显著降低 CPU 的“焦虑”。
三、 Dokploy 环境搭建
1. 基础安装
在服务器 SSH 终端运行官方一键脚本,然后去喝杯咖啡:
curl -sSL [https://dokploy.com/install.sh](https://dokploy.com/install.sh) | sh2. 获取 GitHub “通行证” (Personal Access Token)
由于镜像托管在 GitHub 的私有仓库(GHCR),Dokploy 需要权限才能搬运:
- 登录 GitHub,进入 Settings -> Developer settings -> **Tokens (classic)**。
- 点击 **Generate new token (classic)**,勾选
repo、write:packages、read:packages。 - 重要: 复制生成的 Token,它只会出现这一次,找个安全的地方存好。
3. 在 Dokploy 中配置镜像库
- 登录 Dokploy 面板,进入 Settings -> Registries。
- 点击 Add Registry:
- Name:
GitHub - Registry URL:
ghcr.io - Username: 你的 GitHub 用户名
- Password: 刚才生成的 Token
- Name:
4. 应用创建
- 新建一个 Application。
- General 设置:
- Docker Image:
ghcr.io/你的用户名/你的仓库名 - Registry URL:
ghcr.io - Autodeploy: 开启。
- Docker Image:
- Domains 设置:
- 添加
www.seeyouart.com,端口3000,开启 HTTPS 与 Letsencrypt。 - 添加
seeyouart.com,在编辑页面的 Redirects 中选择 Redirect to www。
- 添加
四、 自动化流水线配置
1. 多阶段构建:Dockerfile
在项目根目录下创建 Dockerfile,这是镜像“瘦身”的关键:
# 1. 依赖安装阶段
FROM node:20-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f package-lock.json ]; then npm ci; \
elif [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
else npm install; \
fi
# 2. 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED 1
RUN npm run build
# 3. 运行阶段
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# 仅拷贝运行必需文件,极大减小镜像体积
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
CMD ["node", "server.js"]2. 云端部署:deploy.yml
在 .github/workflows/ 下创建 deploy.yml,它是你的专属“搬运工”:
name: Deploy seeyouart.com
on:
push:
branches: ["main"]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
# 通知 Dokploy 拉取新镜像并重启容器
- name: Trigger Webhook
run: |
curl -X POST "${{ secrets.DOKPLOY_WEBHOOK_URL }}"3. 配置 GitHub Secrets
- 在 Dokploy 应用的 General 页面底部复制 Deploy Webhook 链接。
- 回到 GitHub 仓库 -> Settings -> Secrets and variables -> Actions。
- 新建 Secret:名称为
DOKPLOY_WEBHOOK_URL,值为刚才复制的链接。
五、 总结与上线
- 提交代码:执行
git push origin main。 - 监控进度:在 GitHub Actions 页面看着进度条跑完。
- 自动发布:Dokploy 收到信号后会自动更新容器,你可以在日志里看到
Pulling image completed。
这套方案完美解决了小内存服务器构建难的痛点。通过“云端打包 + 边缘触发”,你可以把 2G 内存的所有空间都留给用户访问,而不是白白消耗在构建过程中。
博主碎碎念:建议开启 Dokploy 的 Health Check。这样新版本跑稳了才切换流量,真正做到零停机更新!