🐳 Docker Compose 生产级部署交付全指南
循序渐进实战指引:如何在一台独立 VPS 云服务器上以最高级别的安全性、高可用性与系统健壮度,成功跑通 Loomix 架构下全部 10 项微服务组件。
1. 服务器基础设施基准要求 (Prerequisites)
在启动安装流程前,请备妥一台运行 Ubuntu 22.04 LTS 或 24.04 LTS 的海外独立 VPS 服务器:
- 运行内存 (RAM): 至少 4GB 物理内存并挂载至少 4GB 虚拟内存 (Swap)(推荐 8GB RAM 以获取极致镜像构建效率)。
- 计算核心 (CPU): 至少 2 核 vCPU(推荐 4 核 vCPU 加速 Docker 镜像并行分层编译)。
Docker 守护进程与套接字权限
确保系统已安装 Docker 与 Docker Compose 插件,并将当前操作非 root 用户加入 docker 用户组中。
sudo usermod -aG docker $USERnewgrp docker # or log out and SSH back indocker ps # should work without sudo2. 将工程源码传输部署至远程服务器
您可以通过以下两种成熟的标准工程手段将项目源码部署至您的目标服务器:
方案一:通过 Git 仓库直接克隆部署(官方强烈推荐)
时刻保持环境变量配置安全
git clone https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>基于 SSH Deploy Keys 克隆私有组织仓库
- 1. 在服务器上生成专用安全密钥对:ssh-keygen -t ed25519
- 2. 打印并复制您的公钥文本:cat ~/.ssh/id_ed25519.pub
- 3. 登录 GitHub 仓库主页,在 Deploy Keys 中添加该公钥并赋予读取权限。
- 4. 直接在服务器终端通过 SSH 协议快速拉取私有代码库。
git clone git@github.com:<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>通过个人访问令牌 (PAT) 进行鉴权拉取
git clone https://<YOUR_GITHUB_USERNAME>:<PERSONAL_ACCESS_TOKEN>@github.com/<YOUR_GITHUB_USERNAME>/<YOUR_REPOSITORY_NAME>.gitcd <YOUR_REPOSITORY_NAME>方案二:上传本地压缩归档包 (ZIP / Tarball)
若您在本地下载了完整的项目源代码归档包,可通过 scp 或 rsync 极速上传至服务器:
rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.next' ./ user@your_vps_ip:/root/next-strapi-medusa3. 极速全自动安装向导 (Quick Wizard)
为免除繁重的手工配置之苦,我们精心编写了 server-setup.sh 自动化脚手架:自动划定虚拟内存、严密审计端口占用并分步部署拉起全套容器:
chmod +x server-setup.shbash server-setup.sh运维老手锦囊:
4. 选定最适合您的部署架构方案 (Deployment Profiles)
系统内置了 3 种针对不同业务阶段与流量规模的标准拓扑架构配置:
我是否必须准备独立的正式域名?
在一台独立 VPS 上完整运行全部 10 项微服务,通过规范的二级子域名路由流量,由 Caddy 提供全自动 SSL 加密。
方案 B 极速上手四步法:
- 1. 将您的主域名及其全部泛解析二级子域名 A 记录解析至 VPS 服务器公网 IP。
- 2. 运行 server-setup.sh 安装向导并选择 Profile B。
- 3. 键入您所拥有的顶级主域名(例如 yourdomain.com)。
- 4. Caddy 反向代理网关自动向 ACME 机构申请并安装全部子域名的 SSL 证书。
- 5. 全部业务端点与控制台均在 HTTPS 加密下立即可用。
# Profile B: VM / LAN HTTPS (.local hostnames) - Recommended ★ STOREFRONT_PUBLIC_URL=https://store.localMEDUSA_BACKEND_PUBLIC_URL=https://api.localSTRAPI_PUBLIC_URL=https://admin.localMEILISEARCH_PUBLIC_URL=https://search.localMINIO_PUBLIC_URL=https://api.local/minio/mystoreGOOGLE_CALLBACK_URL=https://store.local/ir/account/auth/callback STOREFRONT_URL=http://storefront:8000MEDUSA_NODE_ENV=productionMEDUSA_ALLOW_HTTP_COOKIES=falseCLOUDFLARE_TUNNEL_TOKEN=• 独立站前台:
https://yourdomain.com• Medusa 电商中台:
https://api.yourdomain.com/app• Strapi 内容后台:
https://admin.yourdomain.com/admin• Umami 流量统计:
https://analytics.yourdomain.com• OpenObserve 监控:
https://monitor.yourdomain.comCloudflare 边缘安全加固与避坑全指南
在将域名 NS 权威解析委托给 Cloudflare 之前:
为彻底杜绝常见的无限重定向死循环 (Redirect Loops),请务必将 Cloudflare 的 SSL/TLS 加密模式明确设定为 Full (Strict)。
2. 服务拉起后(部署后安全加固设置):
• SSL/TLS 加密模式:必须设为 Full (Strict)。
• Edge 边缘证书:开启 Always Use HTTPS、Automatic HTTPS Rewrites,并将最低 TLS 版本设为 TLS 1.2(或 1.3)。
• DNS 代理:将所有 DNS 记录切换为橙色云朵图标(Proxied),享受 CDN 边缘加速并防御源站 DDoS 攻击。
• 安全 / WAF:启用 Bot Fight Mode 防爬虫机制。
• 网络设置:确保已启用 WebSockets 和 gRPC。
• 缓存策略:在 Caching > Configuration 中,确保 Browser Cache TTL 设为 Respect Existing Headers,以免干扰购物车与库存的即时变动更新。
HTTP Basic Auth 与 Caddy 边缘访问加固:
• Strapi 管理后台 (admin.yourdomain.com/admin* 与 /):强制接入 HTTP Basic Auth,彻底阻断密码字典穷举爆破。公共开放的 API 接口 (/api/*) 与多媒体静态资源 (/uploads/*) 保持免密透传,确保 Storefront 与 Medusa 调取数据不受 401 拦截。
• OpenObserve 监控看板 (monitor.yourdomain.com):叠加 HTTP Basic Auth 防护,形成与内部用户认证的双保险。
使用如下指令为 .env 中的 BASIC_AUTH_HASH 生成安全的 bcrypt 加密字串:
docker run --rm caddy:latest caddy hash-password --plaintext "your_secret_password"不同部署架构方案下的微服务端口路由对照矩阵
| 微服务模块 | 方案 A (本地开发) | 方案 B (单机 VPS) | 方案 C (企业集群) |
|---|---|---|---|
| Next.js 独立站前台 | http://<VM_IP>:8000 | https://store.local | https://yourdomain.com |
| MedusaJS 核心后端 | http://<VM_IP>:9000/app | https://api.local/app | https://api.yourdomain.com/app |
| Strapi CMS 内容系统 | http://<VM_IP>:1337/admin | https://admin.local/admin | https://admin.yourdomain.com/admin |
| Umami 流量数据中台 | http://<VM_IP>:3005 | https://analytics.local | https://analytics.yourdomain.com |
| OpenObserve 实时监控 | http://<VM_IP>:5080 | https://monitor.local | https://monitor.yourdomain.com |
| 极速搜索引擎 (Meilisearch) | 127.0.0.1:7700 | https://search.local | https://search.yourdomain.com |
.env 中各项公网公开 URL 的具体含义:
STOREFRONT_PUBLIC_URL:Next.js 商城前台服务(Docker 内部映射为 8000 端口,或线上绑定独立域名)。MEDUSA_BACKEND_PUBLIC_URL:Medusa API 商业网关与管理控制台 (/app)。STRAPI_PUBLIC_URL:Strapi CMS 后台管理界面 (/admin);草稿预览链接自动指向 STOREFRONT_PUBLIC_URL。MEILISEARCH_PUBLIC_URL:客户端即时拼写搜索公开接口(方案 A:http://127.0.0.1:7700,方案 B:https://search.local,方案 C:https://search.yourdomain.com)。MINIO_PUBLIC_URL:多媒体静态资源存储前缀(方案 A:http://IP:9001/mystore,方案 B/C:https://api.*/minio/mystore)。STOREFRONT_URL:仅用于 Docker 内部网络(http://storefront:8000),专供 Medusa -> Storefront 发送按需缓存重构通知。
在启动第 1 阶段前【必须】配置项:
• 随机安全秘钥 (openssl rand -hex 32):POSTGRES_PASSWORD、MEILI_MASTER_KEY、所有 STRAPI_* 密钥、MEDUSA_JWT_SECRET、MEDUSA_COOKIE_SECRET、REVALIDATE_SECRET、UMAMI_APP_SECRET。
• 超级管理员凭证:MEDUSA_ADMIN_EMAIL、MEDUSA_ADMIN_PASSWORD、MINIO_ROOT_USER、MINIO_ROOT_PASSWORD、UMAMI_USERNAME、UMAMI_PASSWORD。
• 公开访问域名:按需选定方案 A、方案 B 或方案 C 对应的地址配置。
在执行对应阶段之前请保持留空:
• 第 4 阶段:STRAPI_API_TOKEN_FOR_MEDUSA, STRAPI_API_TOKEN_FOR_FRONT
• 第 6 阶段:MEDUSA_PUBLISHABLE_KEY
• 第 7 阶段:MEILI_SEARCH_KEY
• 第 8 阶段:UMAMI_WEBSITE_ID
Medusa 后台生产环境刚性规则:在 Docker 中始终锁定 MEDUSA_NODE_ENV=production。切勿指定为 development,因为后台面板预构建针对生产环境优化,开发模式会导致页面白屏崩溃。
5. 基于 GitHub Actions CI/CD 实现自动化持续交付
工程源码中完整预置了生产级 CI/CD 流水线:每次向 GitHub 提交代码,自动触发容器镜像构建并实现无感知热更新:
- 将服务器公网 IP 与自动化运维 SSH 私钥录入 GitHub 仓库的 Repository Secrets 安全保管区。
- 每次向主分支 (main) 推送变更,GitHub Actions 自动化流水线会即刻完成 Next.js 与 Medusa 容器的轻量化打包优化。
- 流水线向目标服务器安全握手并下发热升级指令,容器平滑切换实现真正的零宕机无感更新 (Zero-Downtime)。
- 4. (私有仓库可选) 生成具备
repo、workflow及read:packages权限的 GitHub Personal Access Token (Classic),并在 VPS 终端登录 GitHub Container Registry:
echo "<YOUR_PAT>" | docker login ghcr.io -u <YOUR_GITHUB_USERNAME> --password-stdin全自动化部署拆解:标准 10 大推进阶段 (Phases 1-10)
| 推进阶段 | 激活的微服务容器 | 方案 A | 方案 B / C(本地局域网与生产外网环境) |
|---|---|---|---|
| 阶段 1: | 数据库集群与基础设施层 (Postgres, Redis, MinIO, Meilisearch) | ✅ | ✅ |
| 阶段 2: | Caddy 反向代理网关与自动 SSL(方案 B 需配置 hosts 映射) | ⏭ 跳过(方案 A 环境无需执行) | ✅ 紧随第 1 阶段完成后,在拉起 Strapi 之前执行 |
| 阶段 3: | Strapi CMS 内容管理中台(从 GHCR 拉取预构建镜像) | ✅ | ✅ |
| 阶段 4: | 提取 Strapi API Tokens -> 回填存入 .env | ✅ | ✅ |
| 阶段 5: | Medusa 2.0 商业核心引擎(从 GHCR 拉取预构建镜像) | ✅ | ✅ |
| 阶段 6: | 提取 Medusa 公开访问秘钥 -> 回填存入 .env | ✅ | ✅ |
| 阶段 7: | 提取 Meilisearch 只读搜索密钥 -> 回填存入 .env | ✅ | ✅ |
| 阶段 8: | Umami 隐私行为分析系统(在前台启动之前部署) | 选填项 | ✅ |
| 阶段 9: | Next.js 商城前端前台(通过 GitHub Actions 自动编译构建与上线) | ✅ | ✅ |
| 阶段 10: | 全栈可观测性与日志审计套件 (OpenObserve, Vector, cAdvisor) | 选填项 | 官方推荐 |
阶段一:启动持久化底层数据库 (PostgreSQL & Redis)
初始化 PostgreSQL 独立容器实例,分别为 Medusa、Strapi 与 Umami 开辟隔离数据模式,并启动 Redis 分布式高速缓存。
docker compose up -d postgres redis meilisearch minio minio-setup等待直到全部微服务均处于 healthy 健康状态:docker compose ps
阶段二:启动 Caddy 智能反向代理网关与 SSL 证书申领
拉起 Caddy 网关,自动与 ACME 证书颁发机构握手,为全站各个二级子域名全自动配置生产级 TLS/SSL 加密套据。
docker compose up -d caddydocker compose logs -f caddy针对方案 B 在 Windows 宿主机配置 hosts 本地解析:
以管理员身份打开 C:\Windows\System32\drivers\etc\hosts 并追加如下解析映射:192.168.1.103 store.local api.local admin.local analytics.local monitor.local
(将 192.168.1.103 替换为您实际虚拟机的内网 IP。请勿添加 Meilisearch,其必须维持内网严格隔离)。
阶段三:启动 Strapi CMS v5 内容管理系统
自动拉取生产级 Strapi 镜像,建立与 Postgres 数据库池的持久握手,健康巡检守护直至 1337 业务端口进入就绪态。
docker compose pull strapidocker compose up -d strapidocker compose logs -f strapi等待服务启动并在 1337 端口开始监听(首次冷启动耗时约 1–3 分钟)。在浏览器打开 Strapi 后台(方案 B:https://admin.local/admin,方案 A:http://<VM_IP>:1337/admin)并注册创建超级管理员账户。
阶段四:提取 Strapi 服务间通信鉴权 Token 并持久化至 .env
全自动调用后台脚本生成供 Next.js 独立站调取前台布局区块专用的 Full Access 安全令牌,并回写写入生产环境配置。
- 执行 strapi-token-init.js 运维审计脚本提取管理端鉴权标识。
- 将签发的 STRAPI_API_TOKEN 环境变量精准同步注入到生产配置文件中。
- 3. 针对前台商城接入 (
STRAPI_API_TOKEN_FOR_FRONT):点击选择Read-Only只读 Token,点击 Regenerate 并将复制的明文值写入.env的STRAPI_API_TOKEN_FOR_FRONT变量中。
阶段五:初始化 MedusaJS v2 核心电商中台引擎
拉起 Medusa 核心业务容器,全自动执行全量数据模式迁移 (Migrations) 并创建第一位超级系统管理员席位。
docker compose pull medusadocker compose up -d medusadocker compose logs -f medusa首次初始化自动流转:db:migrate 执行数据库自动化迁移(耗时约 2–5 分钟)-> 创建超级管理员 -> 9000 端口服务就绪。访问 Medusa Admin 后台 https://api.local/app(方案 B)或 http://<VM_IP>:9000/app(方案 A),使用预置的 MEDUSA_ADMIN_EMAIL 与 MEDUSA_ADMIN_PASSWORD 完成登录。
阶段六:绑定销售渠道并生成可公开访问的 API 密钥
为前台独立站签发专属的 Publishable API Key,并将其与默认跨境销售渠道建立深度双向映射关系。
- 自动化创建拥有完全授权资质的超级管理员身份主体。
- 将生成的凭证绑定至 NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY 生产变量中。
- 3. 【极其重要】:打开新建的公开密钥 > 进入 Sales Channels 销售渠道选项卡 > 勾选绑定 Default Sales Channel。若遗漏此步骤,前台将无法正常查询展示上架商品。
阶段七:挂载 Meilisearch 毫秒级智能搜索引擎
启动 Meilisearch 搜索引擎容器,配置商品分词策略,实现亚毫秒级的智能联想搜索与高容错纠错体验。
curl -H "Authorization: Bearer <MEILI_MASTER_KEY>" http://127.0.0.1:7700/keys复制提取出来的 Default Search API Key,填入 .env 中的 MEILI_SEARCH_KEY 变量(自动化交互式向导可全自动提取)。
阶段八:初始化 Umami 隐私保护型流量统计平台
拉起完全符合国际 GDPR 规范、不依赖第三方 Cookie 的独立流量统计中台 Umami,并生成独立站前台埋点识别码。
docker compose up -d umami访问 Umami 统计面板(方案 B:https://analytics.local,方案 A:http://<VM_IP>:3005)。登录管理员(admin / umami),依次进入 Settings > Websites > Add website,将生成得到的 Website ID 写入 .env 的 UMAMI_WEBSITE_ID。
阶段九:部署上线 Next.js 16 现代独立站前台
构建 Next.js 生产镜像,与各微服务建立链路握手,完成全站静态页面预渲染并将其无缝接入 Caddy 反向代理网络。
1. 生产环境构建参数与 API 链路注入:
在 Docker 镜像分层编译阶段将 Medusa 与 Strapi 的端点地址固化注入。
1. STOREFRONT_BUILD_ARGS(前端构建环境变量集合)
包含 Next.js 编译所需的环境参数。直接复制上述模板,并替换填入前面各阶段生成提取的专属密钥。
MEDUSA_BACKEND_URL=http://medusa:9000NEXT_PUBLIC_MEDUSA_BACKEND_URL=https://api.yourdomain.comNEXT_PUBLIC_STRAPI_URL=https://admin.yourdomain.comNEXT_PUBLIC_BASE_URL=https://store.yourdomain.comNEXT_PUBLIC_MEILISEARCH_HOST=https://search.yourdomain.comNEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_...NEXT_PUBLIC_MEILISEARCH_SEARCH_KEY=...NEXT_PUBLIC_UMAMI_WEBSITE_ID=...NEXT_PUBLIC_DEFAULT_REGION=USDEFAULT_LOCALE=en-USNEXT_PUBLIC_MEILISEARCH_INDEX_NAME=productsNEXT_PUBLIC_ENABLE_IRAN_FEATURES=false2. REGISTRY_URL
组件注册中心源地址。默认推荐采用官方公共的 Loomix Blocks 注册中心:https://raw.githubusercontent.com/landa33/loom-blocks-registry/main/src/modules
3. GITHUB_PAT (可选)
具备 repo、workflow 及 read:packages 范围的 GitHub Personal Access Token (Classic)。用于私有 GHCR 拉取、触发 CI/CD 及调用私有组件源。
4. DEPLOY_PATH
Linux VPS 宿主机上项目的绝对物理路径(例如 /root/loomix-commerce)。Self-Hosted Runner 必须据此定位并执行 Docker Compose 调度。
2. 采用极轻量化的 Next.js Standalone 输出模式:
借助 Next.js 生产独立打包特性,将最终交付的容器体积极致压缩至 150MB 以下。
3. 容器网络互联与可用性健康探针:
严格监听 8000 宿主通信端口,确认页面可访问后接入 Caddy 网关路由池。
4. 正式启动对外服务的前台容器:
docker compose pull storefrontdocker compose up -d storefront阶段十:挂载 Vector & OpenObserve 工业级全链路监控
启动分布式日志采集端 Vector 与监控大盘 OpenObserve,全景追踪系统各容器的 CPU、内存负载与异常日志流。
docker compose up -d openobserve vector cadvisor docker-stats-exporterOpenObserve 集中式控制台界面:
在浏览器访问 https://monitor.yourdomain.com(方案 C)、https://monitor.local(方案 B)或 http://<VM_IP>:5080(方案 A),使用 OpenObserve root 管理凭证登录。
集中式日志与指标遥测流列表:
docker_logs:全容器统一格式化日志流,支持全文字符串快速匹配与跨微服务异常链路追踪。
caddy_access:实时 HTTP 入站流量审计、来源真实 IP、响应状态码(2xx/4xx/5xx)以及 Vector 从 Caddy JSON 日志中直接抓取的请求耗时。
docker_stats:基于 cAdvisor 采集的每个容器的实时内存使用率、CPU 占用百分比及网络 I/O 吞吐。
host_metrics:VPS 物理宿主机层级的整机 CPU 负荷、RAM 内存消耗及物理磁盘读写状态。
Telegram 实时故障报警机器人配置:
在 OpenObserve 管理后台中,进入 Reliability > Destinations 绑定您的 Telegram Bot Webhook(https://api.telegram.org/bot<TOKEN>/sendMessage),然后在 Reliability > Alerts 中设立预警规则,遭遇 500 异常时秒级推送警报。
6. Medusa 与 Strapi 之间的初始业务数据双向同步
全自动同步作业:读取 Medusa 中的商品矩阵与分类体系,并在 Strapi 中全自动构建对应的首页呈现区块结构。
触发全自动初始化数据对齐:
在 Strapi 容器内部执行如下标准命令,一键装配默认的演示首页布局体系:
2. Loomix 模块化区块自动化同步引擎 (sync-loom-component.js)
在 Strapi 的 Storefront Management 控制台中,点击 + Add to Storefront (Queue) 或 Remove Style (Queue) 将排版改动追加进 sync-history.json 队列。点击 Update Storefront 后即可自动同步设计预设,并全自动触发 GitHub Actions 编译发版流水线。
生产环境同步所需环境变量:
将如下变量配置在 website-admin/.env 与宿主机根目录 .env 文件中。请确保 Token 包含 'repo' 与 'workflow' 权限范围:
GITHUB_DEPLOY_TOKEN=ghp_your_personal_access_token # Requires 'repo' and 'workflow' scopesGITHUB_DEPLOY_REPO=your_username/your_repo_name7. 在不同部署架构拓扑之间平滑热迁移
若您计划将方案 A 平滑迁移升级至方案 B,或需要更换绑定的主域名,请参照如下标准运维工序:
| 涉及变更的业务类型 | 建议受影响需要热重启的微服务清单 |
|---|---|
| .env 中的各项公开 URL 地址 | Strapi、Medusa、Storefront(先在 GitHub Actions 触发编译,再拉取新镜像) |
| 调整 MEDUSA_ALLOW_HTTP_COOKIES 配置 | 仅需重启 Medusa 容器 |
| 新增 Caddy 代理网关(从方案 A 迁移至方案 B) | 启动 Caddy 容器 (docker compose up -d caddy);拉取全新容器镜像 |
| 修改 hosts 本地解析(方案 B) | 服务端完全无需变更;仅需在您本地 Windows 办公机上修改 hosts 映射 |
# 1. Edit .env — switch to Profile B URLs, set MEDUSA_ALLOW_HTTP_COOKIES=falsenano .env # 2. Add hosts entry on Windows # 3. Start Caddydocker compose up -d caddy # 4. Pull new images:docker compose pull strapi medusa && docker compose up -d strapi medusa8. 一键升级全栈微服务组件至最新稳定版
运行 server-update.sh 脚本,可在确保数据库所有核心业务数据与订单资产绝对安全的前提下,平滑热更新全部微服务。
9. 常用日常运维诊断与容器管理指令集
汇总在日常运维过程中最实用的 Docker 容器状态审查、热重启与冷备份命令行:
./setup.sh # On Linux / macOS.\setup.bat # On Windows10. 系统微服务内部通信网络与端口映射全景图
微服务容器间通信的专属隔离网桥 (Internal Bridge Network):
- 前端商城 (Storefront)::8000
- Medusa API + 管理后台::9000
- Strapi CMS 内容中台::1337
- Meilisearch 搜索引擎::7700
- MinIO 存储控制台::9001
- Umami 隐私统计::3005
- OpenObserve 监控运维::5080
由 Caddy 网关负责七层流量分发的主机域名路由表:
- https://store.local -> storefront:8000
- https://api.local -> medusa:9000
- https://admin.local -> strapi:1337
- https://analytics.local -> umami:3000
- https://monitor.local -> openobserve:5080
- https://api.local/minio/ -> minio:9000
受防火墙保护的内部私有容器网络 loomix-network:
容器之间在 Docker 桥接内网中通过标准服务名无缝寻址通信(例如 http://storefront:8000、http://medusa:9000、http://meilisearch:7700)。Meilisearch 属于绝对内网敏感服务,绝不能将其对外公网暴露映射。
核心运维控制指令速查表
docker compose psdocker compose logs -f medusadocker compose logs -f strapidocker compose logs -f storefrontdocker compose logs -f openobservedocker builder prune -fdocker system prune -fdocker compose downdocker compose up -d