临时文件服务在重建后仍应知道谁能登录、文件在哪里、分享项还剩几次。Gokapi的配置与数据分属两个目录,本文给出固定版本Compose,并把重建验收放在收件人下载之前:先保留同一文件ID、剩余次数与到期时间,再验证那一次下载。
本文依据v2.2.4官方资料整理,是Linux云主机上的参考路径,未在ECS执行容器或业务验证;管理入口使用回环地址与SSH隧道。
1. 先分清三个保存位置
/app/config承接服务配置;本例SQLite数据库及上传数据属于/app/data相关目录;浏览器下载成品保存在电脑。保住服务器上的卷,不等于电脑收到文件,也不等于已有独立备份。
在Docker主机的终端执行;需要Docker Engine和Compose V2,使用有Docker权限的账号:
docker version
docker compose version
docker compose ls -a
docker volume ls --filter name=gokapi-demo
前两条应正常返回版本;连接daemon失败先启动Docker或修复当前账号权限,不继续写入。后两条用于识别同名项目与遗留卷:若已有gokapi-demo或相关数据卷,先停止本次练习并换一组全新项目名,不能删除旧卷或接着当空库初始化。以下假设没有冲突。
mkdir -p ~/gokapi-demo
cd ~/gokapi-demo
在这个目录保存完整的compose.yaml:
name: gokapi-demo
services:
gokapi:
image: docker.1ms.run/f0rc3/gokapi:v2.2.4
restart: unless-stopped
ports:
- "127.0.0.1:53842:53842"
environment:
TZ: Asia/Shanghai
volumes:
- gokapi-data:/app/data
- gokapi-config:/app/config
volumes:
gokapi-data:
gokapi-config:
镜像路径保留f0rc3/gokapi和v2.2.4,本例不跟随latest自动更换版本。命名卷由固定项目管理,不依赖宿主目录内碰巧存在的旧文件。
2. 启动服务,从电脑完成初始化
仍在Docker主机的~/gokapi-demo执行:
docker compose config --quiet && docker compose pull && docker compose up -d
docker compose ps -a
docker compose logs --tail=80 gokapi
首行任一步失败就停止,不根据后续页面猜测拉取成功。ps -a应有gokapi服务且为运行状态;无服务先核当前目录和项目名,Exited或反复重启则从日志处理原因。若提示端口已占用,先处理已有占用;不要只改一处端口后继续照抄向导地址。镜像获取失败可按报错核网络、标签与权限,本稿不把配置路径当作拉取实测。
如果Docker装在远端Linux云主机,在电脑终端先建立隧道,替换下面账号和主机名:
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:53842:127.0.0.1:53842 your_user@your_server
让这个窗口保持运行,再从电脑浏览器访问http://127.0.0.1:53842/。左侧地址是电脑监听端,右侧地址是SSH服务器访问的回环端;不需要对公网放开53842。若电脑提示端口占用或SSH认证失败,先解决隧道问题再继续。本文用同一个端口保证浏览器地址与Public facing URL一致;不要只把隧道左侧换端口而不改后续地址。
在电脑浏览器打开http://127.0.0.1:53842/setup。本例按全新数据卷做首次设置;若尚未完成本次设置就出现登录页,先查是否接回了旧实例或旧卷,停止按空库继续。确认属于本次实例且已完成设置后,才使用自己的管理员凭据登录。
按v2.2.4向导配置:Database选SQLite,数据库位置保留默认./data/gokapi.sqlite;Public facing URL填http://127.0.0.1:53842/;演示的Use SSL选No。Redirection URL可填http://127.0.0.1:53842/admin,它只控制无文件参数时首页去向,不能替代Public facing URL。
认证选择Username / Password,自设管理员账号与独立强密码。Storage选Local Storage;仅为下文无敏感内容的演示选择Level 0 - No encryption,不把下载密码当作文件加密。到Finish页点击Submit保存,成功后点Continue进入/admin登录。Docker内的“bind to localhost”选项不用于本例;宿主端的回环限制已由Compose的127.0.0.1端口绑定实现。
若/setup无法打开,先看上一节服务和日志;若云主机正常而电脑连接失败,核对SSH隧道是否仍在运行。若填错Public facing URL,先停止收发:在Docker主机原项目目录执行docker compose stop gokapi,再运行docker compose run --rm --service-ports gokapi /app/run.sh --reconfigure,使用终端显示的临时凭据进入设置页。改好地址并保存后,按Ctrl+C停止这个临时容器,再执行docker compose up -d恢复原服务,重新复制普通URL;不要新建空卷或公开管理端口来绕过。
3. 建立一个尚未消耗次数的分享项
在浏览器所在电脑用文本编辑器创建demo-delivery.txt,内容为以下两行;不要上传客户文件:
DEMO-DELIVERY-001
Only for Gokapi tutorial.
如果电脑有Bash终端,也可以生成同样的文件:
mkdir -p ~/gokapi-files
cd ~/gokapi-files
printf 'DEMO-DELIVERY-001
Only for Gokapi tutorial.
' > demo-delivery.txt
回到/admin。先设置限制,再上传:勾选Limit Downloads并填1;勾选Expiry,填1(右侧单位为Days);勾选Password,自设一个与管理员登录不同的下载密码。把演示文件拖到上传区,等上传结束、出现文件行后,核对名称、剩余次数和Stored until到期时间。这里的1天按上传完成时起算24小时,不是次日零点;先核对Stored until的实际时间。1天只是本次演示选择,实际资料按约定设置。
找不到文件行先确认上传进度与报错;剩余次数或期限不对时,点该行铅笔图标Edit,修正剩余次数或到期时间后点击Save changes,再核对;尚未核对前不交付链接。使用该行的URL按钮复制普通下载页地址,不用Hotlink直链,也不把管理员下载按钮当接收方入口。
先在管理页记下文件ID、剩余下载次数和Stored until到期时间,不在这时点击普通下载页的Download File。仅看到文件名还不够,同名重传可能生成另一个分享项;后续比对必须跟着原来的ID与URL。

