跳到主内容

30 分钟完成自部署:Docker Compose 一键启动 ShopFaaS

部署实战 · 第 1 篇 · 约 8 分钟阅读

很多人对"自部署独立站"的印象停留在"难、复杂、需要专业运维"。事实上,以 ShopFaaS 为例,从一台干净的 Ubuntu 服务器到能接订单的独立站,完整流程只需要 30 分钟。本文把每一步都写出来,你照着做就行。

需要先说明一点:ShopFaaS 提供的是 ShopFaaS Store 独立站应用的私有化部署——交付给客户的是一个打包好的 Docker 镜像部署包,而不是一份需要自己编译的源码。 你不需要在服务器上安装 Node.js、不需要 git clone、不需要 bun install/bun run build,唯一需要的运行时是 Docker 引擎。 部署后的独立站会通过 SUITE_API_URL 回连平台完成授权激活,并每 1 小时上报一次心跳,确保 License 合法有效。

本文假设你已从平台方拿到部署包(镜像 tar 文件 + docker-compose.standalone.yml + start-standalone.sh)与部署配置(SUITE_API_URL + DEPLOY_TOKEN)。服务器要求:Ubuntu 22.04+ / Debian 12+、Docker 24.0+,2 核 4G 起步,推荐 4 核 8G。

第一步:安装 Docker 与 Docker Compose(5 分钟)

SSH 登录服务器,执行以下命令安装 Docker 与 Docker Compose:

# 安装 Docker(Ubuntu / Debian)
curl -fsSL https://get.docker.com | sudo sh

# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER

# 重新登录使组权限生效
exit

# 验证安装
docker --version
docker compose version

看到版本号输出就说明 Docker 与 Docker Compose 已安装完成。

第二步:上传部署包并配置环境变量(5 分钟)

在服务器上创建部署目录并上传部署包中的文件:

mkdir -p /opt/shopfaas-store
cd /opt/shopfaas-store
# 将以下文件从本地上传到此目录:
#   images-<版本号>-full.tar     全量正式包(首次部署用)
#   docker-compose.standalone.yml
#   Caddyfile 或 nginx.conf
#   start-standalone.sh

首次运行 start-standalone.sh 会自动生成 .env 模板(含随机密码)。你只需要手动填写两个必填的联动变量——它们必须来自平台方交付的部署配置:

nano .env

# === 平台联动(必填,从平台方获取) ===
SUITE_API_URL=https://platform.example.com
DEPLOY_TOKEN=your-deploy-token

其他密码(POSTGRES_PASSWORDJWT_SECRETINTERNAL_API_KEY 等)由 start-standalone.sh自动生成,无需手动填写。注意:DEPLOY_TOKEN 是一次性令牌(48 小时有效),激活后即失效;首次部署后各密钥不可更改,请妥善备份 .env 文件。

第三步:一键启动(10 分钟)

chmod +x start-standalone.sh
./start-standalone.sh

脚本会自动完成:

  • 加载镜像包并启动 7 个服务(postgres / redis / rustfs / schema-init / store / chat / nginx 或 caddy)
  • schema-init 智能引导数据库:空库时全量安装 schema 与演示数据,已有业务表时仅执行增量迁移(绝不 DROP 表)
  • store 容器启动时自动完成 License 激活(POST /api/deploy/activate)、绑定实例指纹,并从平台拉取租户初始化配置
  • 自动创建店主账号、安装默认主题、写入配额,并启动每小时心跳

等待健康检查通过(约 30-90 秒),看到日志出现 License 实例激活成功provisionTenant 完成 即表示部署成功。

第四步:域名解析与 HTTPS(10 分钟)

在域名服务商处把主域名(以及 www 子域名)的 A 记录解析到服务器 IP。注意:不要使用 Cloudflare 等 CDN 代理,否则 Caddy 申请 Let's Encrypt 证书时 ACME 校验会失败。

# 验证 DNS 解析是否生效(两条都应返回服务器 IP)
dig example.com +short
dig www.example.com +short

