Apache-2.2

將 nextcloud 移動到子 url,但將公共文件夾放在根目錄(將 nextcloud + nginx + nginx-docker-gen 全部放在 docker 中)

  • August 17, 2020

我有 nextcloud 執行,https://cloud.museumsstrasse.at但由於我們將主要使用 nextcloud 向公眾開放數據我希望這個 nextcloud 根 url 直接指向一個公共 nextcloud 文件夾,例如使用這個:https://cloud.museumsstrasse.at/s/Ytpcwos3o9o33kL但是這樣公眾就不需要 url使用共享子 URL,但僅鍵入https://cloud.museumsstrasse.at打開此公用文件夾的位置。至於登錄並與 nextcloud 同步,我想使用另一個子 url,例如:https://cloud.museumsstrasse.at/internal

這可能嗎?如何?

我的設置:

我在伺服器上使用 docker 執行 nextcloud Ubuntu 20.04。由於其他服務也在此伺服器上執行,因此我也使用 docker 設置了一個反向代理解決方案,包括這些圖像:nginx, jwilder/docker-gen:0.7.3, jrcs/letsencrypt-nginx-proxy-companion它執行反向代理並生成反向代理的配置文件。這docker-compose.yml一切都是這樣的:

version: '3'

services:

 service_nginx:
   image: nginx:1.13.1
   container_name: container_nginx
   ports:
     - "80:80"
     - "443:443"
   networks:
     - network_nginx
   volumes:
     - ./volumes/nginx/conf:/etc/nginx/conf.d
     - ./volumes/nginx/vhost:/etc/nginx/vhost.d
     - ./volumes/nginx/html:/usr/share/nginx/html
     - ./volumes/nginx-letsencrypt/certs:/etc/nginx/certs
   labels:
     - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"

 service_nginx-dockergen:
   image: jwilder/docker-gen:0.7.3
   container_name: container_nginx-dockergen
   depends_on:
     - service_nginx
   command: -notify-sighup container_nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
   networks:
     - network_nginx
   volumes:
     - ./volumes/nginx/conf:/etc/nginx/conf.d
     - ./volumes/nginx/vhost:/etc/nginx/vhost.d
     - ./volumes/nginx/html:/usr/share/nginx/html
     - ./volumes/nginx/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
     - ./volumes/nginx-letsencrypt/certs:/etc/nginx/certs
     - /var/run/docker.sock:/tmp/docker.sock:ro

 service_nginx-letsencrypt:
   image: jrcs/letsencrypt-nginx-proxy-companion
   container_name: container_nginx-letsencrypt
   depends_on:
     - service_nginx
     - service_nginx-dockergen
   environment:
     NGINX_PROXY_CONTAINER: container_nginx
     NGINX_DOCKER_GEN_CONTAINER: container_nginx-dockergen
   networks:
     - network_nginx
   volumes:
     - ./volumes/nginx/conf:/etc/nginx/conf.d
     - ./volumes/nginx/vhost:/etc/nginx/vhost.d
     - ./volumes/nginx/html:/usr/share/nginx/html
     - ./volumes/nginx-letsencrypt/certs:/etc/nginx/certs
     - /var/run/docker.sock:/var/run/docker.sock:ro

 service_nc_db:
   image: mariadb
   container_name: container_nc_db
   volumes:
     - ./volumes/nc_db:/var/lib/mysql
     - /etc/localtime:/etc/localtime:ro
   networks:
     - network_nc_prod
   environment:
     - MYSQL_ROOT_PASSWORD=XXX
     - MYSQL_PASSWORD=XXX
     - MYSQL_DATABASE=XXX
     - MYSQL_USER=XXX
   restart: unless-stopped

 service_nc:
   image: nextcloud:latest
   container_name: container_nc
   depends_on:
     - service_nc_db
     - service_nginx
     - service_nginx-dockergen
     - service_nginx-letsencrypt
   networks:
     - network_nc_prod
     - network_nginx
   volumes:
     - ./volumes/nc/html:/var/www/html
     - ./volumes/nc/config:/var/www/html/config
     - ./volumes/nc/custom_apps:/var/www/html/custom_apps
     - ./volumes/nc/data:/var/www/html/data
     - ./volumes/nc/themes:/var/www/html/themes
     - /etc/localtime:/etc/localtime:ro
   environment:
     - VIRTUAL_HOST=cloud.museumsstrasse.at
     - LETSENCRYPT_HOST=cloud.museumsstrasse.at
     - LETSENCRYPT_EMAIL=XXX
   restart: unless-stopped

