Docker: Mount volume for just data

Created on 30 Jan 2018  路  21Comments  路  Source: nextcloud/docker

I want to mount a volume that is just for my data (images, documents etc...) so that it lives outside of docker.
I tried to do something like this:

  app:  
    image: nextcloud:fpm
    restart: always
    volumes:
      - nextcloud:/var/www/html
      - /mnt/nas/nextcloud/data:/var/www/html/data
    environment:
      - POSTGRES_HOST=db
    env_file:
      - db.env
    depends_on:
      - db

But I'm getting the following message

Your data directory is readable by other users

Please change the permissions to 0770 so that the directory cannot be listed by other users.

The most important use case for this is to put the data on my NAS instead of on the server running nextcloud. And as it's just for personal use I don't care if anyone can see my files outside of nextcloud.

Most helpful comment

@ulrikstrid
There are two options to fix this problem.
You can either fix the permissions of your mount point. If you use smb take a look at the mount options. (https://linux.die.net/man/8/smbmount)
Or you can use the new config option to disable the permission check 'check_data_directory_permissions' => false,(https://docs.nextcloud.com/server/12/admin_manual/configuration_server/config_sample_php_parameters.html)

All 21 comments

So I did a "workaround" for this and mounted my /mnt/nas/nextcloud/data to a different place in the container and then added a "external storage" from local and now I can put my shared images there.

So I guess this is mostly solved for me but maybe someone else needs this? Feel free to close if not.

Final snippet that I used:

  app:  
    image: nextcloud:fpm
    restart: always
    volumes:
      - nextcloud:/var/www/html
      - /mnt/nas/nextcloud/data:/mnt/nas/nextcloud/data:rw
    environment:
      - POSTGRES_HOST=db
    env_file:
      - db.env
    depends_on:
      - db

@ulrikstrid
There are two options to fix this problem.
You can either fix the permissions of your mount point. If you use smb take a look at the mount options. (https://linux.die.net/man/8/smbmount)
Or you can use the new config option to disable the permission check 'check_data_directory_permissions' => false,(https://docs.nextcloud.com/server/12/admin_manual/configuration_server/config_sample_php_parameters.html)

I'm not sure how I should do the second, would love a environment variable to set it.
But maybe the first option is what I should do anyway

I'm doing the same I think:
Using nextcloud docker (apache + mariadb + reverse proxy nginx) with a a separate hard drive of the host mounted inside the container. In nextcloud this drive is an external storage. Its file system is NTFS.
I did this by mounting the drive in the container as you did.
Just for information. If you want to see my docker compose file - let me know.

@topas-rec I am running into the same problem, but not sure how to solve it. Would you post your compose file?

version: '3'

services:
  db:
    image: mariadb
    # image: mysql
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=[...]
    env_file:
      - db.env

  app:  
    image: nextcloud:apache
    restart: always
    volumes:
      - nextcloud:/var/www/html
      - /mnt/DATA:/usr/local/DATA
    environment:
      - VIRTUAL_HOST=[...]
      - LETSENCRYPT_HOST=[...]
      - LETSENCRYPT_EMAIL=[...]
      - MYSQL_HOST=db
    env_file:
      - db.env
    depends_on:
      - db
    networks:
      - proxy-tier
      - default

  proxy:
    build: ./proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    volumes:
      - certs:/etc/nginx/certs:ro
      - conf.d:/etc/nginx/conf.d
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxy-tier

  letsencrypt-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    volumes:
      - certs:/etc/nginx/certs
      - conf.d:/etc/nginx/conf.d
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy-tier
    depends_on:
      - proxy

volumes:
  db:
  nextcloud:
  certs:
  conf.d:
  vhost.d:
  html:

networks:
  proxy-tier:

My local drive path is /mnt/DATA

Hello,
Have same problem.
This is my docker-compose file:

version: '2'

services:
  db:
    image: postgres
    restart: always
    volumes:
      - db:/var/lib/postgresql/data
    env_file:
      - db.env

  app:
    image: nextcloud:apache
    restart: always
    ports:
      - 8181:80
    volumes:
      - nextcloud:/var/www/html
      - ./data:/usr/local/DATA:rw
    environment:
      - POSTGRES_HOST=db
    env_file:
      - db.env
    depends_on:
      - db

volumes:
  db:
  nextcloud:
  data:

In nextcloud: the folder say this: You do not have permission to send or create files here
How to make good link with docker-configuration and nextcloud ?

thank.

Hi folks,

I also mount some host folder into NC's container in order to use it as NC external storage and access files from outside of the container.

However, since NC is running as user www-data _inside_ the container, _outside_ of the container file permissions do not allow me to write/delete/... files with my regular host user account. How did you solve this problem? Do you even care and edit files from within NC only?

Thanks+Cheers

@bbesser
This is not a common use case. And even without docker this would cause some problems. Nextcloud itself forces the permission of the date directory to be 0770 to allow only the web-server access to the data. (It would also require you to set-up a occ files:scan cronjob)

But i agree that it would be nice to have a way to change the UID.
I would be happy to accept a pull request adding this functionality.

@tilosp
I would guess that the use case is likely to be important for anybody running NC on their home server, e.g. for sharing files with friends.

I have a occ files:scan job running, indeed :-D

External storage in NC can also reside in some SFTP account (among WebDAV, local folder, ...). Using SFTP lets me log into my host user's account. Another approach would be to use an sshfs docker volume (vieux driver) and mount it into NC's container, such that external storage could be configured using a local folder.

Both approaches have upsides and downsides:
Good: takes care of ownership/permission translation.
Bad: Huge performance overhead (but might still be ok in case of low overall load on NC).

Do you see any pitfalls?

Thanks!

For everyone having problems currently:

I built the setup (mount my dual boot ntfs hard drive into NC by mounting the drive into the NC container (shown above)) the second time now.
I did it using Ubuntu and now on Linux Mint.
I have never used extra configurations like cron jobs. Just mounted it.
I never had problems (except of rare file locking errors - which seem to happen also on regular installs)

I use this NC more or less because of this setup because it's simple and data goes direct to my hard drive. I am not aware of security issues, though.

For everyone's information...

@topas-rec

I have never used extra configurations like cron jobs. Just mounted it.

I suppose you're responding to the scan-job @tilosp and I mentioned.

[mounting] is simple and data goes direct to my hard drive.

Your setup is fine if you're modifying files only from within NC and consequently data _only_ has to travel from NC to your hard drive. If you _also_ need to modify files on your hard drive ('outside modifications') and need outside modifications to be reflected in NC, then NC won't recognize those by itself: you have to tell NC about outside modifications--hence the scan cron job.

There is no need, however, to tell NC about outside modifications in case you're using external storage. Therefore I'm taking this approach.

Problem remaining to be solved: External storage in form of a local folder (mounted within NC's container) is read/written with NC's user and according permissions, which prevents outside modifications with my _actual_ user account. This problem can be solved by explicitly logging into my user account, e.g. with sshfs. At this point there are the options to configure sshfs from within NC or to use an sshfs docker volume (quite large performance overhead due to sshfs, but ok for my personal use case).

EDIT: Option two does also suffer from ownership-mappping problems. File owner in the mounted volume is not www-data, in general.

I suppose you're responding to the scan-job @tilosp and I mentioned.

Yes you're right.

Thanks for your detailed explanation. I wasn't aware that the outside-modifications which I definitely do are reflected in NC just because I use the external storage.

I think I should also have the issue that you described and which is still not solved because my setup is the same as yours. The only difference seems to be that I use an external folder with NTFS filesystem. (The filesystem does not take care of user and owners I guess. Ntfs-3g makes all files belonging to root, doesn't it?)

Problem remaining to be solved: External storage in form of a local folder (mounted within NC's container) is read/written with NC's user and according permissions, which prevents outside modifications with my actual user account. This problem can be solved by explicitly logging into my user account, e.g. with sshfs. At this point there are the options to configure sshfs from within NC or to use an sshfs docker volume (quite large performance overhead due to sshfs, but ok for my personal use case).

I had exactly this problem. I wanted to access my existing data with nextcloud but had UID/GID problems between the docker container and the host system. Docker doesn't provide (currently) very good options for this so I used a workaround with bindfs.

bindfs --map=<user>/www-data:@<group>/@www-data <original source path> <docker volume path>

Where <docker volume path> refers to in my docker-compose.yml file:

     volumes:
      - nextcloud:/var/www/html
      - <docker volume path>:/var/www/html/data/admin/files/<pathname>

I have not performance tested this but as I use Nextcloud only for personal access to files it seems entirely adequate for this.

@danyill
Thanks for your contib! Today I have also setup a solution using bindfs, since my sshfs-volume approach did not work as I thought it would.

I do not use a bind mount thought, but an extra docker volume with the local driver.

Just curious, but is there a reason why no one in here followed @tilosp suggestion of modifying check_data_directory_permissions and setting it to false?

I'm also running nextcloud in docker, and did the following:

Attach to container

matt@server:~/docker/nextcloud$ docker exec -it nextcloud_app_1 bash
root@fb9f144c428b:/var/www/html#

edit nextcloud config file

root@fb9f144c428b:/var/www/html# nano config/config.php

and then added the required config:

....
  'datadirectory' => '/var/www/html/data',
  'dbtype' => 'sqlite3',
  'version' => '15.0.0.10',
  'overwrite.cli.url' => 'http://xxxx:9006',
  'installed' => true,
+ 'check_data_directory_permissions' => false,
  'maintenance' => false,
);

I stopped getting the original log @ulrikstrid posted after doing this.

However I then ran into another issue. Because I'm accessing my nextcloud via proxy_pass with nginx, I also had to add my external domain into the trusted_domains option in the config.php file:

  'trusted_domains' =>
  array (
    0 => 'internal-server-hostname:9006',
+   1 => 'nextcloud.externalserver.com',
  ),

After doing above it's all working for me now :-).

bonus tip

For anyone setting this up for the first time, and wanting to add their filesystems they've attached to the docker container e.g. my docker-compose file

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=xxxx
      - MYSQL_PASSWORD=xxxx
      - MYSQL_DATABASE=xxxx
      - MYSQL_USER=xxxx

  app:
    build: .
    ports:
      - 9006:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
      - /media/mydrive/4TB/nextcloud:/var/www/html/data:rw <---------- my nextcloud config is also on my mounted drive.
      - /media/mydrive/4TB/Media:/media/4TB/Media:rw <------------ actual mounted drive

You need to enable "External storage support" app from within nextcloud. After doing so, navigate to settings from an admin account, and click on external storage:

image

From here simply add it into nextcloud, and specify the location where it is mounted within the docker container:

image

Hope that helps someone...

Thanks,

Matt

Hello,
Have the same problem. There is some troubleshooting that works for me.
I'm using just docker:

docker run -d -p 8080:80 -v /mnt/data/:/var/www/html/data nextcloud

than change owner of /var/www/html/data/ in container

docker exec {your_container_name} chown -R www-data:www-data /var/www/html/data/

and add permission to access on host machine

sudo chmod u+rwx /mnt/data

Hi,
experimenting with different docker images, I determined the following procedure to adjust the ownership for my data volume at the docker server level:

  • first determine the nextcloud user-/group-id inside the container:
  docker exec -ti --user www-data {nextcloud-container} grep www-data /etc/passwd /etc/group
  /etc/passwd:www-data:x:82:82:Linux User,,,:/home/www-data:/bin/false
  /etc/group:www-data:x:82:www-data
  • then adjust the file tree from the external data path with the UID/GID:

    sudo chown -R 82:82 /my/data/path/* - or - {docker-path}/volumes/{UserData}/_data/*

(the second one applies to data inside a docker managed volume)

@mattie47 , the external storage solution seems to be the cleanest. Are there any downsides to this compared to mounting at /var/www/html/data?

The main question seems to be answered, so I'll close this.
Please use https://help.nextcloud.com/ for further discussions, we use this issue tracker just for the Docker image itself.

Related discussion, resolution, and screenshot at https://help.nextcloud.com/t/add-storage-mounted-volume/23606/4

Was this page helpful?
0 / 5 - 0 ratings

Related issues

nthack picture nthack  路  3Comments

gjedeer picture gjedeer  路  3Comments

all-the-good-ones-are-gone picture all-the-good-ones-are-gone  路  3Comments

DrMurx picture DrMurx  路  4Comments

waldner picture waldner  路  3Comments