解决方案

因为 docker nextcloud 的服务器用户身份为 www-data 的编号为 33,与主机上的 xfs 账户相对应,因此,在 samba 中添加 xfs 用户,并通过 smbusers 映射不同的用户名即可。

sudo smbpasswd -a xfs
设置密码
sudo nano /etc/samba/smbusers

# Unix_name = SMB_name1 SMB_name2 ...
root = administrator admin
nobody = guest pcguest smbguest
xfs = herald rita

特别注意

使用 smbusers 身份映射功能时,需要确认 /etc/samba/smb.conf 配置文件中是否启用了该功能:

[global]
...
username map = /etc/samba/smbusers
...

问题一:容器和主机用户映射的问题

Nextcloud 运行在 Docker 容器中,主机映射目录到容器 /var/www/html 目录。Nextcloud 容器使用的是 php:7-apache 作为基础镜像,底层为 debian 镜像。apache 运行身份为 www-data 系统用户,编号为 33

Alpine Linux 为宿主机,其上编号为 33 的用户为 xfs。在主机上查看映射目录权限所有者和组均为 xfs。每种 Linux 发型的用户名与编号对应各部相同,用户名只是便于人类识别,Linux 只认用户编号。

问题二:所属组没有写权限的问题

在 nextcloud 的 WEBUI 上新增文件夹和文件,虽然同为 33 号用户和用户组所有,但所有者权限为 rwx 权限,组权限却为 rx 没有写权限。

由于使用 samba 共享时要要使用普通用户身份,想要获得对 nextcloud 目录的访问权限就需要将普通用户加入到 33 号用户组中。问题在于普通用户虽然可以访问共享,但对 nextcloud 中的文件只能查看不能管理。

解决办法是修改 www-data 系统用户的 umask 值,默认为 022 即 755。只要将其修改为 002775 即可。

要实现此项修改需要编辑 apache2 的 envvars 文件,在文件末尾添加:

umask 002

一劳永逸的办法是创建 Dockerfile 构建一个自己的 nextcloud 镜像:

FROM nextcloud
RUN echo 'umask 002' >> /etc/apache2/envvars
sudo docker build -t getnas/nextcloud .

然后使用新镜像创建容器即可。

问题三:samba 共享仍不可写

前面的设置已经妥当,在 samba 共享中访问权限恰当的新目录和文件仍旧不可写。

这是由于 samba 共享的配置中缺少 writable = yes 所致。

[Herald]
comment = nextcloud herald
path = /mnt/disk/nextcloud/data/Herald/files
browseable = yes
public = yes
writable = yes

参考