Назад | Перейти на главную страницу

Переместите nextcloud на дополнительный URL, но поместите общую папку в корень (с nextcloud + nginx + nginx-docker-gen в докере)

У меня работает nextcloud https://cloud.museumsstrasse.at но поскольку мы будем использовать nextcloud в первую очередь для открытия данных для публики, я хотел бы, чтобы этот корневой URL-адрес nextcloud напрямую вел к общедоступной папке nextcloud, например использовать это: https://cloud.museumsstrasse.at/s/Ytpcwos3o9o33kL но так, чтобы публике не понадобился URL-адрес с дополнительным URL-адресом, а только введите https://cloud.museumsstrasse.at где будет открыта эта общая папка. Что касается входа в систему и синхронизации с nextcloud, я хотел бы использовать другой дополнительный URL-адрес, например, такой: https://cloud.museumsstrasse.at/internal

Возможно ли это и как?

Моя установка:

Я запустил nextcloud с докером на Ubuntu 20.04 Сервер. Поскольку на этом сервере работают и другие службы, я установил решение обратного прокси с докером, включая эти изображения: 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:

То, что я пробовал до сих пор, - это вставить html-код nextcloud во вложенную папку и возиться с такими настройками, как overwritewebroot или overwritehost в config.php и различные эксперименты с обратным проксированием nginx, но пока ничего не вышло. Я пытался следить за дискуссиями, например, такими:

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

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

Nextcloud за обратным прокси-сервером Ngnix в URL-адресе подкаталога

Что не работает:

Например, что не работает, если я добавлю к 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 к cloud.museumsstrasse.at/internal? Потому что первое должно быть публичным лицом, а второе - нашей внутренней стороной nextcloud. Следовательно, я хочу не перенаправления, а два разных URL-адреса для разных целей.

Я предполагаю, что если бы прагматичным способом было бы адаптировать логику изображения докеров nextcloud, чтобы указать на /var/www/html/internal/ а затем адаптируйте внутренний apache этого докера, чтобы показать cloud.museumsstrasse.at при обслуживании контента из общей папкиcloud.museumsstrasse.at/s/Ytpcwos3o9o33kL ? Однако я не понимаю, как это сделать ...

Кто-нибудь может мне здесь помочь?

Привет, Стефан

Хорошо, я заставил это работать - за счет некоторой боли.

Во-первых, что я пробовал, а что не получилось (или то, что у меня не получилось):

  • Перемещение кода nextcloud в подпапку (изображение nc всегда перезаписывается)
  • Создание виртуального хоста сервером apache в образе NC. Я мог получать правильные перенаправления, но целевые URL-адреса всегда были видны, чего я хотел избежать.
  • Создание перенаправлений на уровне обратного прокси nginx.

Вместо этого я сделал следующее:

  • 1.) "переместил" nextcloud в подпуть с помощью символической ссылки
  • 2.) воссоздайте обратный стек прокси с помощью traefik

Подробности:

1.) "переместил" nextcloud на подпуть

Чтобы попасть в nextcloud по URL-адресу 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 в браузере, зарегистрировал пользователя с правами администратора и предоставил учетные данные db.

Этот шаг необходим, так как впоследствии автоматически создаются некоторые файлы конфигурации, которые будут изменены на следующих шагах.

1.3.

В /var/www/html/.htaccess это автоматически сгенерированный блок кода, где RewriteBase необходимо изменить:

Без этого шага я получил ERR_TOO_MANY_REDIRECTS ошибка.

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

1.4.

Теперь это в основном уже работает, за исключением того факта, что форма входа в систему и аутентификации клиента зависает (как-то связано с обратным проксированием). Этот вопрос обсуждается здесь: https://github.com/nextcloud/server/issues/19091 и чтобы исправить это, необходимо добавить в /var/www/html/config/config.php:

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

После этих шагов к следующему экземпляру облака можно будет добраться по желаемому подпути. cloud.museumsstrasse.at/intern

Полезное обсуждение можно найти здесь: https://github.com/nextcloud/docker/issues/401

2.) обратный прокси traefik

Теперь, чтобы показать выбранную общедоступную папку под корневым URL-адресом cloud.museumsstrasse.at traefik можно использовать для замены путей на лету, скрывая при этом целевые 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