<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Helen</id>
	<title>md5.pw - 用户贡献 [zh]</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Helen"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Helen"/>
	<updated>2026-05-19T08:34:29Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1551</id>
		<title>零基础入门：VPS Docker 部署与容器网络全指南（端口映射 / 反向代理 / 持久化）</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1551"/>
		<updated>2026-03-13T04:35:07Z</updated>

		<summary type="html">&lt;p&gt;Helen：​Docker部署及容器网络指南（端口映射、反向代理、持久化、注意事项）&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;对于刚接触 VPS（虚拟专用服务器）的新手来说，如何在服务器上部署各种好玩的应用（如博客、网盘、密码管理器等）是一个蛮大的挑战。传统的部署方式需要手动配置运行环境（如 PHP、Node.js、数据库），不仅繁琐，而且极易因为环境冲突导致系统崩溃。&lt;br /&gt;
&lt;br /&gt;
Docker 的出现彻底改变了这一现状。 你可以把 Docker 想象成港口里的“集装箱”。无论里面装的是什么货物（Web 应用、数据库、缓存），都用标准化的集装箱打包好。船只（你的 VPS）不需要关心里面装了什么，只需要提供放置集装箱的空间即可。这种“隔离”和“开箱即用”的特性，让部署服务变得像搭积木一样简单。&lt;br /&gt;
&lt;br /&gt;
接下来的内容会为你提供一份保姆级的 Docker 部署指南，深入浅出地讲解 Docker 安装、网络配置、端口映射、反向代理以及数据持久化等核心知识，带你玩转 VPS 部署。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 一、 环境准备与 Docker 基础部署 ==&lt;br /&gt;
在开始之前，请确保你已经通过 SSH 连接到了你的 VPS，并且使用的是一台基于 Linux（推荐 Ubuntu 20.04/22.04 或 Debian 11/12）的操作系统。&lt;br /&gt;
&lt;br /&gt;
=== 1.1 更新系统环境 ===&lt;br /&gt;
在安装任何新软件之前，保持系统软件包的最新是一个良好的习惯。请依次执行以下命令：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 更新软件包列表并升级已有软件&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br /&gt;
 &lt;br /&gt;
 # 安装一些必备的系统工具&lt;br /&gt;
 sudo apt install curl wget vim git iptables -y&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[File:Image1654.png|thumb|500x500px]]&lt;br /&gt;
![[File:Image1655.png|thumb|500x500px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 1.2 一键安装 Docker 与 Docker Compose ===&lt;br /&gt;
早年间安装 Docker 需要配置许多依赖和密钥，现在官方提供了一键安装脚本，极大地方便了新手。Docker Compose 则是 Docker 的一个编排工具，它允许我们使用一个 &amp;lt;code&amp;gt;YAML&amp;lt;/code&amp;gt; 文件来定义和运行多个容器，这是目前最推荐的部署方式。&lt;br /&gt;
&lt;br /&gt;
执行以下命令即可全自动安装 Docker 以及 Docker Compose 插件：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 下载官方一键安装脚本&lt;br /&gt;
 curl -fsSL &amp;lt;nowiki&amp;gt;https://get.docker.com&amp;lt;/nowiki&amp;gt; -o get-docker.sh&lt;br /&gt;
 &lt;br /&gt;
 # 执行脚本进行安装（如果是国内服务器，可能需要配置镜像源，海外 VPS 直接运行即可）&lt;br /&gt;
 sudo sh get-docker.sh&lt;br /&gt;
 &lt;br /&gt;
 # 启动 Docker 服务并设置开机自启&lt;br /&gt;
 sudo systemctl start docker&lt;br /&gt;
 sudo systemctl enable docker&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[File:Image1656.png|thumb|400x400px]]&lt;br /&gt;
![[File:Image1657.png|thumb|400x400px]]&lt;br /&gt;
![[File:Image1658.png|thumb|400x400px]]&lt;br /&gt;
|}&lt;br /&gt;
验证是否安装成功：&lt;br /&gt;
 &amp;lt;# 查看 Docker 版本&lt;br /&gt;
 docker --version&lt;br /&gt;
 # 输出示例：Docker version 29.2.1, build a5c7197&lt;br /&gt;
 &lt;br /&gt;
 # 查看 Docker Compose 版本&lt;br /&gt;
 docker compose version&lt;br /&gt;
 # 输出示例：Docker Compose version v5.0.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:Image1659.png|center|thumb|991x991px]]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;提示： 如果你是以普通用户身份登录，每次运行 &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; 都需要加 &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;，你可以通过命令 &amp;lt;code&amp;gt;sudo usermod -aG docker $USER&amp;lt;/code&amp;gt; 将当前用户加入 docker 组，退出重新登录后即可免 sudo 执行 docker 命令。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 二、 核心概念：数据持久化 (Volumes) ==&lt;br /&gt;