networks:
 network_ca_prod:
 network_nc_prod:
 network_nginx:

到目前為止,我嘗試將 nextcloud 的 html 程式碼推送到子文件夾中,並擺弄諸如overwritewebrootoverwritehostin之類的設置config.php以及有關 nginx 反向代理的各種實驗,但到目前為止一切都失敗了。我試圖關注的是諸如此類的討論,例如:

https://github.com/nextcloud/docker/issues/401

https://stackoverflow.com/questions/54716909/nextcloud-installation-in-subfolder-redirect-in-apache2

子目錄 url 中 Ngnix 反向代理後面的 Nextcloud

什麼不起作用:

config.php例如,如果我添加到這兩行,則不起作用:

 'overwritehost' => 'cloud.museumsstrasse.at',
 'overwritewebroot' => '/internal'

然後cloud.museumsstrasse.at用瀏覽器打開會被重定向到,cloud.museumsstrasse.at/internal但與此同時程式碼/var/www/html/internal/<nextcloud_code>被刪除並被 nextcloud 程式碼覆蓋,/var/www/html/<nextcloud_code>然後我無法打開,因為瀏覽器會cloud.museumsstrasse.at/internal再次將我重定向到。

但是,即使某些東西overwritewebroot正在工作,我怎麼能避免這種從cloud.museumsstrasse.atto 的重定向cloud.museumsstrasse.at/internal?因為前者應該是公眾的面孔,而後者應該是我們內部的 nextcloud 方面。因此,我不希望重定向,但需要兩個不同的 url 用於不同的目的。

我假設如果一種務實的方法是調整 nextcloud 的 docker 圖像邏輯以指向它/var/www/html/internal/,然後調整這個 docker 的內部 apache 以cloud.museumsstrasse.at在從公共文件夾提供內容時顯示cloud.museumsstrasse.at/s/Ytpcwos3o9o33kL?但是我不知道如何做到這一點……

有人可以幫我嗎?

乾杯,斯特凡

好吧,我讓它工作了——以相當痛苦為代價。

首先,我嘗試了什麼,什麼不起作用(或者我無法工作):

  • 將 nextcloud 程式碼移動到子文件夾中(nc 圖像總是會覆蓋)
  • 由 apache 伺服器在 nc 映像中創建虛擬主機。我可以獲得正確的重定向,但目標網址始終可見,我想避免這種情況。
  • 在 nginx 反向代理層上創建重定向。

現在,我所做的是:

  • 1.) 通過符號連結“移動”nextcloud 到子路徑
  • 2.) 使用 traefik 重新創建反向代理堆棧

細節:

1.) “移動” nextcloud 到子路徑

為了在 url 下訪問 nextcloud cloud.museumsstrasse.at/intern(在我將其稱為“內部”之前),我執行了以下步驟:

1.1. 在容器內創建符號連結:

ln -s /var/www/html/ /var/www/html/intern
chown www-data:root -h /var/www/html/intern

1.2. 然後在瀏覽器中打開 nextcloud,註冊一個管理員使用者,提供數據庫憑據。

這一步是必要的,因為之後會自動生成一些配置文件,這些文件將在接下來的步驟中進行修改。

1.3. In/var/www/html/.htaccessRewriteBase必須修改的自動生成的程式碼塊:

