Когда разворачиваешь self-hosted сервисы, довольно часто приходится решать загадки, проходить различные "квесты", которые обусловлены используемой инфраструктурой, выбранными платформами, особенностями программного обеспечения, и, конечно же, влиянием всех этих перечисленных факторов друг на друга. Не стал исключением и запуск блога. И хотя у меня уже набита рука и отработан некий алгоритм действий (я стараюсь придерживаться определенной тактики, выбранной в самом начале моих экспериментов методом проб и ошибок), все равно, довольно часто я напарываюсь на, скажем так, особенности - либо во время установки, либо во время запуска, а то и вовсе, во время использования.

Что же такого произошло в данном случае? Установка и запуск выбранной платформы (а это, напомню, Ghost) прошли успешно, блог, в принципе, заработал. Но тут вылезла мелочь, с первого взгляда совершенно незаметная, но очень быстро начавшая раздражать. Однако, прежде, чем рассказать про огорчившую меня проблему, надо хотя бы вскользь затронуть тему того, как все у меня устроено (речь про self-hosting, конечно же).

Итак, Ghost оказался развернут в виде docker-контейнера, который запускается на виртуальной машинке VirtualBox с Debian Jessie в качестве гостевой системы. Все это богатство крутится на стареньком HP трансформере TouchSmart tm2 с Windows 10 на борту. Перед всеми моими сервисами развернут (на отдельной виртуалке) HAProxy, используемый в качестве reverse proxy. Почему все это безобразие образовалось - тема для отдельного разговора, и, возможно, не одного. Сейчас же речь не об этом, а о маленькой такой проблемке.

Итак, после прописывания всех правил на прокси (и его перезагрузки), я обратился по адресу блога, и увидел стартовую страничку, наполненную заботливыми разработчиками некоторым количеством условно полезной информации. Потыкав в различные ссылки и почитав рекламно познавательные статейки, я решил, что все работает вполне себе сносно и пора вернуться на главную страничку блога, воспользовавшись специальной ссылкой Home. И вот тут то меня и ждала засада: при попытке вернуться на начальную страницу, я (внезапно) оказываюсь на страничке вот с такой вот забавной надписью:

Не удается получить доступ к сайту

Веб-страница по адресу http://localhost:2368/, возможно, временно недоступна или
постоянно перемещена по новому адресу.

То есть, все ссылки на предзагруженные записи (за авторством пользователя Ghost) правильно подхватили адрес моего блога - переходы выполнялись без нареканий, а вот ссылка Home просто направлена на localhost. Однако, обидно. К счастью, совершенно не смертельно.

После небольших изысканий выяснилось, что конфигурация Ghost хранится в файле, имеющем название, похожее на config.js (в моем случае я набрел на файл config.production.json), и в нем есть параметр url, который может разрешить все мои проблемы. Но...

Всегда есть это "но"! Вспомним мою инфраструктуру, а именно, тот факт, что Ghost развернут в docker-контейнере. Сам контейнер настроен таким образом, что обеспечивается сохранность только данных (через использование тома с отображением в каталог на диске), конфигурация же
размещена в контейнере. Ее, конечно же, можно подправить, но при первом же обновлении все внесенные исправления будут утеряны.

К счастью, и тут нашлось решение. В документации Ghost указано, что его можно конфигурировать с помощью переменных окружения, главное, чтобы имена этих переменных полностью (вплоть до регистра символов) совпадали с именами параметров файла конфигурации. То есть, можно установить переменную окружения с именем url в нужное значение и проблема должна быть решена.

Тут надо привести еще одно начальное условие. Для запуска docker-контейнера я использую Docker Compose, прописывая все необходимые параметры в соответствующем файле docker-compose.yml. Согласно документации Docker Compose, в таком файле можно задать переменные окружения для запускаемого контейнера, для чего надо использовать специальный ключ environment, что, собственно, я и сделал, включив в compose файл следующие строки:

    environment:
      - NODE_ENV=production
      - url=https://имя_домена_моего_блога.com

Первая строка требует использование production конфигурации Ghost, а вторая указывает требуемое значение для параметра url.

После перезапуска контейнера ссылочка Home стала работать, как нужно. С точки зрения пользователя я получил полное удовлетворение - ведь мне удалось решить возникшую проблемку. А вот с точки зрения программиста у меня остался вопрос: как получилось, что ссылки на статьи оказались правильными с самого начала, а ссылка на стартовую страницу (и не только, на RSS feed тоже) - нет? Ответ кроется где-то в исходном тексте Ghost, и, так как Ghost является open source проектом, я думаю, что докопаться до ответа (если будет время, конечно), в принципе, очень даже возможно.