新手最容易犯的一个致命错误是：把容器当成了虚拟机，把数据直接写在容器内部。&lt;br /&gt;
&lt;br /&gt;
容器被设计为“用完即焚”的短暂存在。当你更新容器或删除容器重新创建时，容器内部的一切数据（比如博客的文章、数据库的记录）都会灰飞烟灭。因此，我们需要使用**数据持久化（Data Persistence）**技术。&lt;br /&gt;
&lt;br /&gt;
这就好比你租了一个酒店房间（容器），你不能把自己的贵重物品（数据）砌进酒店的墙里，而是应该放在自己的行李箱（持久化目录）里。换房间时，行李箱提走即可。&lt;br /&gt;
&lt;br /&gt;
=== 2.1 常见的两种挂载方式 ===&lt;br /&gt;
&lt;br /&gt;
# Bind Mounts（绑定挂载）：将宿主机（你的 VPS）上的绝对路径目录，直接映射到容器内的某个目录。&lt;br /&gt;
#* &#039;&#039;优点&#039;&#039;：非常直观，你可以直接在 VPS 上用 &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; 命令进入目录修改文件。&lt;br /&gt;
#* &#039;&#039;适用场景&#039;&#039;：配置文件的修改、新手入门。&lt;br /&gt;
# Volumes（命名卷）：由 Docker 完全管理的存储空间，存放在宿主机的一个神秘位置（通常在 &amp;lt;code&amp;gt;/var/lib/docker/volumes/&amp;lt;/code&amp;gt;）。&lt;br /&gt;
#* &#039;&#039;优点&#039;&#039;：安全性高，跨平台兼容性好。&lt;br /&gt;
#* &#039;&#039;适用场景&#039;&#039;：数据库的数据文件存放。&lt;br /&gt;
&lt;br /&gt;
=== 2.2 实战举例：持久化部署一个 MySQL ===&lt;br /&gt;
我们通过 &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; 文件来演示如何进行目录挂载。创建一个目录并编写配置：&lt;br /&gt;
 &amp;lt;code&amp;gt;mkdir -p ~/mysql-test &amp;amp;&amp;amp; cd ~/mysql-test&lt;br /&gt;
 nano docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1660.png|center|thumb|974x974px]]&lt;br /&gt;
填入以下内容：&lt;br /&gt;
 &amp;lt;code&amp;gt;&#039;&#039;&#039;version&#039;&#039;&#039;: &#039;3.8&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;services&#039;&#039;&#039;:&lt;br /&gt;
   &#039;&#039;&#039;db&#039;&#039;&#039;:&lt;br /&gt;
     &#039;&#039;&#039;image&#039;&#039;&#039;: mysql:8.0&lt;br /&gt;
     &#039;&#039;&#039;container_name&#039;&#039;&#039;: my_mysql&lt;br /&gt;
     &#039;&#039;&#039;restart&#039;&#039;&#039;: always&lt;br /&gt;
     &#039;&#039;&#039;environment&#039;&#039;&#039;:&lt;br /&gt;
       &#039;&#039;&#039;MYSQL_ROOT_PASSWORD&#039;&#039;&#039;: my_secure_password&lt;br /&gt;
       &#039;&#039;&#039;MYSQL_DATABASE&#039;&#039;&#039;: my_database&lt;br /&gt;
     &#039;&#039;&#039;volumes&#039;&#039;&#039;:&lt;br /&gt;
       # 【关键点：这里就是数据持久化】&lt;br /&gt;
       # 冒号左边是宿主机目录（./data代表当前目录下的data文件夹）&lt;br /&gt;
       # 冒号右边是容器内的默认数据路径&lt;br /&gt;
       - ./data:/var/lib/mysql&lt;br /&gt;
       - ./config/my.cnf:/etc/mysql/my.cnf&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1662.png|center|thumb|969x969px]]&lt;br /&gt;
保存并运行：&lt;br /&gt;
 &amp;lt;code&amp;gt;&#039;&#039;&#039;docker compose up -d&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1663.png|center|thumb|978x978px]]&lt;br /&gt;
