一件每天都会发生的小事
下班前,你用 AI 生成了一份带交互的产品演示页,或者一篇配图齐全的 Markdown 笔记。想发给同事、发给客户、发到群里让人看一眼——然后你卡住了。
发文件过去,对方要下载。微信里发个 HTML,对方打开是乱码;发个 MD,对方连 Markdown 是什么都不知道。你还得附一段"用浏览器打开"的说明,像在给人写小抄。
丢到网盘,数据就出了公司。合规那关过不去。网盘的分享链接又臭又长,过期了、改了权限,你都不知道。
自己搭静态托管,要一台服务器。申请机器、装 Nginx、配域名、传文件、设权限——比写那个页面还久。就为发一眼。
这三件事,每件单独都不算大事,但每天来一遍,磨人。PageRelay 就是替你把这三件事压成一个动作。
本地文件→拖进来→一条链接→对方直接看
share.你的域名.com/s/k7Hm
把这条发给谁都行,不下载、不装环境。
不想发了,把分享开关关掉,这条链接当场失效;再开,会生成新的一条。发出去的东西,你随时收得回。
HTML 在独立的公开域里跑,沙箱隔离,不会动到你管理端的会话;Markdown 走安全渲染,剥掉危险节点。
它不替你存几 TB 的素材库,也不跟对象存储比。它只覆盖这一类"传一眼就完事"的场景——但这类场景,每天都在发生。
怎么把它跑起来
一个二进制 + 一个 SQLite 文件 + 一个磁盘目录,丢到任意 Linux 机器上就能跑,没有外部依赖。
构建
# 需要 Go 1.26+;静态编译,目标机无需 libc
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -trimpath -ldflags='-s -w' -o filehub .
跑起来
# 管理端 :8080,公开分享端 :8081
./filehub \
-listen 0.0.0.0:8080 \
-share-listen 0.0.0.0:8081 \
-public-base https://share.你的域名.com \
-db /var/lib/filehub/filehub.db \
-data /srv/filehub/users
首次启动自动建管理员 admin,日志会提醒你首次登录后改密。更稳妥的是用 -admin-password-file 指定初始密码,写入后删掉那个文件。
用 systemd 守住
# /etc/systemd/system/filehub.service
[Service]
Type=simple
User=filehub
ExecStart=/usr/local/bin/filehub \
-listen 0.0.0.0:8080 \
-share-listen 0.0.0.0:8081 \
-public-base https://share.你的域名.com \
-cookie-secure
Restart=on-failure
sudo systemctl daemon-reload
sudo systemctl enable --now filehub
反向代理 + TLS
用 Nginx 或 Caddy 把管理端、公开端分别绑到不同域名,开 HTTPS。开了 HTTPS 就记得加 -cookie-secure。
# relay.你的域名.com → 127.0.0.1:8080 (管理端)
# share.你的域名.com → 127.0.0.1:8081 (公开分享端)
location / { proxy_pass http://127.0.0.1:8080; }
client_max_body_size 2g; # 与上传上限对齐
完整参数(-listen / -share-listen / -public-base / -admin-password-file / -cookie-secure)见仓库的 README。