<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>部署与基础设施 on 远栈</title><link>https://stackonward.com/zh/topics/infrastructure/</link><description>Recent content in 部署与基础设施 on 远栈</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://stackonward.com/zh/topics/infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>Sub2API 部署教程：在 Ubuntu 24.04 上配置 HTTPS、AI 账号和 API Key</title><link>https://stackonward.com/zh/posts/sub2api-deployment/</link><pubDate>Tue, 15 Sep 2026 00:20:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/sub2api-deployment/</guid><description>&lt;p&gt;如果你已经有 Claude、OpenAI 或 Gemini 账号，想在 Codex、Cherry Studio 等客户端里使用，可以在自己的 Ubuntu 服务器上部署 Sub2API。账号保存在网关后台，客户端只填写网关地址和单独生成的 API Key，不需要拿到原账号的登录信息。&lt;/p&gt;</description></item><item><title>发布失败怎么自动恢复原版本：事务状态、入口切换与回滚边界</title><link>https://stackonward.com/zh/posts/automatic-deployment-recovery/</link><pubDate>Thu, 03 Sep 2026 02:30:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/automatic-deployment-recovery/</guid><description>&lt;p&gt;发布脚本突然退出时，不要直接执行 &lt;code&gt;docker compose down&lt;/code&gt;。恢复动作取决于三个事实：候选版本是否已经接管公开流量、旧入口是否还能恢复、业务验证是否完成。旧版本仍在服务时，只需清理候选；入口可能切到一半时，要恢复旧上游；新版本仍在观察时，也应切回旧版；只有发布已经进入提交阶段，恢复程序才继续补齐提交记录。&lt;/p&gt;</description></item><item><title>Docker Compose 单机短停机发布：健康检查、入口切换与连接排空</title><link>https://stackonward.com/zh/posts/single-server-short-downtime-deployment/</link><pubDate>Thu, 03 Sep 2026 02:25:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/single-server-short-downtime-deployment/</guid><description>&lt;p&gt;单机短停机发布的可靠顺序是：启动候选版本，等待业务就绪，校验并切换 Caddy 上游，从公开域名确认结果，排空旧连接，最后停止旧版本。旧容器不能在候选版本接管流量前删除。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/single-server-short-downtime-deployment/zh/blue-green-release-flow.svg" alt="旧版本在 18080 提供流量，候选版本在 18081 启动并通过健康检查，Caddy 切换后验证公开域名，再排空旧连接" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;入口切换是唯一对外生效点；候选启动和预热都发生在切换之前。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="适用条件与限制"&gt;适用条件与限制&lt;/h2&gt;
&lt;p&gt;同一台主机同时运行蓝、绿两套应用实例，适合满足以下条件的服务：&lt;/p&gt;</description></item><item><title>数据库迁移应该在发布哪一步执行：Expand、Migrate、Contract</title><link>https://stackonward.com/zh/posts/database-migration-release-order/</link><pubDate>Thu, 03 Sep 2026 02:20:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/database-migration-release-order/</guid><description>&lt;p&gt;数据库迁移没有统一的“先于应用”或“晚于应用”答案。安全顺序取决于新旧应用能否同时使用当前 schema：新增兼容结构先执行，应用再上线，数据随后回填；删除字段、改名和收紧约束放到旧版本退出后的独立发布。&lt;/p&gt;</description></item><item><title>Docker 镜像为什么要固定 digest：可复现部署、升级与回滚</title><link>https://stackonward.com/zh/posts/docker-image-digest-pinning/</link><pubDate>Thu, 03 Sep 2026 02:15:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/docker-image-digest-pinning/</guid><description>&lt;p&gt;生产镜像应写成 &lt;code&gt;仓库:版本@sha256:摘要&lt;/code&gt;。版本 tag 让人看懂计划部署哪个版本，digest 让 Docker 拉取确定的内容；仅使用 &lt;code&gt;latest&lt;/code&gt;、&lt;code&gt;stable&lt;/code&gt; 或可移动版本 tag，无法保证重建和回滚得到原来的镜像。&lt;/p&gt;</description></item><item><title>OneDev 完整教程：从 Docker 部署、Git 仓库到 CI/CD 自动发布</title><link>https://stackonward.com/zh/posts/onedev-production-deployment/</link><pubDate>Thu, 03 Sep 2026 02:10:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/onedev-production-deployment/</guid><description>&lt;p&gt;OneDev 可以在一个实例里管理 Git 仓库、代码评审、Issue、CI/CD、构建制品和软件包。需要把代码留在自有服务器，又不想分别维护 Git 服务、CI 和包仓库时，可以考虑使用 OneDev。它的单机资源要求也低于完整 GitLab。&lt;/p&gt;</description></item><item><title>Docker 数据卷、文件权限与密钥怎么配置</title><link>https://stackonward.com/zh/posts/docker-volume-permissions-secrets/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/docker-volume-permissions-secrets/</guid><description>&lt;p&gt;数据库和应用状态写入 volume，只读配置使用 bind mount，密钥通过文件挂载给指定服务。配置完成后还要核对进程 UID/GID，并分别执行容器重建和独立恢复。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/docker-volume-permissions-secrets/zh/storage-boundaries.svg" alt="容器把数据库状态写入 named volume，只读读取宿主配置，并从 secrets 文件读取密码的结构图" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;数据库写入 named volume，配置只读挂载，密钥仅挂载到需要它的服务。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="根据数据用途选择-named-volumebind-mount-或-tmpfs"&gt;根据数据用途选择 named volume、bind mount 或 tmpfs&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;适合内容&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;主要风险&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;named volume&lt;/td&gt;
					&lt;td&gt;数据库、队列、应用持久状态&lt;/td&gt;
					&lt;td&gt;生命周期由 Docker 管理，路径不与单台主机布局强耦合&lt;/td&gt;
					&lt;td&gt;宿主备份和迁移要明确卷名与驱动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;bind mount&lt;/td&gt;
					&lt;td&gt;Caddyfile、明确的数据目录、宿主脚本&lt;/td&gt;
					&lt;td&gt;路径可见，便于现有备份与权限工具管理&lt;/td&gt;
					&lt;td&gt;强依赖宿主路径、属主和 SELinux/AppArmor 条件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;tmpfs&lt;/td&gt;
					&lt;td&gt;临时敏感文件、无需持久化的高速临时数据&lt;/td&gt;
					&lt;td&gt;不写入持久磁盘&lt;/td&gt;
					&lt;td&gt;重启即丢失，容量占用内存&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/engine/storage/" target="_blank" rel="noopener"&gt;Docker storage 文档&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt;建议优先用 volume 保存容器生成的持久数据；bind mount 更适合需要直接共享和管理的宿主文件。镜像层不适合承载运行数据，容器删除时可写层也会消失。&lt;/p&gt;</description></item><item><title>Docker 端口怎么暴露：127.0.0.1、0.0.0.0、防火墙与容器网络</title><link>https://stackonward.com/zh/posts/docker-port-firewall-loopback/</link><pubDate>Wed, 02 Sep 2026 23:50:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/docker-port-firewall-loopback/</guid><description>&lt;p&gt;判断 Docker 端口是否暴露，需要分别查看容器内监听地址、宿主机端口绑定，以及防火墙和云安全组。容器内监听 &lt;code&gt;0.0.0.0&lt;/code&gt;，不等于该端口已经暴露到公网。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/docker-port-firewall-loopback/zh/network-boundaries.svg" alt="公网经过云安全组和宿主防火墙访问反向代理，应用与数据库只在 Docker 网络内通信的分层图" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;应用和数据库只在 Docker 网络通信；公网只能到达反向代理开放的端口。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="监听地址宿主绑定和服务名属于不同网络层"&gt;监听地址、宿主绑定和服务名属于不同网络层&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;配置位置&lt;/th&gt;
					&lt;th&gt;示例&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;应用进程监听&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0.0.0.0:8080&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;接受当前容器所有网络接口上的 8080 连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;应用进程监听&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;127.0.0.1:8080&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;只接受同一容器回环接口的连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Docker 端口发布&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;127.0.0.1:8080:8080&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;宿主机本地可通过 8080 访问容器 8080&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Docker 端口发布&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0.0.0.0:8080:8080&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;宿主机全部 IPv4 接口发布 8080，可能被公网访问&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Compose 内部访问&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;http://app:8080&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;同网络服务通过服务名访问容器端口&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两处 &lt;code&gt;0.0.0.0&lt;/code&gt; 的作用不同。应用在容器内监听全部接口，是为了让同网络代理访问；Docker 把端口发布到宿主全部接口，则扩大了宿主机入口。&lt;/p&gt;</description></item><item><title>502 和 504 怎么排查：反向代理、Docker 网络与上游超时</title><link>https://stackonward.com/zh/posts/502-504-troubleshooting/</link><pubDate>Wed, 02 Sep 2026 23:40:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/502-504-troubleshooting/</guid><description>&lt;p&gt;502 和 504 都由网关或反向代理返回，但含义不同：502 表示代理没有从上游得到可用响应，504 表示代理等待上游响应超过时限。排查时先找到产生状态码的那一层，再从该层所在的网络访问上游。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/502-504-troubleshooting/zh/gateway-failure-map.svg" alt="客户端经过 CDN 和反向代理访问应用时，连接失败产生 502、等待超时产生 504 的故障图" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;连接拒绝、解析失败和无效响应通常指向 502；上游等待超过代理期限通常指向 504。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="确认哪一层返回-502-或-504"&gt;确认哪一层返回 502 或 504&lt;/h2&gt;
