Vercel

for yourself

Vercel访问慢?自己搭建一个

2025-4-30·话题深潜

1.起因

前几天,我联系到了一位开发者,我非常喜欢他之前博客的一套主题,但是可惜当时并没有开源。

现在他把主题的源码Public到了GitHub,我就立马开始部署博客,想着把现在的博客换了

Taco是一个使用Next.js编写的项目,我是用的1Plane面板提供了非常方便的nodejs(docker)部署环境

可是非常不幸的是,我每次对源代码进行修改,就要重新打包成zip,然后上传到服务器,解压,覆盖,重新编译,运行,非常麻烦!!!

后来,作者推荐我使用Vercel这样的边缘计算平台,我也试了一下,挺不错的,只是在国内访问不稳定。后来折腾了半天,想着自己有两台服务器,没有必要再多花钱去购买边缘计算服务,于是我准备自己手搓一套自己的“Devops”

2.准备工作

因为我的代码在GitHub,所以我决定使用Github Actions,那么让我们开始手搓workflow文件

让我们模拟一下Vercle的逻辑:仓库更新->触发Vercle->开始重新build;

让我们把这套逻辑改写成workflow:

  • 当仓库更新,触发action
  • 连接服务器
  • cd 到 项目目录
  • 使用git 更新文件
  • 进入nodejs的docker容器内部
  • build项目
  • 重启容器

3.配置

这里我们提供两套workflow文件:

1.连接服务器使用SSH密钥:

# workflow:
name: Server Update
on:
push:
branches:
  - main

jobs:
 deploy:
runs-on: self-hosted
steps:

  - name: Deploy using direct SSH with key
    run: |
    
      # 创建SSH目录(如果不存在)
      mkdir -p ~/.ssh

      # 将私钥保存到临时文件
      echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa_deploy
      chmod 600 ~/.ssh/id_rsa_deploy
      
      # 添加服务器到known_hosts以避免提示
      ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
      
      # 执行SSH命令
      ssh -i ~/.ssh/id_rsa_deploy \
          -o StrictHostKeyChecking=accept-new \
          ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} \
          -p ${{ secrets.SERVER_PORT }} \
          '
          echo "🚀 正在进入项目目录..."
          cd /opt/node/Taco || { echo "❌ 项目目录不存在,请检查路径"; exit 1; }
          
          echo "🔄 正在拉取最新代码..."
          git fetch origin main && git reset --hard origin/main
          
          echo "📦 正在进入 Docker 容器 [Taco] 并构建项目..."
          docker exec Taco sh -c "npm run build"
          
          echo "🔁 正在重启容器 [Taco]..."
          docker restart Taco
          
          echo "✅ 部署完成"
          '
      
      # 清理临时密钥文件
      rm -f ~/.ssh/id_rsa_deploy`

1.连接密码认证(需要安装sshpass):

# workflow:
name: Server Update

on:
 push:
branches:
  - main

jobs:
  deploy:
runs-on: self-hosted
steps:
  - name: Install sshpass if needed
    run: |
      if ! command -v sshpass &> /dev/null; then
        echo "sshpass not found, installing..."
        sudo apt-get update && sudo apt-get install -y sshpass
          	   fi

  - name: Deploy using direct SSH with password
    run: |
      # 使用sshpass进行密码认证
      sshpass -p "${{ secrets.SERVER_PASSWORD }}" \
      ssh -o StrictHostKeyChecking=no \
          ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} \
          -p ${{ secrets.SERVER_PORT }} \
          '
          echo "🚀 正在进入项目目录..."
          cd /opt/node/Taco || { echo "❌ 项目目录不存在,请检查路径"; exit 1; }
          
          echo "🔄 正在拉取最新代码..."
          git fetch origin main && git reset --hard origin/main
          
          echo "📦 正在进入 Docker 容器 [Taco] 并构建项目..."
          docker exec Taco sh -c "npm run build"
          
          echo "🔁 正在重启容器 [Taco]..."
          docker restart Taco
          
          echo "✅ 部署完成"
          '

这样,我们就完成了自动部署的任务!

4.总结

如果你和我一样使用1Plane部署nodejs项目,但不想每次更新都要重新上传的话,可以试试我的方案!

workflow编写时默认使用本地的runner,如果你需要使用GitHub的runner,请自行修改