Files

s-file 外网机部署包(ow)

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

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


1. 装机(三步)

# 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/ 就是站点根:

# 替换整个前端包
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-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 最后一节。