通过 docker 使用 postgres 设置 nextcloud

Posted

技术标签:

【中文标题】通过 docker 使用 postgres 设置 nextcloud【英文标题】:Set up nextcloud with postgres both via docker 【发布时间】:2021-04-22 07:32:41 【问题描述】:

我想通过 docker 使用 postgres 在本地设置 nextcloud。我可以在不尝试使用 postgres(即使用默认 sqllite)的情况下这样做,但是在将 postgres docker 与 nc 图像结合使用时遇到问题。

我的笔记本电脑是 Ubuntu 18.04。

目标: 我想在本地进行容器化设置,我可以随时轻松(或至少稍微轻松地)迁移到云提供商。我正在为 postgres 和 nc 设置卷,以便我可以在选择时将所有内容传输到远程。

这是我的仓库,其中包括 Dockerfile 和 docker-compose:

Dockerfile:(注意我添加了 smbclient,因为我学到了需要它来安装我想使用的外部存储应用程序的艰难方法)

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

我的 docker-compose 文件:

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

我不太清楚如何设置它并从另一个帖子here借来。

结果:

在 repo 中有一个终端:

docker-compose build
docker-compose up -d

然后我可以在 http://localhost:8080/index.php 访问 nc,在此我选择“postgres”并从我的 docker-compose 输入 postgres 详细信息:

在上面的屏幕截图中输入所有详细信息后,当我单击“完成设置”时,会出现以下错误屏幕:

我在卷中的任意位置搜索了一个名为“log”的文件,并找到了 data/nextcloud.log。这是它显示的内容:

"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"

是我的设置声音还是这是一个错误?我对在 docker-compose 中添加 postgres 或者我是否正确地添加了没有信心?

如何使用 docker 和 volumes 使用 postgres 在本地设置 nextcloud,以便我可以根据自己的选择将整个 nextcloud 设置从云提供商转移到云提供商?

【问题讨论】:

【参考方案1】:

我很确定问题出在这一行:

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

如果您正在执行docker-compose up 的目录不是调用“nextcloud”,它将无法工作。

例如:如果您在“nc”目录中,则必须将主机设置为nc_db_1

但是还有其他选择:

你可以设置一个主机名来避免这种问题

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

结果:

【讨论】:

谢谢,这似乎已经成功,因为我现在访问了 nc 仪表板。有没有办法验证它使用的是 postgres 而不是默认的 sqlite?我尝试使用我的 sql 客户端连接到数据库,Dbeaver 使用主机:localhost(也尝试过 nextcloud_db),用户 postgres 和 pw 每个上面的 docker-compose,testing123。连接失败。所以,看起来它正在工作,但我不知道如何验证它是否使用 postgres! 你可以点击你的头像(右上角)然后点击“设置”,然后在左边进入“系统”然后向下滚动到数据库... 如果你想连接到数据库你必须绑定端口或者你可以使用docker exec -it <postgres container id> psql -U postgres nextcloud_db执行到容器中 谢谢,看来我现在已连接到 pgsql。当您说绑定端口时,您的意思是例如ports: \ - "5432:5432" 在 docker-compose 中? 没关系,我通过测试进行了验证,并且能够通过我的客户端连接到数据库。谢谢!

以上是关于通过 docker 使用 postgres 设置 nextcloud的主要内容,如果未能解决你的问题,请参考以下文章

Django 无法在 Docker 设置中连接到 Postgres

如何在 Dockerized GraphQL + Postgres 设置中运行 Prisma 迁移?

docker springboot 仅通过 docker-compose 在 postgres 5432 上连接

如何在 Docker Postgres 的脚本中创建用户/数据库

节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

在 Docker 上使用 Nginx、uWSGI 和 Postgres 配置 Django