&lt;p&gt;浏览器前面可能同时有 CDN、云负载均衡、Caddy 或 Nginx。先保留状态码、响应头、时间和请求 ID：&lt;/p&gt;</description></item><item><title>Caddy、Nginx、Nginx Proxy Manager 怎么选：反向代理与 HTTPS 对比</title><link>https://stackonward.com/zh/posts/caddy-nginx-npm-comparison/</link><pubDate>Wed, 02 Sep 2026 10:30:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/caddy-nginx-npm-comparison/</guid><description>&lt;p&gt;少量站点、希望配置进入 Git 并自动处理 HTTPS，可以先选 Caddy；已有大量 Nginx 配置或需要细粒度模块能力，继续用 Nginx；更习惯图形界面、管理的站点也不多，再考虑 Nginx Proxy Manager。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/caddy-nginx-npm-comparison/zh/proxy-decision-tree.svg" alt="根据文件或图形界面维护方式选择 Caddy、Nginx 和 Nginx Proxy Manager 的决策树" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;先选维护方式，再看现有资产。大多数小型新站点不需要从性能跑分开始选。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="配置方式和维护对象"&gt;配置方式和维护对象&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;Caddy&lt;/th&gt;
					&lt;th&gt;Nginx&lt;/th&gt;
					&lt;th&gt;Nginx Proxy Manager&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;日常配置&lt;/td&gt;
					&lt;td&gt;Caddyfile 或 JSON&lt;/td&gt;
					&lt;td&gt;Nginx 配置文件&lt;/td&gt;
					&lt;td&gt;Web 管理界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTPS&lt;/td&gt;
					&lt;td&gt;自动签发和续期是默认能力&lt;/td&gt;
					&lt;td&gt;通常搭配 Certbot、acme.sh 或云证书&lt;/td&gt;
					&lt;td&gt;界面集成常见证书操作&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Git 管理&lt;/td&gt;
					&lt;td&gt;很适合&lt;/td&gt;
					&lt;td&gt;很适合&lt;/td&gt;
					&lt;td&gt;主要状态在数据库中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WebSocket&lt;/td&gt;
					&lt;td&gt;常见场景自动处理&lt;/td&gt;
					&lt;td&gt;需要正确设置升级相关头&lt;/td&gt;
					&lt;td&gt;由生成的 Nginx 配置处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存和限流&lt;/td&gt;
					&lt;td&gt;可以配置&lt;/td&gt;
					&lt;td&gt;能力成熟、控制细&lt;/td&gt;
					&lt;td&gt;受界面与高级配置范围影响&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;额外状态&lt;/td&gt;
					&lt;td&gt;配置和证书目录&lt;/td&gt;
					&lt;td&gt;配置、证书和相关脚本&lt;/td&gt;
					&lt;td&gt;应用、数据库、证书和生成配置&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三者都能完成常见的 HTTPS 入口和反向代理。文件配置便于审查和回滚；数据库配置便于界面操作，但备份必须同时覆盖数据库和证书。&lt;/p&gt;</description></item><item><title>Docker Compose 生产部署指南：镜像、健康检查、密钥与持久化</title><link>https://stackonward.com/zh/posts/docker-compose-production/</link><pubDate>Wed, 02 Sep 2026 10:00:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/docker-compose-production/</guid><description>&lt;p&gt;&lt;code&gt;docker compose up -d&lt;/code&gt; 只能说明容器已经启动。生产部署还要固定镜像、保存数据、隔离端口、限制资源，并验证容器和主机重启后的恢复结果。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/docker-compose-production/zh/compose-topology.svg" alt="单机 Docker Compose 生产部署中反向代理、应用容器、持久化卷、密钥和日志的拓扑图" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;公网只开放反向代理的 80/443；应用端口留在回环地址或容器网络中。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="compose-适合什么样的生产服务"&gt;Compose 适合什么样的生产服务&lt;/h2&gt;
