HOME

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_shareLinux 上实际保存文件的位置
虚拟目录名称public_shareSFTPGo 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,优先检查:

  1. StandardUsers 的类型是否为 Primary。
  2. 主组根目录是否为 /srv/sftpgo/data/%username%。
  3. 用户是否加入了 StandardUsers 作为 Primary group。
  4. 虚拟目录的 Mount path 是否填在最左列,Sub-path 是否留空。

登录测试

使用用户 alice 登录 WebClient 或 SFTP。登录后的两个入口应当是:

Home    → /srv/sftpgo/data/alice
shared  → /srv/sftpgo/data/public_share

按下面的顺序验证隔离和共享:

  1. alice 在 Home 上传 alice-private.txt。
  2. bob 登录,确认在自己的 Home 中看不到 alice-private.txt。
  3. alice 进入 shared,上传 shared.txt。
  4. 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 数据文件系统中。

官方参考:

SFTPGo Linux 文件共享 LVM