此时，即使你执行 &amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt; 删除了这个容器，只要 &amp;lt;code&amp;gt;~/mysql-test/data&amp;lt;/code&amp;gt; 文件夹还在，下次启动时所有的数据库内容依然完好无损！&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 三、 容器网络与端口映射 (Port Mapping) ==&lt;br /&gt;
理解端口映射，是掌控 Docker 部署的灵魂。&lt;br /&gt;
&lt;br /&gt;
=== 3.1 为什么需要端口映射？ ===&lt;br /&gt;
默认情况下，Docker 里的容器运行在一个独立的虚拟网络中。你可以把它想象成 VPS 内部的一栋“大楼”。VPS 宿主机有一个公网 IP（外界能访问的门牌号），但大楼里的容器只有内部 IP（比如 &amp;lt;code&amp;gt;172.17.0.2&amp;lt;/code&amp;gt;），外界是进不去的。&lt;br /&gt;
&lt;br /&gt;
如果容器里运行了一个网页服务器（监听容器的 80 端口），我们要让外界通过 VPS 的公网 IP 访问到它，就需要在大堂设立一个“前台转发”，把对宿主机某个端口的访问，直接引流到容器的对应端口。&lt;br /&gt;
&lt;br /&gt;
=== 3.2 端口映射的语法与陷阱 ===&lt;br /&gt;
在 &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; 命令中，使用 &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; 参数；在 Compose 文件中，使用 &amp;lt;code&amp;gt;ports&amp;lt;/code&amp;gt; 字段。 基本语法为：&amp;lt;code&amp;gt;宿主机端口:容器内端口&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==== 示例解析： ====&lt;br /&gt;
     &amp;lt;code&amp;gt;ports:&lt;br /&gt;
       - &amp;quot;8080:80&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
这表示：将 VPS 宿主机的 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; 端口，映射到该容器的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; 端口。当你在浏览器输入 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://你的公网IP:8080&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 时，你实际访问的是容器内的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; 端口。&lt;br /&gt;
&lt;br /&gt;
==== 新手常见安全陷阱：UFW 防火墙失效 ====&lt;br /&gt;
在 Ubuntu 等系统上，大家习惯用 &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; 来配置防火墙。但 Docker 的端口映射会直接修改 iptables 规则，优先级高于 UFW！ 这意味着，如果你映射了 &amp;lt;code&amp;gt;-p 3306:3306&amp;lt;/code&amp;gt;（公开数据库端口），即使你在 UFW 里设置了 &amp;lt;code&amp;gt;ufw deny 3306&amp;lt;/code&amp;gt;，外界依然可以直接连上你的数据库，非常危险！&lt;br /&gt;
&lt;br /&gt;
正确做法（本地绑定）： 如果这个端口你打算稍后用反向代理来处理，不需要直接暴露给全世界，应该这样写：&lt;br /&gt;
     &amp;lt;code&amp;gt;ports:&lt;br /&gt;
       - &amp;quot;127.0.0.1:8080:80&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
加上 &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;/code&amp;gt; 前缀后，这个 8080 端口将只允许 VPS 本地访问，彻底切断了外界直接通过 IP 访问的路径，极大提升了安全性。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 四、 进阶必学：反向代理入门与实战 (Nginx Proxy Manager) ==&lt;br /&gt;
新手往往会在端口上产生困扰：“我部署了博客用了 8080 端口，部署了相册用了 8081 端口，部署了网盘用了 8082 端口……我怎么可能记住这么多端口号？而且浏览器上带端口号显得很不专业，也没有 HTTPS 小绿锁！”&lt;br /&gt;
&lt;br /&gt;
这时候，反向代理（Reverse Proxy） 就登场了。&lt;br /&gt;
&lt;br /&gt;
反向代理就像是一家大公司的“总机接线员”。它独自霸占着 VPS 的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; (HTTP) 和 &amp;lt;code&amp;gt;443&amp;lt;/code&amp;gt; (HTTPS) 端口。 当你访问 &amp;lt;code&amp;gt;blog.yourdomain.com&amp;lt;/code&amp;gt; 时，总机一看域名，直接内部转接给 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; 端口的容器； 当你访问 &amp;lt;code&amp;gt;cloud.yourdomain.com&amp;lt;/code&amp;gt; 时，内部转接给 &amp;lt;code&amp;gt;8082&amp;lt;/code&amp;gt; 端口的容器。&lt;br /&gt;
&lt;br /&gt;
业界最适合新手的一款可视化反向代理工具叫 Nginx Proxy Manager (简称 NPM)。&lt;br /&gt;
&lt;br /&gt;
=== 4.1 部署 Nginx Proxy Manager ===&lt;br /&gt;
创建一个目录并编写 Compose 文件：&lt;br /&gt;
 &amp;lt;code&amp;gt;mkdir -p ~/npm &amp;amp;&amp;amp; cd ~/npm&lt;br /&gt;
 nano docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1664.png|center|thumb|978x978px]]&lt;br /&gt;
填入以下内容：&lt;br /&gt;
 &amp;lt;code&amp;gt;&#039;&#039;&#039;version&#039;&#039;&#039;: &#039;3.8&#039;&lt;br /&gt;
 &#039;&#039;&#039;services&#039;&#039;&#039;:&lt;br /&gt;
   &#039;&#039;&#039;app&#039;&#039;&#039;:&lt;br /&gt;
     &#039;&#039;&#039;image&#039;&#039;&#039;: &#039;jc21/nginx-proxy-manager:latest&#039;&lt;br /&gt;
     &#039;&#039;&#039;container_name&#039;&#039;&#039;: npm_app&lt;br /&gt;
     &#039;&#039;&#039;restart&#039;&#039;&#039;: unless-stopped&lt;br /&gt;
     &#039;&#039;&#039;ports&#039;&#039;&#039;:&lt;br /&gt;
       # NPM 本身需要监听外部的 80 和 443 端口&lt;br /&gt;
       - &#039;80:80&#039;&lt;br /&gt;
       - &#039;443:443&#039;&lt;br /&gt;
       # 这个是 NPM 的 Web 后台管理界面端口&lt;br /&gt;
       - &#039;81:81&#039;&lt;br /&gt;
     &#039;&#039;&#039;volumes&#039;&#039;&#039;:&lt;br /&gt;
       - ./data:/data&lt;br /&gt;
       - ./letsencrypt:/etc/letsencrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1665.png|center|thumb|978x978px]]&lt;br /&gt;
启动 NPM：&lt;br /&gt;
 &amp;lt;code&amp;gt;&#039;&#039;&#039;docker compose up -d&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.2 配置反向代理与申请 SSL 证书 ===&lt;br /&gt;
