將 nextcloud 移動到子 url,但將公共文件夾放在根目錄(將 nextcloud + nginx + nginx-docker-gen 全部放在 docker 中)
我有 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 程式碼推送到子文件夾中,並擺弄諸如
overwritewebroot
或overwritehost
in之類的設置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.at
to 的重定向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/.htaccess
是RewriteBase
必須修改的自動生成的程式碼塊:沒有這一步,我得到了一個
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