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. 装不上时先看这三条
images/少 tar 或 sha256 不对 → 交付盘拷坏了,重拷(install.sh会明确报哪一条)。- 架构不符(信创 ARM 机装了 amd64 包)→
install.sh会拦;回构建机用TARGET_PLATFORM=linux/arm64重新出包。 - 端口/网段与机器上已有容器冲突 → 改
.env的WEB_PORT,或整段换APP_SUBNET/APP_GATEWAY/APP_NODE_IP(三个值必须同网段)。
其余坑(发号器 workerId、nginx 透传 Host、PostgreSQL 18 数据目录挂载点、监听周期与传输快慢)
见 ../部署说明.md 最后一节。