&lt;p&gt;单台主机、服务数量不多、依赖关系清楚时，Compose 足以承担部署：&lt;/p&gt;</description></item><item><title>Nginx Proxy Manager部署指南 | 可视化管理Nginx反向代理和SSL证书</title><link>https://stackonward.com/zh/posts/nginx-proxy-management/</link><pubDate>Fri, 11 Oct 2024 00:00:32 +0800</pubDate><guid>https://stackonward.com/zh/posts/nginx-proxy-management/</guid><description>&lt;h1 id="自建nginx-proxy-manager"&gt;自建&lt;a href="https://nginxproxymanager.com/guide/#quick-setup" target="_blank" rel="noopener"&gt;Nginx Proxy Manager&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前置条件：在服务器安装完成&lt;code&gt;Docker&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="部署npm"&gt;部署NPM&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建安装NPM的目录，例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;编辑&lt;code&gt;docker-compose.yml&lt;/code&gt;文件&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输入安装脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: &lt;span class="s1"&gt;&amp;#39;jc21/nginx-proxy-manager:latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 保持默认即可，不建议修改左侧的80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;81:81&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 冒号左边可以改成自己服务器未被占用的端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 保持默认即可，不建议修改左侧的443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./data:/data &lt;span class="c1"&gt;# 冒号左边可以改路径，现在是表示把数据存放在在当前文件夹下的 data 文件夹中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./letsencrypt:/etc/letsencrypt &lt;span class="c1"&gt;# 冒号左边可以改路径，现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;安装NPM&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;输入 &lt;a href="http://ip:81/" target="_blank" rel="noopener"&gt;http://ip:81&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt; 访问&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;默认登陆名和密码：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Email: admin@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password: changeme
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="更新-nginx-proxy-manager"&gt;更新 Nginx Proxy Manager&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive &lt;span class="c1"&gt;#备份一份数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image prune &lt;span class="c1"&gt;# prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="卸载-nginx-proxy-manager"&gt;卸载 Nginx Proxy Manager&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-proxy-manager添加反向代理"&gt;Nginx Proxy Manager添加反向代理&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://images.stackonward.com/md/2024/202410110015772.png" alt="添加反向代理步骤1"&gt;&lt;/p&gt;</description></item></channel></rss>