SFTPGo 使用组实现个人目录与公共共享目录
文章目录15 节
SFTPGo 的组配置可以同时提供两类入口:用户登录后的 Home 是个人目录,组里的虚拟目录则以 /shared 的形式挂载为公共目录。本文记录一套已经验证过的配置方式,适合全新的 SFTPGo 本地磁盘部署。
目标结构
用户不需要进入某个用户名目录再找文件,而是直接看到两个入口:
Home → 当前用户的个人目录
shared → 所有组成员共同访问的目录服务器上的目录结构如下:
/srv/sftpgo/data (独立的数据文件系统)
├── alice/ (alice 的个人根目录)
├── bob/ (bob 的个人根目录)
└── public_share/ (公共目录)flowchart LR
A[alice 登录] --> A1[Home]
B[bob 登录] --> B1[Home]
A1 --> P1["/srv/sftpgo/data/alice"]
B1 --> P2["/srv/sftpgo/data/bob"]
A --> S1["/shared"]
B --> S2["/shared"]
S1 --> V[public_share 虚拟目录]
S2 --> V
V --> P3["/srv/sftpgo/data/public_share"]这里有三个不同层次的名称,配置时不要混淆:
| 配置项 | 示例 | 含义 |
|---|---|---|
| 真实目录 | /srv/sftpgo/data/public_share | Linux 上实际保存文件的位置 |
| 虚拟目录名称 | public_share | SFTPGo WebAdmin 中的文件夹对象名称 |
| 挂载路径 | /shared | 用户登录后看到的入口 |
前提条件
本文以以下环境为例:
- SFTPGo 使用本地磁盘存储。
- SFTPGo 运行用户为 sftpgo。
- 用户基础目录为 /srv/sftpgo/data。
- /srv/sftpgo/data 已经是专用的 LVM 文件系统,而不是系统根目录下的普通目录。
如果你的数据目录不同,把文中的 /srv/sftpgo/data 统一替换为实际挂载点。不要只根据目录名称判断存储位置,先用 findmnt 检查。
准备公共目录
公共目录放在个人目录的同级位置,不放在某一个用户的目录里面。这样 alice 的私有文件不会因为目录继承关系意外暴露给其他用户。
风险等级:CAUTION(创建目录并修改权限)
作用: 创建公共目录,并让运行 SFTPGo 的系统用户可以读写。 执行对象: SFTPGo 服务器上的 Linux 文件系统。请把路径替换成你的实际数据文件系统路径。 前提: 先确认目标路径确实是预期的 SFTPGo 数据卷;这些命令不会删除已有文件,但会改变新目录的属主和权限。 完成验证: 使用后面的 stat 和 findmnt 检查属主、权限和挂载设备。
sudo mkdir -p /srv/sftpgo/data/public_share
sudo chown sftpgo:sftpgo /srv/sftpgo/data/public_share
sudo chmod 750 /srv/sftpgo/data/public_share风险等级:INFO(只读验证)
作用: 确认公共目录由 sftpgo 管理,并且仍位于预期的独立数据文件系统上。 执行对象: 同一台 SFTPGo Linux 服务器。 完成标准: stat 显示属主为 sftpgo:sftpgo,findmnt 显示目标文件系统为你的 SFTPGo 数据卷。
stat -c '%A %U:%G %n' /srv/sftpgo/data /srv/sftpgo/data/public_share
findmnt -T /srv/sftpgo/data/public_share -o TARGET,SOURCE,FSTYPE创建公共虚拟目录
登录 SFTPGo WebAdmin,进入 Folders,新建一个文件夹对象:
Name: public_share
Description: 公共共享目录
Storage: Local disk
Directory: /srv/sftpgo/data/public_share这里的 Directory 是 Linux 真实路径,不是用户看到的路径。保存后,SFTPGo 中会有一个名为 public_share 的虚拟目录对象。
创建主组
进入 Groups,创建一个 Primary 组,例如:
Name: StandardUsers
Type: Primary在 File system 中设置:
Storage: Local disk
Root directory: /srv/sftpgo/data/%username%%username% 是 SFTPGo 支持的组占位符。用户登录时,系统会把它替换成实际用户名:
alice → /srv/sftpgo/data/alice
bob → /srv/sftpgo/data/bob在组的 Virtual folders 中添加一行,四列应当是:
Mount path: /shared
Virtual folder: public_share
Sub-path: 留空
Quota size: 留空
Quota files: 留空最容易填错的是前两列和 Sub-path:
- Mount path 是用户看到的路径,所以填写 /shared。
- Virtual folder 选择刚才创建的 public_share。
- Sub-path 留空,表示挂载整个公共目录。
- 公共目录的配额字段留空即可,不要填 -1;-1 会把虚拟目录计入用户配额,不适合多个用户共享的目录。
正确的映射关系是:
/shared → public_share → /srv/sftpgo/data/public_share不要把 /shared 填到 Sub-path。如果填在那里,SFTPGo 会尝试访问 /srv/sftpgo/data/public_share/shared。
创建用户并加入主组
进入 Users,创建用户 alice:
Username: alice
Password: 设置用户密码
Storage: None
Primary group: StandardUsers再用相同方式创建 bob。选择 Storage: None 的含义是:用户的存储由主组提供,而不是在用户页面重新定义一套存储配置。
用户列表显示 Local disk 是正常的,因为这是最终生效的存储类型。用户编辑页面中,继承后的根目录应当分别是:
alice → /srv/sftpgo/data/alice
bob → /srv/sftpgo/data/bob用户页面 Virtual folders 中出现一行空白的 Select a folder 不代表组配置丢失,那是用来添加用户级附加目录的输入行。已经在主组中配置 /shared 时,不要在这里重复添加。
验证有效配置
在用户列表打开具体用户的 Actions,进入有效配置查看入口(不同版本可能显示为 Effective configuration)。应看到:
alice:
Root directory: /srv/sftpgo/data/alice
Virtual folder: /shared
bob:
Root directory: /srv/sftpgo/data/bob
Virtual folder: /shared如果有效配置显示 Login is denied,优先检查:
- StandardUsers 的类型是否为 Primary。
- 主组根目录是否为 /srv/sftpgo/data/%username%。
- 用户是否加入了 StandardUsers 作为 Primary group。
- 虚拟目录的 Mount path 是否填在最左列,Sub-path 是否留空。
登录测试
使用用户 alice 登录 WebClient 或 SFTP。登录后的两个入口应当是:
Home → /srv/sftpgo/data/alice
shared → /srv/sftpgo/data/public_share按下面的顺序验证隔离和共享:
- alice 在 Home 上传 alice-private.txt。
- bob 登录,确认在自己的 Home 中看不到 alice-private.txt。
- alice 进入 shared,上传 shared.txt。
- bob 进入 shared,确认可以看到 shared.txt。
验证结果应该是:个人文件相互隔离,公共目录内容对组成员可见。
LVM 位置确认
这套目录设计不会把公共文件放到系统根逻辑卷,前提是 /srv/sftpgo/data 确实是独立挂载点。例如本次环境中,数据目录对应独立的 SFTPGo LVM 逻辑卷:
/srv/sftpgo/data
└── /dev/mapper/sftpgo_vg-sftpgo_data因此下面三个路径都位于同一个 SFTPGo 数据文件系统中:
/srv/sftpgo/data/alice
/srv/sftpgo/data/bob
/srv/sftpgo/data/public_share如果 findmnt -T /srv/sftpgo/data 显示的是 /,说明数据目录并未独立挂载,此时不要照搬容量结论,应先重新规划文件系统。
常见错误
把 %Private% 当成占位符
%Private% 不是 SFTPGo 内置占位符。个人目录应使用:
/srv/sftpgo/data/%username%把公共目录挂载到 /
公共目录应挂载为 /shared,不要挂载到根路径 /。挂载到 / 会隐藏用户自己的根文件系统,个人目录和公共目录也就失去了清晰边界。
把公共目录放进某个用户目录
不要使用:
/srv/sftpgo/data/alice/shared公共目录应与用户目录同级:
/srv/sftpgo/data/public_share在用户页面重复添加公共目录
公共目录已经由主组提供时,用户页面的空白 Select a folder 行不需要再次填写。重复添加可能导致同一路径冲突或让排查变得困难。
结语
这套配置的核心只有三层:主组用 %username% 生成个人根目录,虚拟目录把公共存储映射到 /shared,用户只需要加入主组。最终用户看到的 Home + shared 两个入口,分别对应个人空间和公共空间;两者在服务器上又共同位于专用的 SFTPGo LVM 数据文件系统中。
官方参考: