库里 xs_file_record.file_path 存的是 file.upload-dir 拼出来的绝对路径,老系统是 /var/s-file/upload,新包之前写 /data/upload 会让接老库的历史文件全部读不到(只能迁库), 现在容器内逐字一致,宿主机侧仍由 .env 的 SFILE_DATA_ROOT 决定。 顺带把两处老配置没真正落地的补上: - logging.file.name 沿用 /usr/local/logs/s-file.log。之前 /app/logs 挂载是空的——yml 没设 文件日志,输出只进 docker 的 json-file 且不封顶;同时给 app 的 json 日志加 20m×5 上限 - java.io.tmpdir 用 -D 指到 upload 挂载内。老项目把这行写在 application.properties 里 并不会改 JVM 系统属性,等于没生效;现在 500MB 上传缓冲落在数据盘而不是容器 overlay 层 摆渡目录保持容器内 /data/transfer/*:光闸需要能单独挂它,嵌进 upload 树会把整个文件库 暴露给光闸,而传输包是过路文件、路径不入库。宿主机侧照旧可与老机器同路径(GATE_*)。 内外网两套 compose/config/install.sh 仍字节一致。
113 lines
5.7 KiB
Markdown
113 lines
5.7 KiB
Markdown
# 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 注入)
|
||
│ ⚠ 别改 file.upload-dir:库里存的是它拼出来的绝对路径前缀
|
||
├── 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) 最后一节。
|