From 2776914d0730e94eb8212f79a76ccc4361dfb0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E7=8A=80=E9=BA=9F?= Date: Fri, 4 Sep 2026 00:06:57 +0800 Subject: [PATCH] =?UTF-8?q?file.xpcool.com=20=E4=B8=8B=E8=BD=BD=E7=AB=99?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=88=B0=20FileBrowser=20Quantum(v1.5.5)?= =?UTF-8?q?=EF=BC=9B=E8=AE=B0=E5=BD=95=E9=83=A8=E7=BD=B2=E8=A6=81=E7=82=B9?= =?UTF-8?q?=E4=B8=8E=20CLI=20=E6=94=B9=E5=AF=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .workbuddy/memory/2026-09-03.md | 27 +++++++++++++++++++++++ .workbuddy/memory/MEMORY.md | 3 ++- .workbuddy/tmp/fbq-config.yaml | 9 ++++++++ .workbuddy/tmp/file.xpcool.com.conf | 34 +++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 .workbuddy/memory/2026-09-03.md create mode 100644 .workbuddy/tmp/fbq-config.yaml create mode 100644 .workbuddy/tmp/file.xpcool.com.conf diff --git a/.workbuddy/memory/2026-09-03.md b/.workbuddy/memory/2026-09-03.md new file mode 100644 index 0000000..1433993 --- /dev/null +++ b/.workbuddy/memory/2026-09-03.md @@ -0,0 +1,27 @@ +# 2026-09-03 工作日志 + +## file.xpcool.com 文件下载站上线(Filebrowser) +- **需求**:/data/share 文件经 file.xpcool.com 提供下载;仅下载 + 访问控制 + 临时分享。 +- **方案**:Filebrowser 容器(127.0.0.1:10880→80,restart unless-stopped)+ 宿主机 nginx 反代(80→301→443)。证书 file.xpcool.com_bundle.crt/.key 已上传至 /data/nginx/ssl/file.xpcool.com/。 +- **关键安全点**:/data/share 以 `:ro` 只读挂载 /srv —— 文件系统层面禁止任何写入;数据目录 /data/filebrowser/database(属主改容器 user uid=1000=lighthouse)。 +- **DNS**:file.xpcool.com → 193.112.118.168(用户加记录)。 +- **SSH 通道**:22025 曾禁+密码禁;用户重新绑定密钥后以 `CentOS.pem`(RSA)→xxcool 登录成功(root 被拒)。本机经 HTTP 代理 127.0.0.1:65195 可 CONNECT 443 但 22025 不通(502),需安全组放行直连。 +- **大坑记录**(filebrowser 新版 v2.3x): + 1. **不再默认 admin/admin**——全新 db 首次启动生成随机密码,仅打印在容器日志(`docker logs filebrowser` 找 "initialized with randomly generated password")。 + 2. db 是 **bbolt** 非 sqlite(sqlite3 读报 "file is not a database")。 + 3. CLI `users update` 走本地 HTTP/需服务停止操作 db,运行时直连 db 报 `Error: timeout`(文件锁);经 API PUT /api/users/1 改密码始终 400(invalid data type,需完整对象且字段严格)。 + 4. 镜像默认以 `user`(uid 1000) 运行(非 root),宿主挂载目录须 chown 1000 否则写库 permission denied。 + 5. **镜像 entrypoint 即 filebrowser**:docker run 传参勿重复 `filebrowser` 前缀。 + 6. ⚠️ **filebrowser 官方项目已于 2026-09-01 归档**(日志 NOTICE:停止发布与安全修复),已知问题见其 security/advisories;有分叉 FileBrowser Quantum 可关注。 +- **对外验证通过**:公网 https://file.xpcool.com 登录 → API 列目录返回两个安装包(精密智控平台 1.0.0/1.0.1,各 ~94MB)。注意 filebrowser 对 `HEAD /` 返回 404(无害,浏览器 GET 正常)。 +- **admin 初始密码**:`8iXK_m4z7TAHbiMQ`(重置后日志生成值;API 改密失败未改),待用户网页登录后自改。locale 默认 en,网页改 zh-cn。 +- **运维要点**:容器重建后如需找回密码看日志;/config 匿名卷保存 settings.json(port 80/root /srv/db 路径);旧 db 备份 /data/filebrowser/database/filebrowser.db.bak.*。 +- 部署脚本/说明:nginx conf 模板保留在 `.workbuddy/tmp/file.xpcool.com.conf`(scp 至 /tmp 后 sudo cp 到 /data/nginx/conf.d/ 并 reload)。 +- **账号管理补充**:API 建号/改密不可用(POST/PUT `/api/users` 均 400 "invalid data type",含最小 body 与 GET roundtrip,判定归档版 users 管理 API 受限)。结论:**改密/建只读账号/语言切换一律走网页 UI**(admin 登录后 设置→用户管理),CLI/API 勿再尝试。当前仅 admin 一账号。 +- **迁移到 FileBrowser Quantum(v1.5.5-stable,晚间完成)**:镜像 `gtstef/filebrowser:stable`(60MB 含 ffmpeg),容器 **fbq**:`127.0.0.1:10881→80`,restart unless-stopped;挂载 `/data/share:/srv:ro` + `/data/filebrowser-q:/home/filebrowser/data`(config.yaml+database.db+tmp 缓存全在此,chown 1000:1000=lighthouse)。nginx 反代已切 10881。旧容器 `filebrowser`(原版 10880)已 stop **保留回滚**。 + - **初始凭据**:admin/admin(与归档原版不同——原版随机密码打日志;Quantum 首启日志 "Resetting admin user to default username and password"),要求用户首登后立即改密。 + - config.yaml 最小配置:`server.cacheDir: /home/filebrowser/data/tmp` + `sources[0]: path=/srv, config.defaultEnabled: true, defaultUserScope: /`(模板在 `.workbuddy/tmp/fbq-config.yaml`)。 + - **Quantum API 变化**:POST /api/login、/api/users 等原版路径 404;API 需用户创建 long-live token(Swagger /swagger 亦需 token);管理操作走网页 UI。 + - 验证:公网 title "FileBrowser Quantum";容器内 /srv 两 exe 可见;touch /srv 报 Read-only file system(只读保护生效)。 + - 文档:官方 docs filebrowserquantum.com(v1.5.x stable 用 legacy database.db;v2.0.0 beta 权限模型大改 per-source:view/download/modify/create/delete per scope)。 +- **Quantum CLI 改密成功(2026-09-03 深夜)**:顶层语法 `filebrowser set -u admin,<新密码> -a -c /home/filebrowser/data/config.yaml`(其 --help 里 "Use 'set user' or 'set rule'" 是**误导**,实际没有 set user 子命令,直接顶层 `set -u`)。**坑**:① 服务运行中执行报 "the database is locked",须先 `docker stop fbq`;② 停服后无法 exec,用 `docker run --rm --entrypoint /home/filebrowser/filebrowser -v /data/filebrowser-q:/home/filebrowser/data gtstef/filebrowser:stable set -u ...` 改完再 start;③ 成功标志 `successfully updated user: admin`。**登录 API**(v1.5):POST `/api/auth/login`(原版 /api/login 及 /api/user/login 等均 404),错误与正确密码均返回 401 "user unauthorized" 无法区分,验证以浏览器为准。admin 新密码为 CLI 生成的 24 位 hex(见对话,用户可再网页自改)。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index 8182f05..55aa303 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -55,7 +55,8 @@ - service 后端容器:`service.xpcool.com:new`,`127.0.0.1:10100:10100`,网络 `xpcool-net`,env:`GF_GCFG_ENV=prod` + `DB_DSN=mysql:service:xxx@tcp(xpcool-mysql:3306)/service?...`(**必须带 mysql: 类型前缀**)+ `JWT_SECRET`;容器内必须有 `manifest/config/config.yaml`(基础配置),否则 GF 启动报「找不到 config」;构建目录 `/data/deploy/projects/service.xpcool.com/`(main + manifest/config + resource,Dockerfile 用 COPY manifest/config 整体拷贝)。 - DB:`xpcool-mysql` 容器(root 密码见该容器 env),库名 `service`,种子执行顺序 003→004→004b→007(服务器表结构旧,必须先 003 加列;导入用 `sudo sh -c 'docker exec -i xpcool-mysql mysql ... < file'` 宿主机重定向)。 - 权限映射:admin_menu type=2 行的 path 必须匹配实际路由(现为 `POST /api/service/admin/...`,见 manifest/sql/007_menu_permissions_v3.sql)。 -- SSH 凭据/密码不入库,需要时询问用户或查对话记忆;远程批量命令用 paramiko 脚本(`%TEMP%\wb_deploy\ssh_exec.py`,支持第 2 参数超时秒数),docker build 用服务器端 nohup+日志轮询防超时。 +- 文件下载站(2026-09-03 上线,当晚迁移):`file.xpcool.com` = **FileBrowser Quantum** 容器 `fbq`(`gtstef/filebrowser:stable` v1.5.5,`127.0.0.1:10881→80`,restart unless-stopped,`/data/share:/srv:ro` **只读挂载**,数据卷 `/data/filebrowser-q`:config.yaml+database.db+tmp,属主=镜像 uid1000)+ nginx 反代。**要点**:初始凭据 **admin/admin**(首登后立即改密);配置走 `config.yaml`(sources/cacheDir),管理走网页 UI;API 与原版不兼容(需用户建 long-live token,/swagger 亦需);镜像默认非 root(uid1000);原版 filebrowser(容器 `filebrowser`/10880/db `/data/filebrowser/database`)已于 2026-09-01 归档、现已停用**保留回滚**;Quantum v2.0 beta 权限模型改 per-source(view/download/modify/create/delete)。改密/建只读账号/临时分享(过期+密码+匿名)均在网页 UI。 +- SSH 凭据/密码不入库,需要时询问用户或查对话记忆;远程批量命令用 paramiko 脚本(`%TEMP%\wb_deploy\ssh_exec.py`,支持第 2 参数超时秒数),docker build 用服务器端 nohup+日志轮询防超时。**(2026-09-03 实测/更新)**:当前登录 = 项目目录 `CentOS.pem`(RSA) → `xxcool@193.112.118.168:22025`(root 被拒;密码登录已禁);安全组按出口 IP 限放 22025(本机出口 1.204.105.116 曾因未放行连不上,80/443 可达);本机旧记录 `~/.ssh/id_ed25519` 与 wb_deploy 脚本**在当前设备不存在**。 - **服务器安全加固(2026-08-27 完成)**:firewalld 已启用(放行 22025/80/443/3000/2222;cockpit/rpcbind 已停);fail2ban 保护 sshd(port=22025, maxretry5/bantime1h);监控脚本 `/usr/local/bin/server-monitor.sh` + cron 每 10 分钟(日志 `/var/log/server-monitor.log`,Bark 推送配 `/etc/server-monitor.conf` 的 `BARK_URL`);dnf-automatic 每天 06:00 自动安全补丁;SSH 密钥登录已部署(本地 `~/.ssh/id_ed25519`)但用户要求保留密码登录。**坑**:① 腾讯云安全组未放行 3000/2222/8081,Gitea 走 nginx 反代 80/443;② 改 sshd 前必须先 `sshd -t` 预检+备份(曾因脏行导致 SSH 断开);③ EPEL 源需腾讯云镜像(`mirrors.cloud.tencent.com/epel`)且 baseurl 必须手动写全;④ CentOS9 的 fail2ban 在 EPEL。 - 本地 pnpm 修复(2026-08-27 升级为 wrapper 方案):根因=本环境 MSYS 路径转换故障,把 `/c/...` 参数转成 `E:\c\...`(多 `E:\c\` 前缀)致 corepack shim 与 node 都找不到 pnpm.js。**已建持久 wrapper**:`~/.workbuddy/binaries/node/bin/pnpm`(内容:`export NODE_OPTIONS=--experimental-sqlite; exec "<托管node.exe>" "C:/Users/ybtdevxxl/.workbuddy/binaries/node/workspace/node_modules/pnpm/bin/pnpm.cjs" "$@"`,关键=给 node 传 Windows 风格路径 `C:/...` 规避 MSYS 转换)。**提交/构建前需 `PATH="~/.workbuddy/binaries/node/bin:$PATH"` 前置**,pre-commit 钩子(lefthook oxlint/oxfmt/eslint/stylelint/checkType)即可正常运行;否则钩子崩 → 只能 --no-verify。已验证 pnpm 11.16.0 + `pnpm exec oxlint` 1.79.0。 diff --git a/.workbuddy/tmp/fbq-config.yaml b/.workbuddy/tmp/fbq-config.yaml new file mode 100644 index 0000000..ac1370c --- /dev/null +++ b/.workbuddy/tmp/fbq-config.yaml @@ -0,0 +1,9 @@ +# FileBrowser Quantum (v1.5.x stable) 配置文件 +# 数据卷挂载点:/home/filebrowser/data(config.yaml + database.db + tmp 缓存都在此) +server: + cacheDir: /home/filebrowser/data/tmp # 缩略图/媒体缓存放在数据卷,可跨重启保留 + sources: + - path: /srv # 对应宿主 /data/share(容器内只读挂载 :ro) + config: + defaultEnabled: true # 默认授予所有新用户该源访问权 + defaultUserScope: "/" # 默认可访问范围为源根目录 diff --git a/.workbuddy/tmp/file.xpcool.com.conf b/.workbuddy/tmp/file.xpcool.com.conf new file mode 100644 index 0000000..f9c013b --- /dev/null +++ b/.workbuddy/tmp/file.xpcool.com.conf @@ -0,0 +1,34 @@ +# file.xpcool.com 文件下载服务:HTTPS 反代后端 FileBrowser Quantum(127.0.0.1:10881) +# 仅只读下载(/data/share 以只读方式挂载进容器,写入被文件系统层禁止) +# 2026-09-03 迁移:原版 filebrowser(10880 旧容器 filebrowser) → Quantum v1.5.5(容器 fbq) + +# HTTP -> HTTPS 跳转 +server { + listen 80; + server_name file.xpcool.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl http2; + server_name file.xpcool.com; + + ssl_certificate /data/nginx/ssl/file.xpcool.com/file.xpcool.com_bundle.crt; + ssl_certificate_key /data/nginx/ssl/file.xpcool.com/file.xpcool.com.key; + ssl_protocols TLSv1.2 TLSv1.3; + + # 大文件下载调优:关闭缓冲让文件流式转发,避免占用过多内存/磁盘临时文件 + proxy_buffering off; + proxy_request_buffering off; + proxy_read_timeout 600s; + proxy_send_timeout 600s; + + location / { + proxy_pass http://127.0.0.1:10881; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Auth-Request-Remote-User ""; + } +}