部署教程
SFTPGo 部署教程:独立账号、文件上传与目录权限
使用 VPS 部署 SFTPGo,介绍配置、访问方式、实际操作及数据备份。
开始前
给别人传一批文件,最省事的做法常常是把服务器账号发过去。这会同时交出更多权限:对方可能看到无关目录,账号也很难在交接完成后彻底收回。SFTPGo 适合把文件交接从系统登录中分离,给每个接收者一个独立用户,只开放需要的目录和操作。
这次从本地文件存储、SFTP 上传和 Web 管理开始。FTP、WebDAV、对象存储和自动化事件都可以以后再接。先验证一个普通用户能上传、能下载、不能访问别人的文件,再考虑让这项服务接收真正的业务资料。
部署前先确认 VPS 的磁盘、内存和公网访问条件,也可以查看雨云云服务器;注册时填写优惠码 `KuZhuJi`。
注册推荐码:KuZhuJi
管理员与传文件的用户是不同身份
管理员负责创建账号、权限、配额和目录映射,普通用户负责文件操作。不要让接收资料的人使用管理员账号,也不要把 SFTPGo 用户和 VPS 上的系统 SSH 用户混在一起。
网页管理只通过私人通道访问,文件用户则使用单独的 SFTP 端口。服务器自己的 SSH 管理端口保持原用途,两个服务不要占用同一个端口。
如果只是偶尔交接,也可以全程通过 SSH 转发开放给自己,再由自己代为上传;需要直接给他人使用时,才安排 SFTP 公网入口和相应访问限制。敏感资料交接完成后要有清理规则,文件管理工具不会替你决定保存多久。
两个挂载目录都要保留
官方普通镜像默认使用 UID/GID `1000`。`/srv/sftpgo` 放用户文件及备份等内容,`/var/lib/sftpgo` 保存应用工作目录中的配置数据、主机密钥等持久内容。只挂载前者,重建时可能丢失服务身份和其他必要状态。
mkdir -p ~/services/sftpgo/data ~/services/sftpgo/home
cd ~/services/sftpgo
sudo chown -R 1000:1000 data home保存为 `compose.yaml`:
services:
sftpgo:
image: drakkan/sftpgo:v2.7.6
ports:
- "127.0.0.1:8086:8080"
- "127.0.0.1:2022:2022"
volumes:
- ./data:/srv/sftpgo
- ./home:/var/lib/sftpgo
environment:
SFTPGO_GRACE_TIME: "32"
stop_grace_period: 40s
restart: unless-stopped这里使用官方文档列出的版本标签;安装前检查该版本的支持及更新情况,维护时按发行说明更新。普通镜像与 distroless 等变体的默认数据提供程序和可用工具不同,不能换了标签还认为行为完全一样。
`SFTPGO_GRACE_TIME` 给已有连接留出关闭时间,Docker 的等待时间设得略长于它。它有助于正常关停,但不代表断电或强制终止时正在传输的文件一定完整。接收重要文件仍应在上传完成后核对大小或哈希。
docker compose config --quiet
docker compose up -d
docker compose logs --tail=80 sftpgo首次管理只走私人入口
同时转发网页和 SFTP 测试端口:
ssh -L 18086:127.0.0.1:8086 -L 12022:127.0.0.1:2022 user@your-server本机打开 `http://127.0.0.1:18086/web/admin`,创建首个管理员。后台创建一个测试用户,例如 `handoff`,将本地存储的主目录放在 `/srv/sftpgo/data/handoff`,并设置只满足本次交接的权限。
不要直接把宿主机根目录或整个站点目录挂给普通用户。需要共享资料时准备独立的交接目录,明确谁可以上传、下载、删除、改名和创建子目录。上传者只需要交资料时,可以限制额外操作;涉及只上传不读取的场景,逐项验证实际客户端行为后再使用。
准备独立实例时,可在雨云选择适合的云服务器配置,优惠码 `KuZhuJi`。配置按实际任务选择,数据库和附件另做备份。
用普通客户端验证目录边界
用测试用户连到本地转发端口,不要使用管理员身份测试传输。首次出现主机指纹提示时,通过可信方式核对服务身份后确认;恢复或重建时保存主机密钥,可以减少无意变更指纹的问题。
sftp -P 12022 handoff@127.0.0.1进入交互界面后执行上传与下载:
pwd
ls
put sample.txt
get sample.txt received.txt测试前在本机准备 `sample.txt`。下载后比较内容,或者用哈希检查传输结果。再尝试进入另一个用户的目录,并确认无法访问;权限边界需要从普通用户看到的路径判断,而不是看管理员设置页上的目录名称。
如果操作失败,分清应用权限和宿主文件权限。应用允许上传,但 UID `1000` 无法写入挂载目录,也会失败。反过来,宿主目录可写并不代表普通用户应该有删除权限。先检查日志和目录属主,别把权限统一改为 `777`。
开放公网只放实际需要的协议
确认测试正常后,确有直接访问需求时,可以把 SFTP 映射改为 `2022:2022`。网页管理的 8086 仍绑定回环地址。需要 WebClient 时再为网页入口单独配置 HTTPS,并检查管理员与普通用户入口的访问范围。
Docker 发布端口的流量路径可能不同于宿主机普通服务,设置防火墙后从另一台机器实际测试允许和拒绝的来源。不要只看某个防火墙命令显示成功便判断端口已经限制。云平台安全组和宿主机规则也应一致。
账号凭据由接收者本人保存;适合采用公钥认证的用户,核对并登记其公钥。离开或交接结束时禁用账号并撤销相关密钥,检查共享链接、活动连接及自动化凭据是否还需要保留。不要为了下一次方便,把所有临时账号长期放着。
需要增加服务器时,可以打开雨云选购页面,填写优惠码 `KuZhuJi`;迁移前保留数据与原有部署配置。
配额与保留时间一起确定
先为用户安排合理的存储范围,定期检查实际目录占用。应用配额统计、外部工具直接写入的文件和底层磁盘剩余空间,不一定始终同步;有人绕过应用往目录里放文件后,应按当前版本的管理能力核对统计。
交接约定最好写清文件命名、上传完成标志和删除时间。例如接收方确认后再清理,而不是按修改时间一刀切删除;一份仍在传输的大文件可能具有较早的时间信息。需要自动化清理时,先在副本上验证规则,不把第一次运行直接对准正式目录。
重要交接可以由发送方提供文件哈希,并由接收方核对。哈希能帮助识别内容是否一致,不负责判断文件来源是否可信。可执行文件和脚本照常按业务要求审查,别因为它通过了私人 SFTP 入口就直接运行。
备份用户文件与服务状态
后台导出的用户与管理数据,不能默认包含所有用户实际上传的文件。实例恢复至少需要把配置数据、主机密钥和文件内容一起纳入计划。本例暂停服务,对两个挂载目录及 Compose 做一致副本:
mkdir -p backups
docker compose stop sftpgo
tar -czf "backups/sftpgo-$(date +%F-%H%M%S).tar.gz" data home compose.yaml
docker compose start sftpgo把备份保存在服务器之外,限制权限。大型文件目录不适合每次都全量打包时,另选适合的文件备份工具,并保留数据库及服务身份的独立恢复步骤。改用外部数据库或对象存储后,不能继续把两个本地目录视为完整备份。
恢复演练使用同版本镜像和独立目录,先检查管理员、普通用户和主机指纹,再验证上传、下载、目录限制和配额。只有数据能读、权限仍按预期生效,这项交接服务才算恢复完整。
