Mekesim Docs
Web

基于 Dokploy 与 GitHub Actions 的 Next.js 极致部署实战

2核2G服务器的救星

前言

说实话,在预算有限的情况下(比如初创项目常用的 2核2G 轻量服务器),部署一个 Next.js 应用简直是场“噩梦”。你可能遇到过在服务器上直接 npm run build 导致内存溢出(OOM)瞬间死机,或者构建一次要等半个世纪。

今天分享一套我亲测好用的“生产级”部署方案:利用 GitHub Actions 在云端免费构建,配合 Dokploy 进行自动化运维。这套方案不仅能让你的小服务器跑得稳,还能实现“代码一推,秒级上线”的丝滑体验。

一、 方案亮点:为什么选它?

  1. 构建与运行分离​:最吃内存的 Docker Build 任务丢给 GitHub Actions 的服务器,咱们的小服务器只负责跑成品。
  2. Next.js 运行瘦身​:通过 standalone 模式,仅打包运行必需的依赖,内存占用瞬间缩减。
  3. 全链路自动化​:推送到 main 分支即刻触发部署,通过 Webhook 自动通知服务器拉取镜像。
  4. 专业网络架构​:内置 SSL 自动续签、www 域名自动重定向,SEO 和安全两手抓。

二、 准备工作

1. 域名解析 (DNS) 设置

在你的域名商(如阿里云、Cloudflare)后台,先给 www.seeyouart.com 把路铺好,配置两条 A 记录:

记录类型主机记录记录值说明
Awww你的服务器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) | sh

2. 获取 GitHub “通行证” (Personal Access Token)

由于镜像托管在 GitHub 的私有仓库(GHCR),Dokploy 需要权限才能搬运:

  1. 登录 GitHub,进入 Settings -> Developer settings -> ​**Tokens (classic)**​。
  2. 点击 ​**Generate new token (classic)**​,勾选 repowrite:packagesread:packages
  3. 重要: 复制生成的 Token,它只会出现这一次,找个安全的地方存好。

3. 在 Dokploy 中配置镜像库

  1. 登录 Dokploy 面板,进入 Settings -> ​Registries​。
  2. 点击 ​Add Registry​:
    • Name​: GitHub
    • Registry URL​: ghcr.io
    • Username​: 你的 GitHub 用户名
    • Password​: 刚才生成的 Token

4. 应用创建

  1. 新建一个 ​Application​。
  2. General 设置​:
    • Docker Image​: ghcr.io/你的用户名/你的仓库名
    • Registry URL​: ghcr.io
    • Autodeploy​: 开启。
  3. 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

  1. 在 Dokploy 应用的 General 页面底部复制 Deploy Webhook 链接。
  2. 回到 GitHub 仓库 -> Settings -> Secrets and variables -> ​Actions​。
  3. 新建 Secret:名称为 DOKPLOY_WEBHOOK_URL,值为刚才复制的链接。

五、 总结与上线

  1. 提交代码​:执行 git push origin main
  2. 监控进度​:在 GitHub Actions 页面看着进度条跑完。
  3. 自动发布​:Dokploy 收到信号后会自动更新容器,你可以在日志里看到 Pulling image completed

这套方案完美解决了小内存服务器构建难的痛点。通过“云端打包 + 边缘触发”,你可以把 2G 内存的所有空间都留给用户访问,而不是白白消耗在构建过程中。

博主碎碎念​:建议开启 Dokploy 的 ​Health Check​。这样新版本跑稳了才切换流量,真正做到零停机更新!