&lt;br /&gt;
# 浏览器访问 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://你的VPS_IP:81&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 进入后台管理界面。&lt;br /&gt;
# 默认账号：&amp;lt;code&amp;gt;admin@example.com&amp;lt;/code&amp;gt; （填你自己cloudflare账号邮箱），密码：&amp;lt;code&amp;gt;changeme(改成你自己记得住的密码)&amp;lt;/code&amp;gt;[[File:Image1666.png|center|thumb|1037x1037px]]&lt;br /&gt;
# 去你的域名服务商（如 Cloudflare, 阿里云, 腾讯云）处，将你的子域名（例如 &amp;lt;code&amp;gt;npm.yourdomain.com&amp;lt;/code&amp;gt;）解析（A记录）到你的 VPS 公网 IP 上。[[File:Image1667.png|center|thumb|978x978px]]&lt;br /&gt;
# 在 NPM 后台点击 &amp;lt;code&amp;gt;Hosts&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Proxy Hosts&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Add Proxy Host&amp;lt;/code&amp;gt;。&lt;br /&gt;
#* Domain Names: 填入你的域名 &amp;lt;code&amp;gt;npm.yourdomain.com&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Forward Hostname / IP: 填入你服务器内部的应用 IP。如果你的docker和 NPM 在同一台 VPS 上，这里通常填入宿主机内网 IP（例如 &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt; 或者你的网卡内网IP、也可以直接填这台服务器的公网IP）。&lt;br /&gt;
#* Forward Port: 填入你npm容器暴露的端口（例如 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;）。&lt;br /&gt;
#* 勾选 &amp;lt;code&amp;gt;Block Common Exploits&amp;lt;/code&amp;gt;。[[File:Image1668.png|center|thumb|1032x1032px]]&lt;br /&gt;
# 点击顶部的 &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt; 选项卡：&lt;br /&gt;
#* SSL Certificate 下拉选择 &amp;lt;code&amp;gt;Request a new SSL Certificate&amp;lt;/code&amp;gt;。&lt;br /&gt;
#* 勾选 &amp;lt;code&amp;gt;Force SSL&amp;lt;/code&amp;gt;（强制 HTTPS）。&lt;br /&gt;
#* 输入邮箱，同意条款，点击 &amp;lt;code&amp;gt;Save&amp;lt;/code&amp;gt;。&lt;br /&gt;
[[File:Image1669.png|center|thumb|1027x1027px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
等待十几秒钟，申请成功后，你就可以直接通过 &amp;lt;code&amp;gt;https://npm&amp;lt;nowiki/&amp;gt;.yourdomain.com&amp;lt;/code&amp;gt; 极其优雅地访问你的服务了！不仅没有难看的端口号，还附带了安全的 HTTPS 加密连接。&lt;br /&gt;
[[File:Image1670.png|center|thumb|1030x1030px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 五、 新手避坑与日常运维注意事项 ==&lt;br /&gt;
成功部署只是第一步，良好的运维习惯才能保证服务的长期稳定运行。以下总结了 VPS 新手在使用 Docker 时最容易踩坑的几个注意事项：&lt;br /&gt;
&lt;br /&gt;
=== 5.1 资源管理与清理（防止硬盘爆满） ===&lt;br /&gt;
容器频繁更新会产生大量的“悬空镜像”（dangling images），这些无用的文件会静悄悄地吃掉你 VPS 可怜的硬盘空间，最终导致数据库损坏或系统死机。&lt;br /&gt;
&lt;br /&gt;
定期执行清理命令（安全操作）：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 清理所有停止的容器、未被使用的网络和悬空镜像&lt;br /&gt;
 docker &#039;&#039;&#039;system&#039;&#039;&#039; prune -f&lt;br /&gt;
 &lt;br /&gt;
 # 如果你的硬盘空间极其紧张，还可以清理所有未被使用的镜像（慎用，会删掉你暂时没运行的镜像，下次需要重新下载）&lt;br /&gt;
 docker &#039;&#039;&#039;system&#039;&#039;&#039; prune -&#039;&#039;&#039;a&#039;&#039;&#039; -f&amp;lt;/code&amp;gt;&lt;br /&gt;
建议将此命令加入 Linux 的 &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; 计划任务中，每周自动执行一次。&lt;br /&gt;
&lt;br /&gt;
=== 5.2 查看日志排错 ===&lt;br /&gt;
如果你启动容器后，发现网页打不开，或者容器一直处于 Restarting 状态，不要慌张。日志是解决一切问题的根源。&lt;br /&gt;
 &amp;lt;code&amp;gt;# 查看某个容器的实时日志（把容器名替换为你自己的）&lt;br /&gt;
 docker logs -f 容器名称或ID&lt;br /&gt;
 &lt;br /&gt;
 # 如果日志太多，只看最后100行&lt;br /&gt;
 docker logs --tail 100 -f 容器名称或ID&amp;lt;/code&amp;gt;&lt;br /&gt;
通常日志里的 &amp;lt;code&amp;gt;ERROR&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;FATAL&amp;lt;/code&amp;gt; 级别的信息，能直接告诉你是因为权限不对、端口冲突还是数据库连不上等原因。复制报错信息去 Google，能解决 99% 的问题。&lt;br /&gt;
&lt;br /&gt;
=== 5.3 备份策略： ===&lt;br /&gt;
虽然我们把数据挂载到了宿主机（比如前文演示的 &amp;lt;code&amp;gt;./data&amp;lt;/code&amp;gt; 目录），但这不代表数据绝对安全。如果你的 VPS 欠费被删机器、或者硬盘发生了物理损坏，数据依然会丢失。&lt;br /&gt;
&lt;br /&gt;
极简备份思路： 只需要打包备份你挂载的持久化目录即可。例如：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 将 NPM 的数据目录打包成压缩文件&lt;br /&gt;
 tar -czvf npm_backup_20231024.tar.gz /root/npm/data /root/npm/letsencrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
随后，利用 &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;rsync&amp;lt;/code&amp;gt; 或配置自动化脚本（如 Rclone）将这个压缩包定期上传到你的 Google Drive、OneDrive 或另一台服务器上。只要这份配置和数据文件在，无论换哪台机器，拉取镜像 -&amp;gt; 解压目录 -&amp;gt; 执行 &amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;，你的服务能在两分钟内满血复活。&lt;br /&gt;
&lt;br /&gt;
=== 5.4 容器更新升级 ===&lt;br /&gt;
很多新手部署完之后，几年的时间都不去更新应用版本。在 Docker 中更新容器其实非常简单，无需破坏任何数据：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 1. 进入你的 docker-compose.yml 所在目录&lt;br /&gt;
 cd ~/你的应用目录&lt;br /&gt;
 &lt;br /&gt;
 # 2. 拉取最新的镜像文件&lt;br /&gt;
 docker compose pull&lt;br /&gt;
 &lt;br /&gt;
 # 3. 重新创建并启动容器（自动替换旧容器，数据因为挂载在外部不受影响）&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # 4. 清理残留的旧版本镜像&lt;br /&gt;
 docker image prune -f&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 结语 ==&lt;br /&gt;
从刚接触黑乎乎的命令行终端，到熟练运用 Docker 部署各类服务，这是一个充满成就感的过程。&lt;br /&gt;
&lt;br /&gt;
记住，Docker 的核心理念就是&#039;&#039;&#039;“环境隔离”和“数据分离”&#039;&#039;&#039;。理解了端口映射让你明白数据怎么流转，理解了反向代理让你懂得如何优雅地对外提供服务，理解了持久化挂载让你不再畏惧重装与迁移。&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1670.png&amp;diff=1550</id>
		<title>File:Image1670.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1670.png&amp;diff=1550"/>
		<updated>2026-03-13T04:30:38Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1669&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1669.png&amp;diff=1549</id>
		<title>File:Image1669.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1669.png&amp;diff=1549"/>
		<updated>2026-03-13T04:29:56Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1669&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1668.png&amp;diff=1547</id>
		<title>File:Image1668.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1668.png&amp;diff=1547"/>
		<updated>2026-03-13T04:29:12Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1668&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1667.png&amp;diff=1546</id>
		<title>File:Image1667.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1667.png&amp;diff=1546"/>
		<updated>2026-03-13T04:27:14Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1667&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1666.png&amp;diff=1545</id>
		<title>File:Image1666.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1666.png&amp;diff=1545"/>
		<updated>2026-03-13T04:25:21Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1666&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1665.png&amp;diff=1544</id>
		<title>File:Image1665.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1665.png&amp;diff=1544"/>
		<updated>2026-03-13T04:24:04Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1665&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1664.png&amp;diff=1543</id>
		<title>File:Image1664.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1664.png&amp;diff=1543"/>
		<updated>2026-03-13T04:23:35Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image1664&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1663.png&amp;diff=1542</id>
		<title>File:Image1663.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1663.png&amp;diff=1542"/>
		<updated>2026-03-13T04:22:05Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1663&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1662.png&amp;diff=1541</id>
		<title>File:Image1662.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1662.png&amp;diff=1541"/>
		<updated>2026-03-13T04:21:02Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;e1662&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1660.png&amp;diff=1540</id>
		<title>File:Image1660.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1660.png&amp;diff=1540"/>
		<updated>2026-03-13T04:08:51Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1660&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1659.png&amp;diff=1539</id>
		<title>File:Image1659.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1659.png&amp;diff=1539"/>
		<updated>2026-03-13T04:07:19Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1659&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1658.png&amp;diff=1538</id>
		<title>File:Image1658.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1658.png&amp;diff=1538"/>
		<updated>2026-03-13T04:05:57Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;e1658&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1657.png&amp;diff=1537</id>
		<title>File:Image1657.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1657.png&amp;diff=1537"/>
		<updated>2026-03-13T04:05:33Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1657&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1656.png&amp;diff=1536</id>
		<title>File:Image1656.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1656.png&amp;diff=1536"/>
		<updated>2026-03-13T04:05:08Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1655.png&amp;diff=1535</id>
		<title>File:Image1655.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1655.png&amp;diff=1535"/>
		<updated>2026-03-13T04:03:58Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:Image1654.png&amp;diff=1534</id>
		<title>File:Image1654.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:Image1654.png&amp;diff=1534"/>
		<updated>2026-03-13T04:02:01Z</updated>

		<summary type="html">&lt;p&gt;Helen：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%88%A9%E7%94%A8_Rclone_%2B_Crontab_%E5%AE%9E%E7%8E%B0_Google_Drive_/_OneDrive_%E8%87%AA%E5%8A%A8%E5%BC%82%E5%9C%B0%E5%A4%87%E4%BB%BD&amp;diff=1400</id>
		<title>利用 Rclone + Crontab 实现 Google Drive / OneDrive 自动异地备份</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%88%A9%E7%94%A8_Rclone_%2B_Crontab_%E5%AE%9E%E7%8E%B0_Google_Drive_/_OneDrive_%E8%87%AA%E5%8A%A8%E5%BC%82%E5%9C%B0%E5%A4%87%E4%BB%BD&amp;diff=1400"/>
		<updated>2026-02-14T09:35:25Z</updated>

		<summary type="html">&lt;p&gt;Helen：​利用 Rclone + Crontab 实现 Google Drive / OneDrive 自动异地备份&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
对于 VPS 用户来说，最担心的事情莫过于服务器硬盘损坏（最近有服务器商家就发生了被黑客入侵，导致硬盘数据全部被清除的事件），或者是自己手滑误删了数据库。&lt;br /&gt;
&lt;br /&gt;
搬瓦工提供的快照（Snapshot）虽然好用，但它通常保存在服务商的机房内。如果机房发生灾难性故障（如机房火灾、账号被封），快照也会随之消失。虽然这种可能性很小，但我们还是要小心，而异地备份是数据安全的最后一道防线。&lt;br /&gt;
&lt;br /&gt;
这篇教程将教你使用 Linux 下的 Rclone，配合 Crontab 定时任务，将 VPS 上的关键数据（如 Docker 挂载目录、网站代码、数据库）自动打包并上传到你的 Google Drive 或 OneDrive 网盘中。&lt;br /&gt;
&lt;br /&gt;
== 准备工作 ==&lt;br /&gt;
&lt;br /&gt;
* VPS 一台：Debian / Ubuntu / CentOS 均可（本文以 Debian/Ubuntu 为例）。&lt;br /&gt;
* 网盘账号：Google Drive（建议 15G 免费版或无限容量团队盘）或 OneDrive。&lt;br /&gt;
* 本地电脑：你需要在一台有浏览器的电脑（Windows/Mac）上下载 Rclone，用于获取授权 Token（因为 VPS 没有浏览器）。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 第一步：安装 Rclone ==&lt;br /&gt;
Rclone 官方提供了一键安装脚本，非常方便。在你的 VPS 终端中执行以下命令：&lt;br /&gt;
&lt;br /&gt;
Bash&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo -v ; curl &amp;lt;nowiki&amp;gt;https://rclone.org/install.sh&amp;lt;/nowiki&amp;gt; | sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
安装完成后，输入 &amp;lt;code&amp;gt;rclone --version&amp;lt;/code&amp;gt;，如果能看到版本号，说明安装成功。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 第二步：配置 Rclone 连接网盘（关键步骤） ==&lt;br /&gt;
这是最容易卡住的一步。因为 VPS 是没有浏览器的，无法直接弹出网页进行授权，所以我们需要采用 &#039;&#039;&#039;“远程授权”&#039;&#039;&#039; 的方式。&lt;br /&gt;
&lt;br /&gt;
=== 1. 在 VPS 上发起配置 ===&lt;br /&gt;
在 VPS 终端输入：&lt;br /&gt;
 &amp;lt;code&amp;gt;rclone config&amp;lt;/code&amp;gt;&lt;br /&gt;
按照以下交互提示进行操作（以 Google Drive 为例）：&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (New remote) -&amp;gt; 回车。&lt;br /&gt;
# name: 输入网盘别名，例如 &amp;lt;code&amp;gt;gdrive&amp;lt;/code&amp;gt; -&amp;gt; 回车。&lt;br /&gt;
# Storage: 找到 Google Drive 的编号（通常是 &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; 左右，或者是输入 &amp;lt;code&amp;gt;drive&amp;lt;/code&amp;gt;） -&amp;gt; 回车。&lt;br /&gt;
# client_id: 留空，直接回车（使用默认）。&lt;br /&gt;
# client_secret: 留空，直接回车。&lt;br /&gt;
# Scope: 选择 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (Full access) -&amp;gt; 回车。&lt;br /&gt;
# service_account_file: 留空，直接回车。&lt;br /&gt;
# Use auto config?: &#039;&#039;&#039;这里非常重要！一定要选 &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (No)&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
此时，VPS 终端会显示一段很长的命令，类似 &amp;lt;code&amp;gt;rclone authorize &amp;quot;drive&amp;quot; &amp;quot;xxxxxxxx...&amp;quot;&amp;lt;/code&amp;gt;。复制这段命令。&lt;br /&gt;
&lt;br /&gt;
=== 2. 在本地电脑上获取 Token ===&lt;br /&gt;
&lt;br /&gt;
# 在你的Windows 或 Mac 电脑上下载 Rclone (官方下载地址)。&lt;br /&gt;
# 解压后，在文件夹内打开 CMD (Windows) 或 终端 (Mac)。&lt;br /&gt;
# 粘贴刚才从 VPS 上复制的那段命令并回车。&lt;br /&gt;
# 此时浏览器会自动跳出，登录你的 Google 账号并点击“允许”。&lt;br /&gt;
# 回到本地电脑的 CMD/终端窗口，你会看到一段生成的 config token。复制这段 Token。&lt;br /&gt;
&lt;br /&gt;
=== 3. 回到 VPS 完成配置 ===&lt;br /&gt;
&lt;br /&gt;
# 将 Token 粘贴到 VPS 的终端里 -&amp;gt; 回车。&lt;br /&gt;
# Configure this as a team drive?: 如果是个人盘选 &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;，团队盘选 &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 最后确认配置信息，输入 &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (Yes, this is OK)。&lt;br /&gt;
# 输入 &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; 退出配置界面。&lt;br /&gt;
&lt;br /&gt;
=== 4. 验证连接 ===&lt;br /&gt;
输入以下命令，查看网盘根目录下的文件列表。如果能列出文件，说明连接成功。&lt;br /&gt;
 &amp;lt;code&amp;gt;# gdrive 是你刚才设置的名字&lt;br /&gt;
 &#039;&#039;&#039;rclone lsd gdrive&#039;&#039;&#039;:&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 第三步：编写自动备份脚本 ==&lt;br /&gt;
我们不能只靠一条命令备份，建议写一个 Shell 脚本，完成&#039;&#039;&#039;“打包压缩 -&amp;gt; 上传 -&amp;gt; 清理旧备份”&#039;&#039;&#039;的全流程。&lt;br /&gt;
&lt;br /&gt;
创建脚本文件：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 创建目录存放脚本&lt;br /&gt;
 mkdir -p /root/scripts&lt;br /&gt;
 vim /root/scripts/backup.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
在 Vim 中粘贴以下内容（请根据注释修改你的配置）：&lt;br /&gt;
 &amp;lt;code&amp;gt;#!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 # ================= 配置区域 =================&lt;br /&gt;
 &lt;br /&gt;
 # 1. 备份名称（建议用日期）&lt;br /&gt;
 BACKUP_DATE=$(date +%Y%m%d_%H%M)&lt;br /&gt;
 ARCHIVE_NAME=&amp;quot;backup_${BACKUP_DATE}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # 2. 需要备份的本地目录（多个目录用空格隔开）&lt;br /&gt;
 # 例如：备份 /opt/stacks (Dockge数据) 和 /var/www/html (网站数据)&lt;br /&gt;
 SOURCE_DIRS=&amp;quot;/opt/stacks /var/www/html&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # 3. Rclone 远程配置名称:网盘内的文件夹路径&lt;br /&gt;
 # 这里表示上传到 gdrive 网盘的 vps_backup 文件夹下&lt;br /&gt;
 REMOTE_DIR=&amp;quot;gdrive:vps_backup&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # 4. 临时存放目录&lt;br /&gt;
 TEMP_DIR=&amp;quot;/root/backup_temp&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # ===========================================&lt;br /&gt;
 &lt;br /&gt;
 # 创建临时目录&lt;br /&gt;
 mkdir -p &amp;quot;$TEMP_DIR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;[$(date)] 开始备份...&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # 1. 打包压缩&lt;br /&gt;
 # 使用 tar 命令将源目录打包到临时目录&lt;br /&gt;
 tar -czPf &amp;quot;$TEMP_DIR/$ARCHIVE_NAME&amp;quot; $SOURCE_DIRS&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; [ $? -eq 0 ]; &#039;&#039;&#039;then&#039;&#039;&#039;&lt;br /&gt;
     echo &amp;quot;[$(date)] 打包成功: $ARCHIVE_NAME&amp;quot;&lt;br /&gt;
 &#039;&#039;&#039;else&#039;&#039;&#039;&lt;br /&gt;
     echo &amp;quot;[$(date)] 打包失败！&amp;quot;&lt;br /&gt;
     exit 1&lt;br /&gt;
 &#039;&#039;&#039;fi&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # 2. 上传到网盘&lt;br /&gt;
 # 使用 copy 命令上传&lt;br /&gt;
 rclone copy &amp;quot;$TEMP_DIR/$ARCHIVE_NAME&amp;quot; &amp;quot;$REMOTE_DIR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; [ $? -eq 0 ]; &#039;&#039;&#039;then&#039;&#039;&#039;&lt;br /&gt;
     echo &amp;quot;[$(date)] 上传成功&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
     # 3. (可选) 删除网盘上 30 天前的旧备份&lt;br /&gt;
     # 这一步是为了防止网盘爆满，请谨慎使用&lt;br /&gt;
     # rclone delete --min-age 30d &amp;quot;$REMOTE_DIR&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 &#039;&#039;&#039;else&#039;&#039;&#039;&lt;br /&gt;
     echo &amp;quot;[$(date)] 上传失败！&amp;quot;&lt;br /&gt;
 &#039;&#039;&#039;fi&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # 4. 清理本地临时文件&lt;br /&gt;
 rm -f &amp;quot;$TEMP_DIR/$ARCHIVE_NAME&amp;quot;&lt;br /&gt;
 echo &amp;quot;[$(date)] 本地清理完成，备份结束。&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
保存并退出 (&amp;lt;code&amp;gt;:wq&amp;lt;/code&amp;gt;)。然后赋予脚本执行权限：&lt;br /&gt;
 &amp;lt;code&amp;gt;chmod +x /root/scripts/backup.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
你可以先手动运行一次脚本，测试是否成功：&lt;br /&gt;
 &amp;lt;code&amp;gt;/root/scripts/backup.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 第四步：设置 Crontab 定时任务 ==&lt;br /&gt;
脚本没问题后，我们将其加入系统定时任务，实现全自动运行。&lt;br /&gt;
&lt;br /&gt;
输入以下命令编辑定时任务：&lt;br /&gt;
 &amp;lt;code&amp;gt;&#039;&#039;&#039;crontab -e&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
在文件末尾添加一行。例如，设置为每天凌晨 3 点 30 分自动备份：&lt;br /&gt;
 &amp;lt;code&amp;gt;30 3 * * * /bin/bash /root/scripts/backup.sh &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;30 3 * * *&amp;lt;/code&amp;gt;：表示每天 03:30 执行。&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt;：表示不发送邮件通知（如果需要查看日志，可以将输出重定向到文件）。&lt;br /&gt;
&lt;br /&gt;
保存退出即可。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 常见问题与注意事项 ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Q: OneDrive 怎么设置？&lt;br /&gt;
&lt;br /&gt;
A: 步骤与 Google Drive 基本一致。在 &amp;lt;code&amp;gt;rclone config&amp;lt;/code&amp;gt; 选择 storage type 时搜索 &amp;lt;code&amp;gt;onedrive&amp;lt;/code&amp;gt; 即可。同样需要用到“远程授权”的步骤。&amp;lt;/blockquote&amp;gt;&amp;lt;blockquote&amp;gt;Q: 如何恢复数据？&lt;br /&gt;
&lt;br /&gt;
A: 如果你的 VPS 挂了，重装系统并安装 Rclone 后，使用 &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; 命令把数据拉回来即可： &amp;lt;code&amp;gt;rclone copy gdrive:vps_backup/你的备份包.tar.gz /root/&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;blockquote&amp;gt;Q: 数据量很大怎么办？&lt;br /&gt;
&lt;br /&gt;
A: 如果数据量达到几十 GB，建议不要每次都全量打包。可以使用 Rclone 的 &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; 命令直接同步文件夹结构，而不是打包成 &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt;。命令示例：&amp;lt;code&amp;gt;rclone sync /opt/stacks gdrive:vps_sync_folder&amp;lt;/code&amp;gt;。&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
</feed>