3

I would like to set up nextcloud locally with postgres via docker. I am able to do so without attempting to use postgres (i.e. with default sqllite) but I run into problems when using postgres docker in conjunction with the nc image.

My laptop is Ubuntu 18.04.

Goal: I would like to have a containerized set up locally that I can easily (or at least somewhat easily) move to a cloud provider whenever I like. I'm setting up volumes for postgres as well as nc so that I can transfer everything to a remote as when I choose.

Here's my repo which includes Dockerfile and docker-compose:

Dockerfile: (Note I add smbclient since I learned the hard way that I need this to install the app for external storage, which I'd like to use)

FROM nextcloud:production-apache
RUN apt-get update && apt-get install -y \
   smbclient

My docker-compose file:

version: "3.5"
services:
  nextcloud:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - "8080:80"
    volumes:
      - $PROJECTS_DIR/Personal/mc1/nextcloud:/var/www/html
      - $PROJECTS_DIR/Personal/mc1/apps:/var/www/html/custom_apps
      - $PROJECTS_DIR/Personal/mc1/config:/var/www/html/config 
      - $PROJECTS_DIR/Personal/mc1/data:/var/www/html/data
    environment:
      - POSTGRES_HOST=nextcloud_db_1 # service name for postgres as assigned by Docker
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=postgres # will access postgres over 5432
      - POSTGRES_PASSWORD=testing123
    depends_on:
      - db

  db:
    image: postgres
    restart: always
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=testing123

I wasn't very sure how to set this up and borrowed from another post here.

Outcome:

With a terminal in the repo:

docker-compose build
docker-compose up -d

I can then access nc at http://localhost:8080/index.php where I select 'postgres' and enter the postgres details from my docker-compose: enter image description here

After entering all the details in the screenshot above, when I click 'finish setup' I get this error screen: enter image description here

I searched for a file called 'log' anywhere in the volumes and found data/nextcloud.log. Here's what it's showing:

{"reqId":"WqeSp92UPr935aMdZ0XY","level":2,"time":"2021-01-17T23:32:25+00:00","remoteAddr":"192.168.32.1","user":"--","app":"no app in context","method":"POST","url":"/index.php","message":"Host localhost was not connected to because it violates local access rules","userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":""}
{"reqId":"WqeSp92UPr935aMdZ0XY","level":2,"time":"2021-01-17T23:32:25+00:00","remoteAddr":"192.168.32.1","user":"--","app":"no app in context","method":"POST","url":"/index.php","message":"Host localhost was not connected to because it violates local access rules","userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":""}
{"reqId":"WqeSp92UPr935aMdZ0XY","level":3,"time":"2021-01-17T23:32:26+00:00","remoteAddr":"192.168.32.1","user":"--","app":"no app in context","method":"POST","url":"/index.php","message":{"Exception":"Doctrine\\DBAL\\DBALException","Message":"Failed to connect to the database: An exception occurred in driver: SQLSTATE[08006] [7] could not translate host name \"nextcloud_db_1\" to address: Temporary failure in name resolution","Code":0,"Trace":[{"file":"/var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php","line":428,"function":"connect","class":"OC\\DB\\Connection","type":"->","args":[]},{"file":"/var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php","line":388,"function":"getDatabasePlatformVersion","class":"Doctrine\\DBAL\\Connection","type":"->","args":[]},{"file":"/var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php","line":330,"function":"detectDatabasePlatform","class":"Doctrine\\DBAL\\Connection","type":"->","args":[]},{"file":"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php","line":119,"function":"getDatabasePlatform","class":"Doctrine\\DBAL\\Connection","type":"->","args":[]},{"file":"/var/www/html/lib/private/Setup/PostgreSQL.php","line":54,"function":"expr","class":"OC\\DB\\QueryBuilder\\QueryBuilder","type":"->","args":[]},{"file":"/var/www/html/lib/private/Setup.php","line":359,"function":"setupDatabase","class":"OC\\Setup\\PostgreSQL","type":"->","args":["rstudio"]},{"file":"/var/www/html/core/Controller/SetupController.php","line":75,"function":"install","class":"OC\\Setup","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/lib/base.php","line":946,"function":"run","class":"OC\\Core\\Controller\\SetupController","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/index.php","line":37,"function":"handleRequest","class":"OC","type":"::","args":[]}],"File":"/var/www/html/lib/private/DB/Connection.php","Line":72,"CustomMessage":"--"},"userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":"20.0.4.0"}
{"reqId":"WqeSp92UPr935aMdZ0XY","level":2,"time":"2021-01-17T23:32:26+00:00","remoteAddr":"192.168.32.1","user":"--","app":"no app in context","method":"POST","url":"/index.php","message":"Error trying to connect as \"postgres\", assuming database is setup and tables need to be created","userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":"20.0.4.0"}
{"reqId":"WqeSp92UPr935aMdZ0XY","level":3,"time":"2021-01-17T23:32:26+00:00","remoteAddr":"192.168.32.1","user":"--","app":"no app in context","method":"POST","url":"/index.php","message":{"Exception":"Doctrine\\DBAL\\DBALException","Message":"Failed to connect to the database: An exception occurred in driver: SQLSTATE[08006] [7] could not translate host name \"nextcloud_db_1\" to address: Temporary failure in name resolution","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Setup/PostgreSQL.php","line":98,"function":"connect","class":"OC\\DB\\Connection","type":"->","args":[]},{"file":"/var/www/html/lib/private/Setup.php","line":359,"function":"setupDatabase","class":"OC\\Setup\\PostgreSQL","type":"->","args":["rstudio"]},{"file":"/var/www/html/core/Controller/SetupController.php","line":75,"function":"install","class":"OC\\Setup","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/lib/base.php","line":946,"function":"run","class":"OC\\Core\\Controller\\SetupController","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/index.php","line":37,"function":"handleRequest","class":"OC","type":"::","args":[]}],"File":"/var/www/html/lib/private/DB/Connection.php","Line":72,"CustomMessage":"--"},"userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":"20.0.4.0"}
{"reqId":"webBnsoANvgRaansmKbZ","level":3,"time":"2021-01-17T23:32:41+00:00","remoteAddr":"192.168.32.1","user":"--","app":"index","method":"POST","url":"/index.php","message":{"Exception":"OC\\DatabaseException","Message":"An exception occurred while executing 'SHOW SERVER_VERSION':\n\nFailed to connect to the database: An exception occurred in driver: SQLSTATE[08006] [7] could not translate host name \"nextcloud_db_1\" to address: Temporary failure in name resolution","Code":0,"Trace":[{"file":"/var/www/html/lib/private/legacy/OC_DB.php","line":143,"function":"prepare","class":"OC_DB","type":"::","args":["SHOW SERVER_VERSION",null,null]},{"file":"/var/www/html/lib/private/legacy/OC_Util.php","line":984,"function":"executeAudited","class":"OC_DB","type":"::","args":[{"sql":"SHOW SERVER_VERSION","limit":null,"offset":null}]},{"file":"/var/www/html/lib/private/legacy/OC_Util.php","line":964,"function":"checkDatabaseVersion","class":"OC_Util","type":"::","args":[]},{"file":"/var/www/html/lib/base.php","line":660,"function":"checkServer","class":"OC_Util","type":"::","args":[{"__class__":"OC\\SystemConfig"}]},{"file":"/var/www/html/lib/base.php","line":1091,"function":"init","class":"OC","type":"::","args":[]},{"file":"/var/www/html/index.php","line":35,"args":["/var/www/html/lib/base.php"],"function":"require_once"}],"File":"/var/www/html/lib/private/legacy/OC_DB.php","Line":73,"CustomMessage":"--"},"userAgent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0","version":"20.0.4.0"}

