Казалось бы, что может проще как изменить базовый URL?
А что такое базовый url? Классический базовый URL раньше выглядел так http://mydomen.ru/nextcloud
При этом nextcloud установлен по пути /var/www/html/nextcloud, а DocumentRoot в настройках веб-сервера /var/www/html
Потом появился параметр RewriteBase, который позволял убрать из url nextcloud, тем самым сократив его и сделав красивым.
Мне же попалась задача следующего рода - имеется сервер, с доступом только по 443 порту. На нем крутятся разные контейнеры для работы приложения и связаны с разными портами. Фронтенд принимает запросы через nginx на 443 порт. Бэкенд на порт 8090. Nextcloud на порт 9000. И еще какие то сервисы. С бэкендом сложностей не было, так как вся логика завязана на location /app или /static, в конфиге nginx я описал данную секцию с proxy-pass:
# backend location ~ ^/(api|static) { proxy_pass http://$host:8090; proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Allow the use of websockets proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
А в с nextcloud задача сложнее, если бы приложению нужно было только вытянуть файл и вывести на фронт, то решалось бы просто - в коде программы добавить мнимый суффикс "nextcloud" для того же адреса, а конфиге nginx его убрать (rewrite) и proxy-pass на внутренний адрес:порт. Но разработчики хотят налепить ссылок с переходом на nextcloud! В таком случае ничего не выйдет, так как сам nextcloud формирует свои ссылки и вот они будут без мнимого суффикса. Тогда нужно изменить базовый URL для nextcloud. И вот тут начались проблемы. Если бы речь шла об установленной полноценной версии, которую не будут пересобирать каждые несколько часов, то проблем особых нет, это везде описано:
- Переместить файлы в под папку (или симлинк)
- В config.php поправить overwritewebroot и overwrite.cli.url (остальные параметры по вкусу)
- В .htaccess поправить RewriteBase
mkdir -p app-hooks/pre-installation chmod -R 755 app-hooks
В compose.yml добавляем ENV и монтируем hook
environment: - NEXTCLOUD_ADMIN_USER=airfow - NEXTCLOUD_ADMIN_PASSWORD=airfow - NEXTCLOUD_TRUSTED_DOMAINS=172.18.103.122 - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_HOST=db:5432 - OVERWRITEWEBROOT=/nextcloud - OVERWRITECLIURL=http://172.18.103.122:9000/nextcloud volumes: - ./nextcloud_share:/var/www/html/data - ./app-hooks/pre-installation:/docker-entrypoint-hooks.d/pre-installation
Сам скрипт app-hooks/pre-installation/change_RewriteBase.sh
#!/bin/sh if [ ! -n "$OVERWRITEWEBROOT" ]; then exit fi filePrettyUrl="/var/www/html/config/apache-pretty-urls.config.php" if [ -f $filePrettyUrl ]; then echo "Trying to change RewriteBase" echo " '$OVERWRITEWEBROOT',\n);" > $filePrettyUrl fi; echo "Trying to create a symbolic link $OVERWRITEWEBROOT" symLink=/var/www/html$OVERWRITEWEBROOT if [ -L $symLink ]; then unlink $symLink fi ln -s /var/www/html/ $symLink
Скрипт создает симлинк на основе ENV OVERWRITEWEBROOT, и изменяет config/apache-pretty-urls.config.php.
Данных действий достаточно, для получения нужного результата.
echo, в данном случае, регистрируется в логах, в т.ч. и в dozzle, удобно для отладки
Один момент выяснился потом, порт 443, но протокол http, и банальный proxy_pass не прокатил. Система либо перебрасывала на 9000 порт, либо вообще ничего не делала, либо перебрасывала на https и переставала работать, так как https никто не слушает. Решение оказалось простым:
ENV в docker-compose.yml:
- OVERWRITEWEBROOT=/nextcloud - OVERWRITECLIURL=http://172.18.103.122:9000/nextcloud - OVERWRITEHOST=172.18.103.122:443
Секция в nginx.conf
location ~ ^/(nextcloud) { proxy_pass http://$host:9000; proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
Комментариев нет:
Отправить комментарий