Files
KodouWZF 9be37fe7f8 fix(部署): 交付包容器内路径与老系统对齐,日志与临时目录落数据盘
库里 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 仍字节一致。
2026-11-05 01:07:54 +08:00
..

s-file 内网机部署包(iw)

本目录就是一台内网服务器的完整部署包:镜像 tar、前端静态包、SQL、配置、安装脚本都在里面, 整目录拷到内网机即可装机,不需要联网、不需要回仓库取任何东西。

外网机用同级的 ../ow/,两份除了 .env 与 web/(前端内/外网包)之外完全一样。 完整拓扑、两侧差异表、已知坑见仓库里的 ../部署说明.md。


1. 装机(三步)

# 1) 整目录拷到内网机,例如 /opt/sfile-iw
cd /opt/sfile-iw

# 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 内网机固定 1(外网机是 2)。写反了摆渡方向就反了
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/ 就是站点根:

# 替换整个前端包
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. 运维

docker compose ps                          # 状态(5 个都该是 healthy)
docker logs -f sfile-iw-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 最后一节。