Skip to main content

不使用服务器部署网站

1. 不使用服务器部署静态页面

1) 静态页面托管

打包构建

使用 GitHub Action 作为 CI 环境,使用 actions/cache@v3 缓存 node_modules,如 yarn.lock 没变就不重复装包。

Action 触发条件:

# 仅仅当 master 代码发生变更时,用以自动化部署
on:
push:
branches:
- master

# 仅当 feature/** 分支发生变更时,进行 Preview 功能分支部署 (见 Preview 篇)
on:
pull_request:
types:
# 当新建了一个 PR 时
- opened
# 当提交 PR 的分支,未合并前并拥有新的 Commit 时
- synchronize
branches:
- 'feature/**'

# 在每天凌晨 0:30 处理一些事情,比如清理多余的 OSS 资源,清理多余的功能分支 Preview (见 Preview 篇)
on:
schedule:
- cron: '30 8 * * *'

配置示例 PNPM + Changeset 发布 NPM 包:

name: Release

on:
push:
branches:
- main

jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v2

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 16.x

- name: Setup Pnpm
uses: pnpm/action-setup@v2
with:
version: 7.x

- name: Install dependencies
run: pnpm install --prod --prefer-offline --frozen-lockfile

- name: Create Release Pull Request or Publish to npm
uses: changesets/action@v1
with:
publish: pnpm release
version: pnpm change:version
commit: 'chore: version packages'
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

配置示例 PNPM + vitepress 部署静态文档:

name: docs-deploy

on:
push:
branches:
- main

jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
# “最近更新时间” 等 git 日志相关信息,需要拉取全部提交记录
fetch-depth: 0

- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 7

- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --prod --prefer-offline --frozen-lockfile

- name: Build vitepress site
run: pnpm docs:build
env:
DOC_ENV: preview
NODE_OPTIONS: --max-old-space-size=4096

- name: Deploy to GitHub Pages
uses: crazy-max/ghaction-github-pages@v2
env:
GITHUB_TOKEN: ${{ secrets.ACTION_SECRET }}
with:
# 部署到 gh-pages 分支
target_branch: gh-pages
# 部署目录为 vitepress 的默认输出目录
build_dir: packages/.vitepress/dist

部署

打包之后将静态资源上传至阿里云 OSS 或者静态网站托管平台上,提升页面加载速度。

此时分为两种情况:

  • 静态页面,由于每个页面路由都已经预渲染出对应的 html 文件,因此可以直接将 html 文件也进行上传(顺便搭配 CDN 加速)
  • SPA 应用,不能上传 html,否则刷新页面就会出现 404 的问题,只能上传静态资源,需要配置 Webpack 的 output.publicPath

推荐部署到 Vercel,国内访问速度比较快,只需要把代码推送到 GitHub 仓库,就会自动拉取代码构建、部署。Vercel 会给推送到 main 分支的代码生成 Production Deployment,给其他分支推送的代码生成 Preview Deployments。需要注意,Vercel 对个人用户免费,但是对组织是收费的。

https://www.docusaurus.cn/docs/deployment#deploying-to-vercel

tip

哪个无服务器边缘平台拥有最快的 Git 部署

Deno 背后的团队测试了一些流行的无服务器边缘计算提供商 (包括他们自己的 Deno Deploy 查看哪个具有最快的 git 部署时间。面对不同的 benchmarks,应该有自己的判断,必要时可以自行进行测试。

https://deno.com/blog/fastest-git-deploys-to-the-edge

2) 容器托管

对于 SPA 应用,所有的静态资源都可以上传 CDN,但是 html 文件还得自己部署。建议使用 Docker 容器,将 Nginx 和 html 入口文件打包成一个镜像,然后在服务器上拉取镜像并执行就好。

我们每次代码更新后都要手动去执行镜像构建、关闭老容器、启动新容器,非常麻烦,而且没法对容器进行统一的管理。所以更方便的方式是使用云服务商提供的容器托管平台,可以实现自动化构建以及发布版本化等一系列强大的功能。

2. 不使用服务器部署后端项目

1) 容器托管

如果你使用 SpringBoot 框架开发,打包之后得到的是 jar 包,内置了 tomcat 等 web 服务器,因此只需要用一行命令启动 jar 包即可:

$ nohup java -jar app.jar --spring.profiles.active=prod &

使用 Docker 容器技术,理论上可以封装任何环境和应用,对于后端 Java 项目来说,把 Java 环境、Maven 和 jar 包封装成一个镜像就好了。

tip

MySQL 不建议跑在 Docker 容器里面,Docker 容器都是无状态的,一旦容器挂了数据都丢了,一定要跑在容器里面也行,但是要挂载外部数据卷,这样才能持久化存储。

在写 Dockerfile 时,可以直接使用 maven:3.5-jdk-8-alpine 这种基础镜像,自带了 jdk 和 maven,省去了自己写安装脚本的麻烦。

当然,有需要的话,你还可以在 Java 容器前加个 Nginx 负载均衡:

image

2) Serverless 云函数

对于一些小项目,可以直接用 Serverless 云函数 + 云数据库 + 云存储,免去运维成本。