⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

第十四章:云服务器运维与项目部署

序言

假如你囊中不羞涩,真的去买了一台服务器;或者你发现某云厂商的福利活动,可以领取试用机。

在选择服务器地区时,老师傅建议最好选择 中国香港 或海外节点。 原因很简单:国内大陆节点的服务器绑域名必须备案,而香港节点免备案,能让你省去数周的等待时间,即买即用。

总之,你获得了一个公网 IP、用户名(通常是 root)和密码。 你发现服务器不像 Windows 那样有远程桌面,只能通过终端 (Terminal) 操作。你学会了使用 SSH 命令连接服务器: ssh root@1.2.3.4

SSH

管理远程服务器需要 SSH 连接。SSH 是安全的方式远程登录服务器。在**【第10章】** 你已经详细讲解了 SSH 原理和配置。 拿到服务器后,老师傅并没有让你直接开始敲代码,而是先教了你几条服务器初始化的铁律(比如更新系统、设置防火墙等)。

1Panel 面板

为了降低运维难度,老师傅推荐你安装 1Panel 面板, 这是一个现代化的 Linux 服务器可视化运维管理软件。

这也体现了"通过配置而非代码"来扩展能力的理念。正如之前我们使用 MCP 让 AI 连接外部工具,Hooks 让 AI 自动执行任务,Skills 让 AI 掌握专业能力。它们都是配置驱动的系统。

你按照官方文档的一行命令学会了安装,并且一键安装了 Docker,并顺手配置了镜像加速(这在国内网络环境下至关重要)。

Docker 容器

什么是 Docker? 1Panel 的核心其实就是 Docker。虽然这听起来又是一个新名词,但你可以把它理解为集装箱。

  • 隔离性:每一个应用(你的网站、数据库)都被打包在一个独立的集装箱里运行,互不干扰,也不污染你的服务器系统。
  • 一致性:你在面板里点的每一次安装应用,本质上就是在拉取和运行这些 Docker 集装箱。

这种隔离机制让你明白了一个铁律:永远不要直接在服务器上写代码或修改文件。 服务器是用来"跑"代码的生产环境 (Production),而写代码、调试 Bug 应该永远在你的本地电脑的开发环境 (Development) 里完成,然后通过 Git 同步上去。

安全组

当你兴奋地输入 1Panel 给出的 http://IP:端口 访问面板时,浏览器却转圈圈直到超时。 你以为是面板配置错了,但老师傅告诉你,云服务器通常有第一道安全门——云厂商的安全组

安全组相当于云厂商在机房门口设的防火墙。 默认情况下,除了 SSH (22) 等少数端口,其他端口都是封死的。你必须去云厂商的控制台后台,手动开放安全组规则(放行 1Panel 的端口),外面的请求才能摸到你的服务器边缘。

自建数据库

如果不使用使用云端的 Supabase数据库,现在我们有了服务器,完全可以自己部署一个。你打开 1Panel 的"应用商店",一键安装了 PostgreSQL。 在安装过程中,你设置了数据库端口管理员账户(通常是 postgres)和密码

安装完成后,你在面板的“数据库”页面中新建了一个具体的数据库(比如 my_app_db)。 这里老师傅给你科普了一个常识:数据库软件 (DBMS) vs 数据库 (Database)

  • DBMS (PostgreSQL):就像是 Excel 软件本身。
  • Database:就像是 Excel 打开的一个个 .xlsx 文件。 安装一次 PostgreSQL 软件,可以创建无数个独立的数据库文件供不同的项目使用。

在数据库的"连接信息"里,你看到了两个主机名。老师傅告诉你,这决定了你怎么填 .env 里的 DATABASE_URL

容器网络

在 Docker 环境中配置连接字符串时,容易搞混 localhost 和容器名。老师傅强调,理解容器网络的关键是:localhost = 当前环境自己,容器名 = 同一 Docker 网络的邻居,127.0.0.1 = 主机的 localhost

  • 场景一:Node 项目通过 1Panel "运行环境" 启动(推荐) 此时你的项目运行在 Docker 容器里,数据库也在 Docker 容器里。它们互为邻居。 你应该填写 Docker 容器名(例如 postgresql1panel-postgres-x),而不是 localhost。这就好比在局域网里喊邻居的名字。
  • 场景二:在服务器终端手动调试 如果你 SSH 进服务器,在命令行里运行脚本。此时你是站在服务器主机上(Host)去访问容器。 你应该填写 **127.0.0.1 或者localhost **。因为数据库容器的端口映射到了主机的 localhost 上。填错连接字符串会导致连接失败,而这个错误很难排查,因为配置看起来没问题。

端口映射

老师傅告诉你,可以直接通过面板的运行环境功能快速部署 Node.js 项目。 你发现这上面的填空题——选择 node 版本、构建命令、环境变量等——竟然跟之前在 Vercel 上做的一模一样。 唯一的区别是:服务器需要先从 GitHub 拉取代码,然后你要配置端口映射并允许端口外部访问。

你之前很疑惑,为什么你的服务器只有一个公网 IP,却可以同时运行好几个都在内部监听 3000 端口的项目? 原来,Docker 为每个容器提供了隔离的网络环境

  • 你的应用 A 在容器里监听 3000。
  • 你的应用 B 在容器里监听 3000。 它们互不冲突。