4. 原项目重建后,沿同一个URL取文件
在收件浏览器消耗次数之前,可以先验证一次保留卷的重建。在Docker主机原目录执行:
docker compose up -d --force-recreate
docker compose ps -a
docker compose logs --tail=50 gokapi
服务恢复后重新访问/admin,必要时重新登录。应仍能找到刚才同一个文件ID、剩余1次和同一Stored until时间;找不到或回到首次设置页,先检查是否用了同一个目录、项目名与双卷,不重传掩盖数据丢失。管理员会话是否保留不作为数据验收标准。检查通过后再进入收件验证,避免拿已用尽的链接误判持久化失败。
如果需要确认实际挂载,在云主机执行以下第一条,取得非空容器ID后替换第二条占位参数:
docker compose ps -a -q gokapi
docker inspect --format '{
{range .Mounts}}{
{println .Destination .Type .Name}}{
{end}}' ACTUAL_CONTAINER_ID
空ID先查项目是否运行,inspect报对象不存在就重新取当前ID;不要拿旧容器ID下结论。输出应覆盖/app/data与/app/config两个volume,卷名与本次项目对应;缺项就先修配置。此检查只能说明挂载对象,不能代替找回原分享项及实际下载验证。
在同一台电脑另开一个未登录后台的浏览器或无痕窗口,粘贴刚复制的普通下载页地址。先试一个错误密码,应不能取得文件;换成正确密码后,点击Download File,并把文件保存到电脑。
打开保存的文本,逐行核对DEMO-DELIVERY-001与第二行内容。然后重新请求原下载页,应进入File not found等无法再下载的提示。后台未刷新时可能看到剩余次数变为0,刷新后该分享项也可能从活跃列表消失;不要求一定保留一行“已过期”。这里核的是服务端再次请求,浏览器已经保存的文件仍能打开。
如果第一次就不能下载,回查密码、剩余次数与到期时间;若第二次仍能下载,确认是否真正走了普通URL,以及是否误用了后台下载入口。页面能打开、密码能提交、浏览器开始下载,都不能代替文件内容核对。
5. 停止服务与规划恢复
暂停与恢复仍在Docker主机原目录操作:
docker compose stop
docker compose start
stop保留容器与卷;移除容器时也不要附带删除卷的选项。/app/config保存配置,SQLite和上传内容位于/app/data相关目录,双卷都要保留;迁移或备份需覆盖二者,并在目标环境验证恢复。数据卷存在不等于已经有备份。
本例使用SQLite时,做一致性备份可以先停止本项目,再按运维方案备份两个卷,完成后启动;只复制配置卷或在持续写入时随意拷数据库都不能直接宣称备份有效。生产迁移需另做恢复演练,本篇的保留卷重建没有模拟丢盘或跨主机恢复。
次数与时间是两个失效条件,先到者生效。普通下载页的浏览、对错密码提交本身不扣次数;请求进入文件下载处理后就可能扣次数,不能保证网络中断不扣。后台下载按钮走不同计数路径,不适合做限次验收。“1次”表示下载请求额度,不是1个人、1台设备或1次完整交付。
访问失效与磁盘清理也不同:官方实现有定时清理,不能承诺次数用尽的一刻磁盘立即腾空;接收方已经保存的副本不会被远程收回。本例不等待满1天,管理页的到期时间核对不冒充24小时失效实测。
本地演示只在这台电脑的不同浏览器间收发。127.0.0.1链接不能直接发给异地协作方;正式对外使用前需配置对方可达的HTTPS入口,并让Public facing URL匹配该入口,同时重新核验授权、容量、加密与备份。本例没有提供公网反代配置,也不以修改安全组、直接暴露HTTP管理端口代替这些工作。