.env 中启用自动 HTTPS(推荐),填入域名与证书注册邮箱,然后重启:

nano .env
# 启用 HTTPS 自动证书模式
COMPOSE_PROFILES=https
AUTO_HTTPS=true
DOMAIN=example.com
HTTPS_EMAIL=admin@example.com

cd /opt/shopfaas-store
./start-standalone.sh

Caddy 会自动申请并续期 Let's Encrypt 证书。完成后访问 https://example.com,你应该能看到店铺首页,且浏览器地址栏显示安全锁图标。店主后台入口为 https://example.com/admin

第五步:首次登录与邮件服务(可选,5 分钟)

店主账号的邮箱与初始密码由平台方在生成部署配置时指定,登录后请立即修改默认密码。邮件服务(SMTP)用于发送订单确认、密码重置与营销邮件,在店主后台「设置 → 邮件服务」页配置即可,无需改 .env

运维清单:让站点长期稳定运行

部署完成只是开始。要让站点长期稳定运行,需要建立以下运维习惯:

日常运维

  • 每周检查 docker compose -f docker-compose.standalone.yml logs 是否有异常错误
  • 每月检查服务器磁盘空间(df -h),日志与图片占用大头
  • 版本升级由平台方提供新的镜像包,执行 docker load 后重启即可,无需手动迁移

数据备份

  • 数据库每日自动备份:docker exec shopfaas-postgres pg_dump -U shopfaas shopfaas_store > backup.sql
  • 同时备份 .env 配置与对象存储目录(密钥首次部署后不可更改,备份即救命)
  • 每月验证备份可恢复(在测试环境恢复一次)

监控告警

  • 用 UptimeRobot 或类似服务监控站点可用性(免费版够用)
  • 设置服务器 CPU、内存、磁盘告警阈值(CPU > 80% 持续 5 分钟告警)
  • ShopFaaS 自带 /health/health/ready 端点,可对接监控系统

安全加固

  • SSH 禁用密码登录,只允许密钥登录
  • 防火墙只开放 80、443、22 端口,数据库与 Redis 不暴露公网
  • 定期更新系统(sudo apt update && sudo apt upgrade)
  • 妥善保管 .env 备份(内含数据库/应用密钥,丢失将无法访问数据)

常见问题

Q1:为什么启动失败,提示缺少 SUITE_API_URL / DEPLOY_TOKEN?

私有化部署采用强制联动模式:未配置 SUITE_API_URL + DEPLOY_TOKEN 的 store 会拒绝启动(这是 License 安全机制)。请确认这两个变量已从平台方交付的部署配置中正确填入.env。若令牌过期,联系平台方重新生成。

Q2:SSL 证书申请失败怎么办?

确保主域名与 www 的 A 记录已解析到服务器 IP(两条都要配),且 80 端口未被防火墙拦截。用 dig example.com 验证 DNS。若使用了 Cloudflare 等 CDN 代理,ACME 校验会失败,请关闭代理直连。Let's Encrypt 有频率限制,失败多次后需等待再重试。

Q3:如何升级到新版本?

# 从平台方获取新版本 update 镜像包
docker load -i images-<新版本号>-update.tar
docker compose -f docker-compose.standalone.yml down
docker compose -f docker-compose.standalone.yml up -d

升级前务必备份数据库与 .env。schema-init 会自动执行增量迁移,不会清空已有业务数据。

Q4:邮件发不出去怎么办?

检查店主后台「设置 → 邮件服务」中的 SMTP 配置:主机、端口、账号、密码、发件人域名是否与邮件服务商要求一致。发件地址必须是你在 SMTP 服务商验证过的域名邮箱,Gmail、QQ 等个人邮箱不适合做发件地址,会被识别为垃圾邮件。

下一步

部署完成后,你可以:

有问题可以在留言表单联系我们,或在 GitHub Issues 提问。我们的目标:让自部署像 SaaS 一样简单,但把数据归属与成本控制握在自己手里。