У меня работает 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 по URL-адресу cloud.museumsstrasse.at/intern
(до того, как я назвал его «внутренним»), я сделал следующие шаги:
Создал символическую ссылку внутри контейнера:
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
Теперь, чтобы показать выбранную общедоступную папку под корневым 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"
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:
В настоящее время я получил это с помощью nextcloud 19.0.1
и как видно в docker-compose.yml с traefik 2.2