当你部署时,通过端口映射技术:

  • 把服务器的 3001 端口 -> 映射到 应用 A 的 3000。
  • 把服务器的 3002 端口 -> 映射到 应用 B 的 3000。

这样,外部用户访问 IP:3001IP:3002 时,流量会被准确地转发给对应的容器。这就解决了端口冲突的问题,让一台服务器能同时跑多个应用。

你通过 http://IP:端口 成功访问到了服务器上的应用,但在面板绑定域名后却打不开。 原来是没有做 DNS 解析。你熟练地去域名服务商那里添加了一条 A 记录,指向服务器的公网 IP。

访问成功了,但浏览器显示一个巨大的"不安全"红色标志。

SSL 证书

老师傅告诉你需要申请 SSL 证书。于是你在面板的网站-证书设置里,一键申请了免费证书,并开启了 HTTPS。 看着地址栏的小绿锁,你终于完成了一次真正的全栈独立部署。

SRE 入门意识

看着服务器上稳定运行的应用,老师傅说:"现在你已经是半个运维工程师了。"

他向你介绍了 SRE(Site Reliability Engineering,站点可靠性工程) 的理念:用软件工程的思维解决运维问题

传统运维靠人手熬夜修故障,SRE靠自动化系统保持稳定。你现在已经掌握了基础:

  • 监控:通过日志和统计工具了解系统状态
  • 自动化:通过Docker一键部署、通过Git一键回滚
  • 容灾:通过备份和恢复策略保护数据

老师傅说:"SRE不是大厂的专利,而是每个产品都应该有的意识。你的产品哪怕只有一个用户,也应该可靠。"

这让你意识到,技术不仅是创造,更是守护。部署上线不是结束,而是长期责任的开始。

日志

部署完成几天后,有朋友告诉你页面打不开了。你赶紧自己访问,发现一切正常。你开始怀疑是不是朋友的问题,或者网络不稳定。

老师傅告诉你,不要猜,要看日志

日志是程序运行时自动记录的流水账。它记录了什么时间发生了什么,有没有报错,用户做了什么操作。就像飞机的黑匣子,出了事故可以调出来看看发生了什么。

在哪里看

如果你用的是无服务器部署平台,它们会提供网页版的日志查看界面。每次部署、每次用户请求、每次报错,都会被记录下来。你可以按时间筛选,按关键词搜索,很快就能找到问题所在。

如果你用的是自己的服务器,可以通过面板查看实时日志。日志会持续滚动,显示最新的运行状态。

看什么

新手看到日志可能一头雾水,全是密密麻麻的文字。老师傅告诉你,其实你只需要关注几个关键词:

第一个是错误这个词。日志里如果出现这个词,后面通常跟着具体的报错信息,告诉你哪里出了问题。

第二个是警告。虽然不是错误,但意味着有些地方可能有问题,建议你检查一下。

第三个是你自己写的日志。在开发时,你可以在关键位置加上一些说明,比如"用户开始注册了"、"数据库连接成功了"。这样出问题时,你能知道程序执行到了哪一步。

常见问题模式

老师傅总结了一些常见的日志模式:

如果看到"找不到模块",说明有些依赖包没装好,需要重新安装。

如果看到"连接被拒绝",通常是数据库连接失败,可能地址错了,或者数据库没启动。

如果看到"超时",说明某个操作太慢了,可能是网络问题,也可能是代码逻辑有问题。

遇到这些,你不需要自己硬着头皮分析,把日志里的关键信息复制下来,让 AI 帮你诊断。

日志不会永远保留。平台通常会保留几天到一个月,之后会自动删除。所以如果遇到了重要问题,记得及时把日志内容保存下来。而且,日志里可能包含敏感信息,你在分析日志时要小心,不要把这些内容截屏发到公开的地方。


本章小节

1. **14.1 VPS 选购指南 (./01-vps-selection.md)**
   主流云厂商对比、配置选择建议、机房位置选择、操作系统选择、购买注意事项。

2. **14.2 VPS 初始化与安全配置 (./02-vps-setup.md)**
   SSH 连接与密钥配置、安全组设置、1Panel 面板安装、服务器安全加固、日常维护常识。

3. **14.3-1 应用商店与 Docker 基础 (./03-1-docker-apps.md)**
   Docker 核心概念、1Panel 应用商店使用、容器管理、数据持久化、容器网络基础。

4. **14.3-2 部署 Next.js 应用 (./03-2-deploy-nextjs.md)**
   Node.js 运行环境配置、环境变量设置、数据库连接、构建与启动、端口映射与反向代理。

5. **14.3-3 部署静态网站 (./03-3-deploy-static.md)**
   Nginx 静态站点配置、文件上传、缓存策略、404 页面与路由配置、性能优化。

6. **14.3-4 部署前后端分离应用 (./03-4-deploy-fullstack.md)**
   多容器编排、服务间通信、反向代理与路由转发、环境变量管理、数据备份与迁移。

7. **14.4 配置域名与证书 (./04-domain-ssl.md)**
   DNS 解析配置、SSL 证书申请、HTTPS 强制跳转、证书自动续期、多域名配置。

8. **14.5 其他好玩的应用 (./05-cool-apps.md)**
   Umami 网站统计、n8n 自动化工作流、Outline 知识库、Nextcloud 文件存储、Uptime Kuma 监控告警。

上一章第十三章:域名、DNS 与 HTTPS

下一章第十五章:SEO、分享与数据统计