本文由 莫潇羽@无忆研习社(www.wuyi.wiki)撰写,转载请注明出处。
快速摘要
如果你手里有一个开源的 Web 项目,不想买服务器,也不想折腾 Nginx 反向代理和 SSL 证书,那么这篇文章就是为你准备的。本文以一次真实的全栈项目部署经历为线索,系统梳理了三种主流部署路线:Serverless 平台(Vercel / Netlify)一键部署、Docker 容器化自托管部署、以及用 Upstash Redis 做数据持久化的进阶玩法。每种方式都有完整的操作步骤、配置代码、以及我亲自踩过的坑。看完你会对现代 Web 应用的部署生态有一个清晰的全局认知——不再只会在本地 npm run dev,而是能把项目真正送上线。
这年头,前端圈的变化快得让人喘不过气。几年前大家还在争论 Webpack 配置怎么写,一转眼 Vite 已经成了标配。以前部署一个项目得上服务器、配 Nginx、申请 SSL 证书、搞 CDN——一套流程走下来,没半天搞不定。现在呢?把代码推到 GitHub,连上 Vercel,几分钟后一个带 HTTPS 和全球 CDN 的网站就上线了。这种体验上的反差,说实话,我刚接触的时候也被震撼到了。
我就是莫潇羽,无忆研习社(www.wuyi.wiki)的站长。平时折腾各种开源项目,积累了一些部署方面的实操经验。写这篇文章的目的很简单:把我折腾过的几种部署方式整理成一份系统化的参考手册,让你下次遇到类似需求的时候不用到处搜零零散散的教程,一篇就够了。
想看完整的拆解过程?往下翻,我们从基础概念开始,一步步把每种部署路线走通。
前置知识:理解现代 Web 应用的架构骨架
在动手部署之前,有几样东西得先搞清楚。这些东西不是什么高深理论,但如果不了解,后面看配置文件和部署步骤的时候会一头雾水。我用最简单的话把核心概念串一遍。
Next.js 到底是啥?
很多时候我们说的"Web 应用",现在已经不是十年前那种 HTML + CSS + jQuery 的组合了。现代 Web 应用通常基于某种全栈框架构建——一套代码里同时包含前端界面和后端接口。
Next.js 就是这类框架里的明星选手。它基于 React,但又比纯粹的 React 多了一层"服务端能力"。你用 Next.js 写的项目,既可以走传统的客户端渲染(CSR),也可以走服务端渲染(SSR),甚至可以生成纯静态页面(SSG)。同一个项目,部署的时候灵活性极高——你可以把它丢到 Vercel 这种 Serverless 平台上跑,也可以打包成 Docker 镜像在自己的 NAS 或 VPS 上跑。
我自己的理解:Next.js 就像一辆既能在高速公路上飙(Vercel 优化),也能在乡间小路上开(自托管 Docker)的车。这种灵活性,对于学习和实验来说简直完美。
环境变量:应用的"身份信息"
任何一个正经的 Web 应用都不会把密码、密钥、数据库地址硬编码在源码里。这些东西通过环境变量注入——运行的时候由部署平台或容器把值传进去。
环境变量本质上就是一组 key-value 键值对,比如:
USERNAME=admin
PASSWORD=mySecret123
REDIS_URL=redis://localhost:6379在 Vercel 或 Netlify 的网页后台,你可以在项目设置里找到"Environment Variables"面板,一个个填进去。Docker 部署时,这些变量写在 docker-compose.yml 的 environment 字段里。格式不同,原理一样。
数据持久化的三种姿势
一个 Web 应用运行起来之后,用户的操作数据、配置信息得有个地方存。常见的选择有三种:
方案 | 原理 | 适用场景 | 优点 | 缺点 |
localStorage | 数据存在浏览器本地 | 单设备使用、无需同步 | 零配置,无需后端 | 换设备数据丢失,不能多设备同步 |
自建 Redis | 内存数据库,数据存在服务器上 | Docker 部署、有 VPS/NAS | 高性能,数据可持久化 | 需要自己维护 Redis 实例 |
Serverless Redis(如 Upstash) | 云端的 Redis 服务,按请求量计费 | Vercel/Netlify 等 Serverless 平台 | 免运维,与 Serverless 平台深度集成 | 请求量大时成本上升(但有免费额度) |
这个对比对你选择部署路线很重要。如果你只是在个人电脑上玩一玩,localStorage 够用了;如果你有多设备同步的需求(比如家里 NAS + 手机都想访问同一个应用),那 Redis 方案就是必须的。
现代部署平台的能力边界
下面这张表是我根据自己的使用体验总结的,可以帮助你快速判断哪种平台适合你:
平台 | 部署门槛 | 费用 | 自定义程度 | 适合人群 |
Vercel | ⭐(极低) | 免费额度够个人用 | 中 | 前端开发者、不想碰服务器的同学 |
Netlify | ⭐(极低) | 免费额度够个人用 | 中 | 已有 Netlify 账号、偏好其生态的用户 |
Docker(自托管) | ⭐⭐⭐(中等) | VPS/NAS 硬件成本 | 高 | 有 NAS 或 VPS、喜欢折腾的玩家 |
好,基础概念就讲到这儿。现在你已经知道了 Next.js 是干什么的、环境变量怎么工作、数据该存到哪、以及不同平台的定位。接下来我们正式进入部署实操。先从最友好的 Vercel 路线开始。
部署方式一:Serverless 平台部署——Vercel 路线
Vercel 是 Next.js 框架背后的公司开发的部署平台。因为它和 Next.js 是"亲父子"关系,所以用 Vercel 部署 Next.js 项目的体验是所有平台里最丝滑的,没有之一。你不需要知道什么是 Nginx,不需要理解反向代理,甚至连域名都可以先不绑——Vercel 直接给你一个 xxx.vercel.app 的免费域名。
Vercel 的工作机制:一个直观的理解
你往 GitHub 仓库 push 代码 → Vercel 自动检测到变更 → 拉取代码 → 执行构建 → 部署到全球 CDN 节点 → 返回给你一个可访问的 URL。
整个过程你不需要碰任何服务器。这背后是 Serverless 架构在起作用:Vercel 把你的应用拆成一个个无状态的函数,按需执行,不跑的时候不占资源。对于个人项目和学习实验来说,这意味着你几乎可以零成本地把项目跑起来。
第一步:准备 GitHub 仓库
几乎所有现代化部署平台都跟 GitHub 深度绑定。所以第一步是把你要部署的项目代码放到 GitHub 上。
如果你的项目源码已经在某个开源仓库里,最标准的做法是 Fork(复刻)一份到你自己的 GitHub 账号下。Fork 的好处是:你得到了一份完全由你控制的副本,可以自由修改配置文件,同时又保留了对原始仓库的追溯。而且后续原始仓库如果有更新,你可以通过 GitHub 的 Sync fork 功能同步过来,非常方便。
Fork 的操作很简单:打开原始仓库页面,点右上角的 Fork 按钮,选择你的账号作为目标,几秒钟就完成了。Fork 完之后,你会在自己账号下看到一个同名的仓库,URL 变成了 https://github.com/你的用户名/项目名。
莫潇羽的小提示:Fork 之后记得先看一眼仓库里的 config.json 或类似的配置文件。很多开源项目的默认配置不一定符合你的使用习惯,部署前改好比部署后再改要省事得多。第二步:登录 Vercel 并授权 GitHub
打开 Vercel 官网,点右上角的 Login。Vercel 支持 GitHub、GitLab、Bitbucket 三种登录方式。我个人建议直接用 GitHub 登录——因为你的代码就托管在 GitHub 上,用同一个账号授权最省事。
登录之后 Vercel 会请求访问你的 GitHub 仓库权限。这里需要注意:Vercel 默认会请求访问你所有仓库的权限,但你可以在授权时选择"Only select repositories",只勾选你 Fork 的那个仓库。从安全角度说,这是一个好习惯——最小权限原则,不给平台多余的访问权限。
第三步:导入项目并配置
登录后进入 Vercel 的 Dashboard,点击 "Add New..." → "Project",你会看到一个仓库列表。找到你刚才 Fork 的那个仓库,点击 "Import"。
接下来是关键一步——设置环境变量。Vercel 会自动识别你的项目是 Next.js 框架,所以构建命令、输出目录这些都不用你管。但你需要手动填写项目运行所必需的环境变量。
什么是必需的环境变量?每个项目不一样,但通常至少包含一个用于访问控制的密码。设置方法:在 "Environment Variables" 区域,Name 填变量名(比如 PASSWORD),Value 填你设定的密码值。点击 Add 可以继续添加更多变量。
这里给一个典型的配置示例:
PASSWORD = your_secure_password_here填好之后点 Deploy。Vercel 会开始构建你的项目——拉取代码、安装依赖、执行构建——你可以在构建日志里实时看到进度。一般一两分钟就完成了。
部署成功后,Vercel 会给你一个类似 https://你的项目名.vercel.app 的域名。点击就能直接访问。
第四步:绑定自定义域名(可选但推荐)
Vercel 送的 .vercel.app 域名虽然能用,但如果你有自己的域名,绑上去体验会好很多——特别是国内访问时,用自己的域名配合合适的 DNS 解析策略可以改善访问速度。
绑定步骤:
- 进入项目 Settings → Domains
- 输入你的域名,点击 Add
- Vercel 会给你一组 DNS 记录配置信息(通常是 CNAME 记录)
- 去你的域名 DNS 管理后台(阿里云、腾讯云、Cloudflare 等等),添加对应的解析记录
- 等待 DNS 生效(快则几分钟,慢则几小时),Vercel 会自动申请并配置 SSL 证书
绑定完之后,你的项目就有 https://你的域名.com 这样的正式地址了。
第五步:自动部署——改代码即上线
Vercel 最让我喜欢的一个特性是自动部署。你把 Fork 的仓库 clone 到本地,改了代码,push 到 main 分支——Vercel 检测到变更后会自动触发重新构建和部署。你不需要手动点任何按钮。
这个特性对于持续迭代的项目简直太爽了。你改一个配置、修一个 bug、加一个新功能,push 之后喝杯水的功夫,线上就已经更新好了。而且 Vercel 对每个 commit 都会生成一个独立的预览 URL,你可以先预览确认没问题再合并到主分支。
我个人的 Git 工作流建议:不要直接在 main 分支上改东西。建一个 dev 或 feature/xxx 分支,改完测试好,再合并到 main。这样 main 分支始终是一个稳定可部署的状态,不会出现"改了一半不小心推上去导致线上炸了"的尴尬。Vercel 默认只监听 main 分支的变更,但你可以配置它也监听其他分支(作为预览部署),灵活度很高。
关于国内访问的补充说明
实话实说,Vercel 默认分配的域名在国内某些网络环境下的访问体验参差不齐。这不是 Vercel 的问题,而是跨境网络的固有特征。我的经验是:
- 绑了自己的域名之后,配合国内 DNS 服务商做解析,情况会好不少
- Vercel 的全球 CDN 节点在亚洲有部署(新加坡、香港、东京等),大部分请求能就近响应
- 如果对国内访问速度有极致要求,可以将 Docker 自托管部署作为备选方案(后面会讲)
合规提示:Vercel 为境外平台,使用时请遵守国内网络与内容管理相关规定。本文讨论的是技术学习层面的部署实践,不涉及任何特定内容的传播引导。
进阶配置:用 Upstash Redis 实现数据持久化
前面说了,localStorage 模式最大的问题是数据存在浏览器里——换一台设备、清一次缓存,数据就没了。如果你的应用有多设备同步的需求(比如家里电脑和手机都想访问同一个实例),那就得上 Redis。
Redis 是什么?一句话说清楚
Redis 是个内存数据库。跟传统的 MySQL、PostgreSQL 这种把数据存在硬盘上的数据库不同,Redis 主要把数据放在内存里,所以读写速度极快——适合做缓存、会话存储、以及我们这里需要的"应用配置和应用数据的持久化存取"。
打个比方:MySQL 像图书馆的藏书库,数据多但取书要走一段路;Redis 像你桌上的便签本,随手记随手看,就是容量相对小。
为什么选 Upstash 而不是自己搭 Redis?
如果你用 Vercel 或 Netlify 这种 Serverless 平台部署,这些平台本身不提供持久的文件存储和数据库服务。Serverless 函数的本质是"用完即销毁"——每次请求可能跑在不同的实例上,你不能指望在函数里写文件然后下次还能读到。
所以需要外挂一个持久化存储。Upstash 就是专门为这种场景设计的 Serverless Redis 服务:
- 按量计费:不是按小时租服务器,而是按你实际发了多少条 Redis 命令来算钱。对于个人项目、实验项目来说,免费额度通常绰绰有余。
- 兼容标准 Redis 协议:你平时怎么用 Redis,Upstash 就怎么用。现有的 Redis 客户端库(ioredis、redis-py、go-redis 等)直接能用。
- 与 Vercel/Netlify 深度集成:有官方集成的 marketplace 插件,配置只需要填几个环境变量。
截至写稿时,Upstash 的免费套餐包含每天一定数量的命令配额(具体数值以官方定价页面实时数据为准),对于个人学习和实验完全够用。
操作流程:五步搞定 Upstash Redis
下面是我实际操作的完整记录:
第一步:注册 Upstash 账号
打开 Upstash 官网,用 GitHub 账号直接登录(跟 Vercel 保持一致,方便后续集成)。
第二步:创建一个 Redis 数据库
登录后进入控制台,点击 "Create Database"。给数据库起个名字(随便起,不影响功能),区域选择离你最近的节点。如果你是 Vercel 用户,建议选与 Vercel 函数运行区域相同或相近的节点,以减少网络延迟。
类型选 "Global" 或 "Regional" 都行——个人使用差别不大。创建完成后,你会进入数据库的详情页。
第三步:获取连接凭证
在数据库详情页,找到两个关键信息:
- REST URL(也叫 HTTPS ENDPOINT):类似
https://xxx.upstash.io的地址 - REST Token:一串长长的加密字符串
把这两个值复制下来,保存好。Token 只会显示一次(或需要手动 reveal),如果弄丢了可以在控制台重新生成。
第四步:在 Vercel 中配置环境变量
回到 Vercel 的项目 Dashboard,进入 Settings → Environment Variables,添加以下变量:
UPSTASH_URL = https://xxx.upstash.io
UPSTASH_TOKEN = your_rest_token_here
NEXT_PUBLIC_STORAGE_TYPE = upstash
USERNAME = admin
PASSWORD = your_admin_password各变量的作用解释一下:
UPSTASH_URL和UPSTASH_TOKEN:让应用能连上你的 Redis 数据库NEXT_PUBLIC_STORAGE_TYPE:告诉应用使用 Redis 模式而不是 localStorageUSERNAME和PASSWORD:管理员账号,用于登录管理后台
第五步:重新部署
环境变量修改之后,需要触发一次重新部署才能生效。最简单的做法:进入 Vercel 项目的 Deployments 页面,点击最新的部署记录右侧的三个点,选择 "Redeploy"。或者直接往 GitHub 仓库 push 一次代码,自动触发部署。
部署完成后,用你设定的管理员账号密码登录,就能看到持久化的数据管理界面了。此时换一台设备、换一个浏览器,用同一套凭据登录,数据是一致的——Redis 持久化生效了。
localStorage vs Redis 持久化:一张表看懂
对比维度 | localStorage 模式 | Upstash Redis 模式 |
数据存储位置 | 浏览器本地 | 云端 Redis 数据库 |
跨设备同步 | ❌ 不支持 | ✅ 支持 |
数据持久性 | 清除浏览器数据后丢失 | 持久保存(除非手动删除) |
多用户/多账户 | ❌ 不支持 | ✅ 支持 |
配置复杂度 | 零配置 | 需注册 Upstash + 配环境变量 |
费用 | 免费 | 免费额度够个人使用 |
简单说:如果你只是自己在一台设备上体验,localStorage 足够了。但如果你和家人共享、或者多设备协同使用,Redis 方案几乎是必选项。
数据流示意图
下面是应用、Vercel 平台、Upstash Redis 三者之间的数据交互关系:
graph LR
A[用户浏览器] -->|HTTPS 请求| B[Vercel Serverless Function]
B -->|读写数据| C[Upstash Redis]
B -->|返回页面/数据| A
D[另一台设备] -->|同样凭据登录| B
C -->|同一份数据| B无论从哪台设备发起请求,最终读写的都是同一个 Upstash Redis 实例里的同一份数据。这就是持久化同步的本质。
部署方式二:Docker 容器化部署——把应用装进自己的服务器
Serverless 平台虽然方便,但毕竟数据和应用都不在你自己的机器上。如果你家里有台 NAS(群晖、威联通、飞牛),或者手里有台 VPS(云服务器),那 Docker 部署是更"硬核"也更有掌控感的选择。
Docker 到底是什么?给新手的解释
Docker 可以理解为一个"标准化打包工具"。它把你的应用连同运行环境(操作系统依赖、运行时、库文件、配置等)一起打成一个镜像(Image),然后在任何装了 Docker 的机器上都可以用这个镜像启动一个容器(Container)来运行。
类比一下:镜像就像一份"预制菜配方+食材包",容器就是用这份配方做出来的一道菜。同样的配方可以在任何厨房做出一模一样的菜——不管厨房是在你家、在朋友家、还是在云服务器上。
而 Docker Compose 是 Docker 的"批量管理工具"。一个稍微复杂点的应用通常不止一个容器——比如你的 Web 应用需要一个 Redis 容器来存数据,两个容器之间有依赖关系。Docker Compose 用一份 YAML 配置文件把多个容器的启动顺序、网络关系、环境变量、端口映射等一把梭全管起来。
环境准备:确认 Docker 已安装
开始之前,先确认你的机器上装了 Docker 和 Docker Compose。在终端里跑:
docker --version
docker compose version如果显示版本号,说明已经装好了。如果没有,去 Docker 官网下载 Docker Desktop(Windows/Mac),或者 Linux 上用包管理器安装(apt install docker.io docker-compose 或 yum install docker docker-compose)。
群晖 NAS 用户可以在套件中心搜索安装 Docker;飞牛 NAS 系统也有预置的 Docker 支持。不同设备的安装方式略有差异,但装好之后的操作命令是完全一样的——这就是 Docker 的魅力。
完整部署流程:从零到跑起来
第一步:创建项目目录
先在服务器上建一个目录来放配置文件。我习惯把东西放在 /root 下,你可以根据自己的习惯调整:
mkdir -p /root/myapp
cd /root/myapp第二步:编写 docker-compose.yml
在 /root/myapp 目录下创建 docker-compose.yml 文件:
nano docker-compose.yml然后把下面的配置内容粘贴进去。注意:这份配置里的用户名和密码是示例,部署时务必改成你自己的:
services:
myapp-core:
image: ghcr.io/用户名/项目镜像:latest
container_name: myapp-core
restart: unless-stopped
ports:
- "3000:3000"
environment:
- USERNAME=admin
- PASSWORD=mySecurePass789
- NEXT_PUBLIC_STORAGE_TYPE=redis
- REDIS_URL=redis://myapp-redis:6379
depends_on:
- myapp-redis
networks:
- myapp-network
myapp-redis:
image: redis:alpine
container_name: myapp-redis
restart: unless-stopped
networks:
- myapp-network
networks:
myapp-network:
driver: bridge粘贴完之后,Ctrl + X,按 Y,回车保存。
第三步:启动容器
docker compose up -d这个命令会:
- 拉取所需的 Docker 镜像(第一次会比较慢,取决于你的网络)
- 创建配置中定义的网络
- 按依赖顺序启动容器(先 Redis,后核心应用)
-d参数表示在后台运行(detached mode)
等它跑完,用 docker ps 查看容器状态,两个容器的 STATUS 应该都是 "Up"。
第四步:访问验证
打开浏览器,输入 http://你的服务器IP:3000。如果能正常打开页面,并且用你配置的账号密码能登录,说明部署成功了。
如果是 NAS 部署,IP 就是你 NAS 的内网地址(比如 192.168.1.100:3000)。如果你想在外面也能访问,需要在路由器上做端口转发,或者配合内网穿透工具——这部分内容展开来能单独写一篇文章,这里就不展开了。
docker-compose.yml 配置逐行解析
很多同学拿到一份 docker-compose.yml,改几个参数就复制粘贴跑起来了,但出了问题不知道怎么排查。下面我把每个关键配置项掰开揉碎讲清楚:
配置项 | 含义 | 注意事项 |
| 指定使用的 Docker 镜像 | 格式为 |
| 给容器起一个固定名字 | 不指定的话 Docker 会随机生成,不方便后续管理 |
| 重启策略:除非手动停止,否则自动重启 | 服务器重启后容器会自动恢复,很实用 |
| 端口映射: | 如果你想用 8080 端口访问,改成 |
| 注入环境变量 | 每个 |
| 声明依赖关系 | 确保 Redis 容器先启动,应用容器后启动 |
| 定义容器间的通信网络 | 同一个网络下的容器可以用容器名互访(比如 |
特别说明一下 depends_on——它只保证启动顺序,不保证 Redis 服务已经完全就绪。在极少数情况下(Redis 启动较慢),应用容器可能在 Redis 还没准备好时就尝试连接,导致启动失败。如果你遇到这种情况,最简单的处理是等 Redis 完全启动后手动重启应用容器:
docker restart myapp-core针对不同环境的适配说明
群晖 NAS:在 Docker 套件里,你可以直接用图形界面导入 docker-compose.yml(群晖 DSM 7.2+ 版本原生支持 Compose),也可以 SSH 进去用命令行。路径通常建在 /volume1/docker/myapp/ 下。
飞牛 NAS:飞牛系统对 Docker 的支持很友好,预装了 Docker Engine。SSH 登录后的操作和标准 Linux 完全一致。
Ubuntu / Debian VPS:最常见的场景。确保防火墙开放了 3000 端口(或你自定义的端口):
ufw allow 3000CentOS / Rocky Linux:注意 SELinux 可能会阻止 Docker 容器的某些操作。如果遇到权限问题,临时排查时可以 setenforce 0,但不建议长期关闭——更好的做法是配置 SELinux 策略。
另外提醒一下 Docker Compose 的版本兼容:新版 Docker(Docker Engine 20.10+)已经内置了 docker compose(注意中间没有横杠),不再需要单独安装 docker-compose。如果你在教程里看到 docker-compose(带横杠)的写法,那是旧版的独立二进制文件;新写法 docker compose 效果完全一样,而且是未来方向。
日常维护:更新与备份
当你使用的开源项目发布了新版本,更新镜像的步骤很简单:
cd /root/myapp
docker compose pull # 拉取最新镜像
docker compose up -d # 用新镜像重建容器备份的话,如果你用的是 Redis 持久化方案,数据在 Redis 容器里。虽然 Redis 有 RDB/AOF 持久化机制,但最稳妥的做法是定期把数据目录映射到宿主机。可以在 docker-compose.yml 的 Redis 服务下加一个 volumes 映射:
myapp-redis:
image: redis:alpine
container_name: myapp-redis
restart: unless-stopped
volumes:
- /root/myapp/redis-data:/data
networks:
- myapp-network这样 Redis 的数据文件就存在了宿主机的 /root/myapp/redis-data 目录下,即使容器被删了数据也不会丢。备份这个目录就行。
部署方式三:Netlify 平台部署——Vercel 之外的另一个选择
如果你已经在用 Netlify 托管其他项目,或者单纯想了解一下 Vercel 之外的选择,那 Netlify 部署路线值得一试。整体流程和 Vercel 非常相似,同样基于 Git 仓库 + 自动构建的模式。
Netlify 和 Vercel 到底有什么区别?
两个平台的核心能力高度重合:都支持 Git 集成自动部署、都提供免费 HTTPS 和 CDN、都支持 Serverless Functions、都有环境变量管理。但从使用体验上说,有几个微妙的不同:
对比维度 | Vercel | Netlify |
Next.js 优化 | ⭐⭐⭐⭐⭐ 原生级优化 | ⭐⭐⭐ 兼容但非最优 |
静态站点生成 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ 历史更久,生态成熟 |
免费额度 | 100GB 带宽/月 | 100GB 带宽/月 |
构建时间 | 较快(Next.js 优化) | 一般 |
函数运行时 | Edge Functions + Serverless | Edge Functions + Serverless |
国内访问体验 | 略好(亚洲节点更多) | 一般 |
简单说:如果部署的是 Next.js 项目,Vercel 有明显优势。如果是纯静态站点或 JAMStack 架构的项目,Netlify 同样非常好用。两个平台不存在绝对的优劣,更多是生态偏好的差异。
Netlify 部署流程
第一步:Fork 仓库(如果还没做)
和 Vercel 路线一样,先把项目 Fork 到自己的 GitHub 账号下。
第二步:登录 Netlify 并授权
打开 Netlify 官网,选择用 GitHub 登录并授权。Netlify 同样支持"Only select repositories"的细粒度授权模式。
第三步:导入项目
点击 "Add new site" → "Import an existing project",选择 GitHub 作为 Git 提供商,然后从仓库列表中找到你 Fork 的项目,点击选中。
在项目配置页面,Netlify 会自动检测框架类型。对于 Next.js 项目,构建命令和发布目录通常会自动填充正确(next build 和 .next),但建议你确认一下。
第四步:设置环境变量
在部署前,展开 "Environment variables" 区域,添加必需的环境变量。格式跟 Vercel 一样:Name 和 Value 一一对应。
PASSWORD = your_password如果要用 Redis 持久化,还需要加上:
UPSTASH_URL = https://xxx.upstash.io
UPSTASH_TOKEN = your_token
NEXT_PUBLIC_STORAGE_TYPE = upstash
USERNAME = admin第五步:部署
点击 "Deploy site",Netlify 会开始构建。构建完成后,你会得到一个 xxx.netlify.app 的域名。同样支持绑定自定义域名。
第六步:后续配置 Upstash Redis(如需)
部署完成后如果要加 Redis,操作路径是:Site configuration → Environment variables → 添加变量 → 然后手动触发一次重新部署(Deploys → Trigger deploy)。
三种部署路线终极对比
折腾完三种路线之后,我把它们的核心差异整理成一张表。你可以根据自己的实际情况对号入座:
维度 | Vercel | Netlify | Docker 自托管 |
上手难度 | 极低(几次点击) | 极低(几次点击) | 中(需会终端操作) |
是否需要服务器 | 不需要 | 不需要 | 需要 VPS/NAS |
费用 | 免费额度够用 | 免费额度够用 | VPS/NAS 硬件成本 |
数据控制权 | 数据在云端 | 数据在云端 | 数据在自己机器上 |
自定义程度 | 中 | 中 | 高 |
Next.js 优化 | 最佳 | 良好 | 自行配置 |
适合谁 | 前端开发者、新手 | 已有 Netlify 经验的用户 | NAS/VPS 玩家、喜欢折腾的人 |
持久化方案 | Upstash Redis | Upstash Redis | 原生 Redis / Upstash 均可 |
我的个人建议:如果你是第一次接触 Web 应用部署,从 Vercel 开始。它把大量细节都帮你处理好了,你能在最短时间内看到成果、建立信心。等你对部署流程熟了,再尝试 Docker,慢慢建立对底层原理的理解。莫潇羽@无忆研习社(www.wuyi.wiki)的体会是——技术学习最好的节奏是先跑通再深入,一上来就啃最硬的骨头容易劝退自己。
自定义配置与数据源管理:让应用真正为你所用
部署跑通只是第一步。一个开源项目默认的配置往往不适合所有人——数据源可能不全、界面细节不符合你的习惯、某些功能你可能根本不需要。这一章我们来聊聊怎么通过修改配置文件和调整数据源,让应用更贴合你的实际需求。
配置文件的结构认知
大多数开源 Web 项目会在仓库根目录放一个配置文件,常见的有 config.json、config.js、config.yml 或 .env.example。这个文件定义了应用的运行时行为——有哪些功能开关、数据从哪些接口获取、界面展示哪些内容,等等。
以 JSON 格式的配置文件为例,一个典型的配置结构大概长这样:
{
"site": {
"name": "我的站点",
"description": "一个自定义的 Web 应用"
},
"sources": [
{
"name": "数据源A",
"api": "https://api-a.example.com/v1",
"type": "primary",
"enabled": true
},
{
"name": "数据源B",
"api": "https://api-b.example.com/v2",
"type": "backup",
"enabled": true
}
],
"features": {
"searchEnabled": true,
"cacheEnabled": true,
"cacheTTL": 3600
}
}这个结构揭示了几个关键设计思路:
- 多数据源:
sources是一个数组,意味着你可以配置不止一个数据来源 - 主备模式:
type字段区分了primary(主)和backup(备) - 功能开关:
features下的布尔值控制各项功能的启用/禁用
如何修改配置文件
Vercel / Netlify 用户:因为你 Fork 了仓库,配置文件就在你 Fork 后的仓库里。直接在 GitHub 网页上打开文件、点击编辑(铅笔图标)、修改内容、提交。提交后 Vercel/Netlify 会自动触发重新部署,新的配置就生效了。
Docker 用户:你有两种方式。一是在启动容器前修改宿主机上的配置文件,然后用 volume 映射进去。二是在 docker-compose.yml 里通过环境变量覆盖特定配置项。前者的好处是改得彻底,后者的好处是不用重建镜像。
数据源切换的原理与实操
很多 Web 应用(尤其是聚合类应用)的"可用性"取决于数据源的稳定程度。一个好用的应用通常会支持配置多个数据源,前端在运行时检测各数据源的响应速度和可用性,自动切换到最优的那个。
这种机制的技术实现大致如下:前端代码维护一个数据源列表 → 定期(或在用户触发操作时)向各数据源发送试探请求 → 根据响应时间和成功率排序 → 把最快的可用数据源作为当前活跃源 → 如果活跃源挂了,自动 failover 到下一个。
从使用者的角度看,你能做的事情是:
- 确保配置文件里的数据源地址是有效的(建议定期检查)
- 多配置几个备选数据源,不要只有一个
- 如果要自己搭建数据源,注意相关的合规和法律要求
关于数据源地址的有效性——URL 拼写错误、API 版本过期、服务提供商停止维护,这些都是常见的问题。我在维护自己的实例时,每隔一段时间会快速过一遍配置文件里的各个地址,把失效的替换掉。这个过程花不了几分钟,但能大幅提升日常使用的稳定性。
环境变量安全管理的几个建议
环境变量里通常包含密码、API 密钥等敏感信息,暴露了后果很严重。下面是我自己遵守的几条安全原则:
- 永远不要把含真实密码的配置文件提交到公开仓库。GitHub 会扫描公开仓库中的密钥并可能自动 revoke
- Vercel/Netlify 的环境变量面板是加密存储的,比写在配置文件里安全得多
- Docker 部署时,密码建议通过
.env文件注入而不是直接写在docker-compose.yml里。做法:创建一个.env文件(记得加到.gitignore),然后用${变量名}在 compose 文件里引用 - 密码强度要有基本保障:别用
123456、admin、password这种——不用我多说为什么吧
下面是一个使用 .env 文件的 Docker Compose 配置示例:
.env 文件内容(不要提交到 Git):
ADMIN_USER=admin
ADMIN_PASS=MyStr0ng!Pass2026
REDIS_PASS=anotherStrongPassdocker-compose.yml 中引用:
environment:
- USERNAME=${ADMIN_USER}
- PASSWORD=${ADMIN_PASS}这样即使别人看到了你的 docker-compose.yml,也看不到真实的密码。
Docker Compose 配置深度解析:每一行都在干什么
上一章我们贴了一份完整的 docker-compose.yml 并