# 普拉提约课 1.0.0 安装部署手册

## 1. 空库安装

推荐 Linux 2 核 4GB 起、Docker 24+ 和 Compose。推荐使用项目 Docker 的 JDK 21/Maven 3.9 构建路径；pom 的 Java 编译目标为 17。前端使用 Node 24、pnpm 11.1.3。

```bash
cd deploy
./scripts/init-env.sh
# 编辑 .env：随机数据库/Redis/TOKEN_SECRET，设置 ADMIN_INIT_PASSWORD 和 HTTP_PORT。
# 正式：APP_DEMO_DATA=false，APP_DEMO_RESET_ENABLED=false，APP_DEMO_RESET_CRON=-。
docker compose up -d --build
docker compose ps
```

服务首次自动 Flyway 建表。正式只建立待配置门店和通用协议，不装示例会员/员工/订单。后台 `/`，会员与教练 H5 `/h5/`。admin 首次登录必须改密；系统设置修改品牌，门店规则修改门店资料及协议。

## 2. 人员与资源

先在统一用户管理创建店长、前台、教练账号，分配菜单/按钮权限。超管在门店规则授权店长/前台门店范围，教练档案绑定系统员工并选择可授课程与每周时段。没有排班不视为全天可用。最多三家直营馆，会员和课包单店归属，不包含跨店资金结算。

## 3. 会员与前台收款

前台核实身份后建档并交付初始密码，会员在所属门店用手机号、密码与图形验证码登录。本版没有短信认证或找回密码短信。收款选择课包、填写元金额、已实际收款方式与凭据、确认服务协议，系统开卡与入账。会员端只显示价目和到店购买说明；公共支付配置保留不代表业务已接线上购买。

## 4. HTTPS、H5 与 App

公网请在外层 Nginx/Caddy/负载均衡终止 HTTPS，整站转发本产品 Web 容器。代理应覆盖真实 IP，不信任客户端伪造 X-Forwarded-For。生产镜像同时包含管理端与 H5。H5 默认同域 `/api`；App/小程序必须真实 HTTPS 接口。

```bash
cd client
pnpm install --frozen-lockfile
pnpm type-check
pnpm build:h5
VITE_API_BASE=https://你的域名/api pnpm build:app
VITE_API_BASE=https://你的域名/api pnpm build:mp-weixin
```

`dist/build/app` 是原生资源，不是 APK。Android 还需自己的 DCloud AppID/AppKey、包名、签名和官方 SDK；二开应修改本项目包名 `com.diankit.pilates`。替换 `manifest.json` 与 `androidPrivacy.json` 的真实经营者协议链接，按应用市场要求提交材料。本版手动核验签到，不申请相机、定位、通讯录权限。

仅本地模拟器可显式 `VITE_ALLOW_HTTP_API=1 VITE_API_BASE=http://10.0.2.2:18223` 构建测试资源，不能当正式公网包发布。小程序另需真实 AppID、合法域名、备案/类目和审核。

## 5. 备份与升级

每日用 `deploy/scripts/backup.sh` 备份库与上传文件，环境密钥另行安全保存。升级前备份，Flyway 只新增迁移；完整灾难恢复用 `restore.sh` 并核对目标。演示恢复是独立业务恢复，不是全环境出厂重置；必须双开关和超管、先业务 SQL.gz 备份，保留账户/配置/安全日志/门店规则与授权。禁止每日 `down -v` 清库，定时恢复用应用内 cron（默认关闭）。

## 6. 发布验收

完成真实前台收款/线下退款与账目核对、不同门店/身份隔离、末名额并发、候补/最低人数/爽约定时、安卓真机登录与约课、断网重复操作与备份恢复。真实支付/短信/应用市场审核等不能用模拟通过替代。

## 7. 共享演示服务器部署目标

当前演示目标为`https://plt.diankit.com/`，会员H5为`/h5/`，API为同域`/api/`。暖色版本已于2026-10-23完成线上部署与工程HTTP验收，详见《演示站部署验收记录-20261023》。APK安装包与硬件状态另见对应交付记录。App名称“轻序普拉提”、Android包名`com.diankit.pilates`，独立DCloud AppID/AppKey由部署者申请并与签名配置对应，不在源码保存真实密钥。

共享服务器使用项目的资源限制叠加文件：

```bash
cd deploy
# 先运行init-env.sh并填写本机私有.env。
# 示例环境：HTTP_BIND=127.0.0.1、HTTP_PORT=8093、NGINX_CONF=proxy.conf。
# Compose项目名可设为pilates-booking-demo，不能与其他产品相同。
docker compose -f docker-compose.yml -f docker-compose.demo-server.yml up -d --build
```

也可在私有.env使用`COMPOSE_FILE=docker-compose.yml:docker-compose.demo-server.yml`与`COMPOSE_PROJECT_NAME=pilates-booking-demo`，由Compose自动叠加。Web仅绑定本机8093，外层Caddy统一HTTPS；MySQL/Redis不对公网暴露。

公开演示可由经营者单独开启双开关并设置北京时间每日04:31恢复；对应六字段cron为`0 31 4 * * *`。恢复前备份，保留系统账号/配置/安全日志和门店配置/授权。**正式客户数据库保持APP_DEMO_RESET_ENABLED=false和cron关闭**，不能沿用演示站的自动恢复配置。源码默认仍关闭，真实环境文件与备份不进交付包。

部署者需验收管理登录、H5会员登录、真实课表/预约/取消、权限与门店隔离、HTTPS及备份。App安装和微信小程序审核是独立验收，不随H5上线自动完成。

## 8. 演示安装选项

`deploy/demo.env`是演示开关模板，不保存真实账号或密钥，必须随源码包保留。`./scripts/init-env.sh --demo`读取该文件，开启演示种子和业务恢复能力，默认恢复cron仍为`-`，PAY_MOCK_ENABLED=false；本产品前台实际收款/线下退款登记不依赖支付模拟通道。

正式客户运行不带`--demo`的初始化，保持演示数据和恢复关闭。每日04:31恢复仅在公开演示站的私有.env显式配置，不能把演示模板当正式客户参数。

## 2026-10-23 当前部署记录

本产品公开演示站已完成HTTPS、管理与H5资源、角色/系统设置/业务只读接口验收；本次管理员初始化与真实备份已核对。具体隔离参数、定时恢复与验证边界见[演示站部署验收记录](deployment-20261023.md)，原生包更新要求见[构建与后续更新要求](updates.md)。不把历史UI阶段记录视为当前最终交付状态。


---
官网公开文档：已移除内部维护段落。实际部署凭据不公开；未作为网页提供的包内文档以明确路径标注。APK与演示下载状态以产品页面为准。
