Files
senmesh-zc/deployment/ow/README.md

112 lines
5.6 KiB
Markdown
Raw Normal View History

# s-file 外网机部署包(ow)
本目录**就是**一台外网服务器的完整部署包:镜像 tar、前端静态包、SQL、配置、安装脚本都在里面,
整目录拷到外网机即可装机,不需要联网、不需要回仓库取任何东西。
内网机用同级的 `../iw/`,两份除了 `.env` 与 `web/`(前端内/外网包)之外完全一样。
完整拓扑、两侧差异表、已知坑见仓库里的 [`../部署说明.md`](../部署说明.md)。
---
## 1. 装机(三步)
```bash
# 1) 整目录拷到外网机,例如 /opt/sfile-ow
cd /opt/sfile-ow
# 2) 改配置:至少确认 MeshSafe(没接检测就把 MESHSAFE_ENABLED 改成 false)
vi .env
# 3) 一键装:自检 -> 校验并载入镜像 -> 建数据目录 -> 起栈 -> 等健康
./scripts/install.sh
```
装完会打印访问地址 `http://<本机IP>:<WEB_PORT>`。**首次登录后立刻改掉 admin 的初始口令。**
重复执行 `install.sh` 是安全的:只重建有差异的容器,不动已初始化好的数据库。
---
## 2. 目录说明
```
├── docker-compose.yml 5 个服务(web/app/pg/redis/mq),现场不改
├── .env 本机全部可变项:角色/端口/口令/目录/MeshSafe ← 只改这个
├── config/application.yml 后端静态默认配置,不放任何口令(口令走 .env 注入)
├── nginx/web.conf 前端站点 + /api 反代,改端口/上传上限时看这里
├── web/ 前端静态包(外网包),挂进 nginx 当站点根
├── sql/01-init-table.sql 全量建表 02-init-data.sql 初始数据(admin、机构、平台编码)
├── sql/upgrade/ 已上线老库的增量脚本,新装不用跑(见 sql/README.md)
├── images/*.tar 5 个镜像 + SHA256SUMS.txt
├── scripts/install.sh 一键安装
└── volumes/ 运行时数据,install.sh 自动创建
├── pgdata/ redis/ mq/ 三个中间件的数据
├── upload/ 用户上传的文件本体
├── logs/ 后端日志(logs/nginx 是前端访问日志)
└── gate/out/ gate/in/ 光闸摆渡:本机发出 / 本机收到
```
数据全在宿主机 `volumes/` 下,容器删了数据还在。要放到独立数据盘就改 `.env` 的
`SFILE_DATA_ROOT`(以及 `GATE_SEND_DIR`/`GATE_RECV_DIR`)为绝对路径,重跑 `install.sh`。
---
## 3. 现场要确认的 6 件事(都在 `.env`)
| 项 | 变量 | 内网机出厂值 / 建议 |
|---|---|---|
| 前端对外端口 | `WEB_PORT` | `80`;被占用就改 8080/9080,同步改访问地址 |
| 数据盘根目录 | `SFILE_DATA_ROOT` | `./volumes`;正式环境建议改绝对路径指到独立数据盘(≥200G) |
| 光闸摆渡目录 | `GATE_SEND_DIR` / `GATE_RECV_DIR` | `./volumes/gate/out` / `in`;**与光闸厂商确认挂载点**,发出与收到必须是两个不同目录 |
| 传输方向 | `SFILE_TRANSFER_LOCATION` | 外网机固定 `2`(内网机是 `1`)。**写反了摆渡方向就反了** |
| MeshSafe | `MESHSAFE_ENABLED` / `_BASE_URL` / `_CLIENT_ID` / `_SECRET` | 没接检测 → `MESHSAFE_ENABLED=false`;接了 → secret 必须与 MeshSafe 侧 `MESHSAFE_API_CLIENTS` 白名单里的 `client_id:secret` 逐字一致 |
| 口令 | `POSTGRES_PASSWORD` / `MQ_PASSWORD` / `JWT_SECRET` / `USER_DEFAULT_PASSWORD` | 出厂已给随机值可直接跑;`USER_DEFAULT_PASSWORD` 是新建用户的初始密码,**必须改并告知业务员** |
---
## 4. 改前端页面(不用重建镜像)
前端是解压好的静态包,`web/` 就是站点根:
```bash
# 替换整个前端包
rm -rf web && cp -r /path/to/new/dist web
docker compose restart web
# 只改单个文件(例如临时改个文案)
vi web/assets/xxx.js # 或替换 index.html
docker compose restart web # 浏览器再强刷一次(Ctrl+F5)
```
`web/` 是只读挂载,容器不会写它;改坏了从仓库 `frontend/` 重新构建一份覆盖即可。
构建产物的文件名自带 hash,`index.html` 不做缓存,所以换包后用户浏览器会自动取到新文件。
---
## 5. 运维
```bash
docker compose ps # 状态(5 个都该是 healthy)
docker logs -f sfile-ow-app # 后端日志(含送检/摆渡全过程)
docker compose restart app # 改完 .env / config 后重启后端
docker compose restart web # 替换 web/ 里的前端文件后刷新站点
docker compose down # 停止(不动数据)
```
**备份只需三样**:`volumes/pgdata`(库)、`volumes/upload`(文件本体)、`.env`(口令)。
恢复:换机器后按原路径放回 + `docker load` + `./scripts/install.sh`。
改了 `.env` 里的口令/网段这类**建容器时固化**的值,光 `restart` 不生效,要
`docker compose up -d`(重建容器)。数据库口令属于建库时写入,改它要连 `volumes/pgdata` 一起处理。
---
## 6. 装不上时先看这三条
1. `images/` 少 tar 或 sha256 不对 → 交付盘拷坏了,重拷(`install.sh` 会明确报哪一条)。
2. 架构不符(信创 ARM 机装了 amd64 包)→ `install.sh` 会拦;回构建机用 `TARGET_PLATFORM=linux/arm64` 重新出包。
3. 端口/网段与机器上已有容器冲突 → 改 `.env` 的 `WEB_PORT`,或整段换 `APP_SUBNET`/`APP_GATEWAY`/`APP_NODE_IP`(三个值必须同网段)。
其余坑(发号器 workerId、nginx 透传 Host、PostgreSQL 18 数据目录挂载点、监听周期与传输快慢)
见 [`../部署说明.md`](../部署说明.md) 最后一节。