沒有這一步,我得到了一個ERR_TOO_MANY_REDIRECTS錯誤。

<IfModule mod_rewrite.c>
 ....
 RewriteBase /intern # <-- changed from auto generated `RewriteBase /`
 ....
</IfModule>

1.4. 現在它基本上已經可以工作了,除了 Web 登錄和客戶端身份驗證表單凍結(某種程度上與反向代理相關)。此處討論了此問題:https ://github.com/nextcloud/server/issues/19091要修復它,必須將以下內容添加到/var/www/html/config/config.php

...
'overwriteprotocol' => 'https' 
...

在這些步驟之後,可以使用所需的子路徑到達 nextcloud 實例cloud.museumsstrasse.at/intern

可以在此處找到有用的討論:https ://github.com/nextcloud/docker/issues/401

2.) traefik 反向代理

cloud.museumsstrasse.at現在,為了在traefik的根 url 下顯示一個選定的公用文件夾,可用於動態替換路徑,同時對訪問者隱藏目標 url,這樣無論cloud.museumsstrasse.at在 url 下返回什麼子路徑,都將始終保留。

為此,必須在 traefik v2 中定義一個中間件。由於我僅使用 docker-compose,因此我通過代理服務上的這些標籤執行此操作:

# defines the middleware:
- "traefik.http.routers.service_nextcloud.middlewares=custom_repath" 

# the regex which the rule should match (double dollar signs for escaping):
- "traefik.http.middlewares.custom_repath.replacepathregex.regex=^/$$"

# the replacement value (the subpath of a selected public folder):
-"traefik.http.middlewares.custom_repath.replacepathregex.replacement=/intern/s/63KFWGkziffJR8j"

3.) 完整的 docker-compose.yml

services:

 service_traefik:
   image: "traefik:v2.2"
   container_name: container_traefik
   networks:
     - network_traefik
   command:
     # an explicit reference to the docker network must be passed when multiple networks exist:
     - "--providers.docker.network=docker_network_traefik"
     - "--providers.docker=true"
     - "--providers.docker.exposedbydefault=false"
     - "--entrypoints.websecure.address=:443"
     - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
     - "--certificatesresolvers.myresolver.acme.email=XXX"
     - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
   ports:
     - "443:443"
     - "8080:8080"
   volumes:
     - "./volumes/traefik/letsencrypt:/letsencrypt"
     - "/var/run/docker.sock:/var/run/docker.sock:ro"

 service_nc_db:
   image: mariadb
   container_name: container_nc_db
   volumes:
     - ./volumes/nc_db:/var/lib/mysql
     - /etc/localtime:/etc/localtime:ro
   networks:
     - network_nc
   environment:
     - MYSQL_ROOT_PASSWORD=XXX
     - MYSQL_PASSWORD=XXX
     - MYSQL_DATABASE=XXX
     - MYSQL_USER=XXX

 service_nc:
   image: nextcloud:latest
   container_name: container_nc
   depends_on:
     - service_traefik
     - service_nc_db
   networks:
     - network_traefik
     - network_nc
   labels:
     - "traefik.enable=true"
     - "traefik.http.routers.service_nextcloud.rule=Host(`cloud.museumsstrasse.at`)"
     - "traefik.http.routers.service_nextcloud.entrypoints=websecure"
     - "traefik.http.routers.service_nextcloud.tls.certresolver=myresolver"
     - "traefik.http.routers.service_nextcloud.middlewares=custom_repath"
     - "traefik.http.middlewares.custom_repath.replacepathregex.regex=^/$$"
     - "traefik.http.middlewares.custom_repath.replacepathregex.replacement=/intern/s/63KFWGkziffJR8j"
   volumes:
     - ./volumes/nc/html:/var/www/html

networks:
 network_nc:
 network_traefik:

4.) 版本

目前我用 nextcloud 執行了這個19.0.1,如 docker-compose.yml 和 traefik 所示2.2

引用自:https://serverfault.com/questions/1029363