Is my set up sound or is this a bug? I'm not confident in my postgres addition in docker-compose or if I have done that correctly?

How can I set up nextcloud locally with postgres using docker and volumes so that I can transfer my entire nextcloud set up from cloud provider to cloud provider as I choose?

Dr Claw
  • 636
  • 4
  • 15
Doug Fir
  • 19,971
  • 47
  • 169
  • 299

1 Answers1

2

I'm pretty sure the problem is this line:

- POSTGRES_HOST=nextcloud_db_1 # service name for postgres as assigned by Docker

If the directory where you are doing docker-compose up is not call "nextcloud" it will not work.

Ex: if you are in "nc" directory you will have to set the host to nc_db_1

BUT there is an other option:

You can set up an hostname for avoid this kind of problem

Exemple of docker-compose.yml

version: "3.5"
services:
  nextcloud:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - "8080:80"
    environment:
      - POSTGRES_HOST=nc-postgres  # HERE
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=postgres 
      - POSTGRES_PASSWORD=testing123
    depends_on:
      - db

  db:
    image: postgres
    restart: always
    hostname: 'nc-postgres'  # AND HERE 
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=testing123

Result:

enter image description here

Dr Claw
  • 636
  • 4
  • 15
  • Thanks, this seems to have resulted in success since I now access the nc dashboard. Is there a way to verify it's using postgres rather than default sqlite? I tried to connect to the db with my sql client, Dbeaver using host: localhost (also tried nextcloud_db), user postgres and pw per the docker-compose above, testing123. The connection failed. So, it looks like it's working, but I don't know how to verify it's using postgres! – Doug Fir Jan 18 '21 at 04:09
  • You can click on you avatar (top right) then click "settings", and in the left go down to "system" then scroll down to database ... – Dr Claw Jan 18 '21 at 04:19
  • if you want to connect to the db you have to bind the port or you can exec into the container with `docker exec -it psql -U postgres nextcloud_db` – Dr Claw Jan 18 '21 at 04:26
  • Thank you, looks like I am now connected with pgsql. When you say bind the ports, you just mean e.g. `ports: \ - "5432:5432"` in docker-compose? – Doug Fir Jan 18 '21 at 04:30
  • nevermind, I verified by testing that out and I was able to connect to the db via my client. Thank you! – Doug Fir Jan 18 '21 at 04:34