docker nextcloud 与 samba 共享问题
解决方案
因为 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。只要将其修改为 002
即 775
即可。
要实现此项修改需要编辑 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