在经历了前几个阶段的“毛坯房装修”和环境搭建后,终于迎来了工程化实践的重头戏:打通 CI/CD 流水线 。
这是一次非常典型、硬核且充满戏剧性的“开发者实战之旅”。虽然在这个具体的电商爬虫项目上你选择了战略性放弃,但在短短的折腾过程中,你几乎把 Linux 运维、网络通信、Python 环境配置和爬虫反风控的经典“大坑”全踩了一遍,并且解决了其中 90% 的问题。
在使用 3X-UI 搭建代理节点时,很多朋友可能会遇到这样一个痛点: 因为 3X-UI 的 Vision 流控(xtls-rprx-vision)是需要在具体客户端上设置的,这就导致开启了 Vision 和未开启 Vision 的节点,被强制拆分成了不同的订阅链接。 当把它们导入到代理软件(比如 V2rayN)时,软件里会显示出多个不同的订阅分组,不仅观感杂乱,后期维护起来也极其不便。
🌐 核心架构设计:为什么这么做? # 过去使用一键翻墙脚本,脚本作者通常采用“霰弹枪策略”:在一个黑盒环境里强行塞入 10 多个协议节点,将其全部打包在一个 Sing-box 内核里。这种方式看似全面,但在 1GB 内存的入门级 VPS(虚拟专用服务器)上会产生严重的弊端:大量闲置进程白白吃掉宝贵的系统资源,且黑盒脚本会死锁底层网络逻辑,导致后续更新极易崩溃或丢失配置。
在经历了前面的基础环境搭建后,本任务我们将真正把后端服务暴露给公网。
在服务器部署的进阶之路上,部署限制内存的数据库是一个必经的关卡 。对于这种小内存的 VPS(比如 RackNerd),如果直接裸跑默认配置的 MySQL 8.0,它会一口气吞掉 400MB 甚至更多的内存,极易导致服务器 OOM(内存溢出)死机。
对于拥有海外小性能 VPS 的开发者来说,高物理延迟往往是绕不开的痛。如果还在使用传统的终端工具(如 FinalShell),忍受着 nano 或 vim 编辑长文本时吞换行、卡顿的折磨,那么 VS Code + Remote-SSH 绝对是救星。
📝 1. 背景与目标 # 在云服务器(VPS)上部署项目时,直接暴露端口既不安全也不优雅。本次实战的目标是:
折腾服务器,从“在宿主机上乱装一气”到“全面拥抱容器化” 。如何使用 Docker 和 Nginx,将纯前端项目托管到云服务器上,并实现公网访问 。
在拥有了一台属于自己的 VPS(如 1核 1G内存,配置了 2G Swap)后,很多新手在尝试部署 Java 项目时,往往会选择直接在服务器上安装 Maven 或运行 docker build。但现实很残酷:Java 编译极其消耗内存,1G 的内存在构建瞬间就会被挤爆,导致系统卡死或触发 OOM (Out Of Memory) 杀掉进程。

基础环境设置 # FROM:指定基础镜像 功能:这是每个 Dockerfile 的第一条指令(除注释外)。它决定了你的应用运行在什么环境之上。 示例:FROM ubuntu:24.04 (基于 Ubuntu 24.04 系统)或 FROM nginx:alpine (基于轻量级的 Nginx 镜像)。 WORKDIR:设置工作目录 功能:相当于 Linux 里的 cd 命令。后续的 RUN、CMD、COPY 等指令都会在这个目录下执行。如果目录不存在,Docker 会自动帮你创建。 示例:WORKDIR /app (将后续操作的默认路径设为容器内的 /app 目录)。 2. 文件复制 # COPY:复制文件/目录到容器中 功能:将宿主机(你的电脑或服务器)上的文件或目录,原封不动地拷贝到容器的指定路径下。 示例:COPY . /app (将当前宿主机目录下的所有文件,复制到容器的 /app 目录下)。 ADD:高级复制 功能:和 COPY 类似,但带有额外功能。如果复制的是一个本地的 .tar.gz 压缩包,ADD 会自动解压到目标路径;它也支持填入一个网络 URL 来下载文件。(新手推荐优先使用 COPY,语义更清晰)。 3. 执行命令与配置 # RUN:在构建镜像时执行命令 功能:这是构建阶段的主力军。通常用来安装软件包、创建文件夹、配置环境等。注意:每次 RUN 都会生成一个新的镜像层,所以通常会把多条命令用 && 连起来写。 示例:RUN apt-get update && apt-get install -y curl。 ENV:设置环境变量 功能:定义环境变量,后续的 RUN 指令可以使用,并且这些变量也会一直保留到容器运行阶段供你的程序读取。 示例:ENV MYSQL_ROOT_PASSWORD=my-secret-pw 或 ENV PORT=8080。 EXPOSE:声明监听端口 功能:这只是一个声明,告诉使用这个镜像的人,该容器内部的程序会使用哪个端口。它不会自动将端口映射到宿主机,映射依然需要在运行 docker run 时加上 -p 参数或在 docker-compose.yml 中配置。 示例:EXPOSE 80 (声明容器内的 Web 服务使用 80 端口)。 4. 容器启动指令 # CMD:容器启动时的默认命令 功能:指定容器跑起来之后要做的第一件事(例如启动 Nginx、运行 Java 后端应用等)。如果用户在 docker run 时手动指定了其他命令,CMD 的内容会被覆盖。 示例:CMD ["nginx", "-g", "daemon off;"]。 ENTRYPOINT:容器启动的主入口 功能:和 CMD 类似,但它不会被轻易覆盖。通常用于让容器表现得像一个独立的可执行程序。如果同时存在 ENTRYPOINT 和 CMD,CMD 的内容会作为参数传递给 ENTRYPOINT。 综合示例 # 为了方便理解,这里提供一个部署简单前端/静态网页的通用 Dockerfile 模板:
方案一:Windows 不装 Docker # 这种方式下,你的 Windows 只负责写代码和生成基础的打包文件,镜像的构建全在服务器上。