Некоторое время назад я выбрал в качестве платформы для ведения блога Ghost. Истинные причины этого решения, как, собственно, бывает довольно часто, сокрыты моим подсознанием. Сознание же выдает следующие пункты:

  1. Все статьи утверждали, что это - круто
  2. Платформа позволяет разместить блог на собственном железе, в собственном помещении, и, что важно, собственноручно вершить его судьбу, то есть, администрировать все это хозяйство
  3. Еще много чего

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

Второй же пункт - это просто чума. Во-первых, вы - Царь Горы, и... дальше можно не продолжать. Хотя бы потому, что Царь - это не только привилегии, но и обязанности. В общем, я очень доволен. Особенно сейчас, когда столкнулся с первым возникшим за несколько месяцев сбоем, и, кажется, победил его! Но, обо всем по-порядку.

Время от времени я захожу к себе в блог посмотреть, какие проблемы и, главное, как, я решал раньше, если, конечно, удосужился написать об этом. Но сегодня, вместо своего любимого закутка, я вдруг увидел пренеприятную надпись - 503 Service unavailable. Что, в переводе с языка наших западных парнеров, означает: "Шеф!!! Все пропало!!!" ©. А именно, сервер, по каким-то причинам, упал.

Тут я позволю себе небольшое отступление, поясняющее, почему мысль "сервер упал" не просто промелькнула у меня в голове, а была именно первой, что пришла мне на ум. Дело в том, что Ghost, как и многие другие мои сервисы (точнее, все), развернут внутри Docker-контейнера, который, в свою очередь, работает на виртуальной машине с Debian 8 в качестве гостевой операционной системы, а эта виртуальная машина размещена на компьютере с Windows 10 Pro. А Windows 10 Pro обладает той особенностью, что время от времени она принудительно ставит обновления и перегружается. "Ну и что?" - спросите вы. А то, что у меня пока не дошли руки сделать так, чтобы виртуалки стартовали автоматически при загрузке операционки.

То есть, время от времени, у меня случаются ошибки 503 Service unavailable. Но, так как на виртуалке крутится не только контейнер с Ghost, но и другие сервисы в контейнерах, то они все одновременно и недоступны. Поэтому, первым делом я проверил доступность сервиса закладок (он работает на той же виртуалке) и, к моему неудовольствию, выяснилось, что с этим сервисом все хорошо. Тогда я бросил упражняться с браузером и применил тяжелую артиллерию: подключился к виртуальной машине с серисами в контейнерах по SSH и набрал команду:

docker ps -a

И ее вывод настроение мне не улучшил: все контейнеры нормально работали, за исключением контейнера с блогом. Тогда я решил перезапустить этот контейнер, но это, увы, не помогло - сервис не запустился. Следующее, что я сделал - попробовал обновить образ диска Ghost. Само обновление прошло успешно, но попытка запустить контейнер привела к немного странному результату - контейнер вошел в режим постоянной перезагрузки. Пришлось останавливать его и смотреть журнал, для чего я использовал следующую команду:

docker log ghost_1

(ghost_1 - это имя моего контейнера с блогом... на самом деле, контейнер называется по-другому, но это не так уж и важно). И тут я вновь должен пропеть диферамбы в адрес авторов Ghost - журнал оказался на редкость вменяемым:

[2018-04-19 05:22:09] ERROR

NAME: MigrationsAreLockedError
MESSAGE: Migrations are running at the moment. Please wait that the lock get`s released.

level:normal

Either the release was never released because of a e.g. died process or a parallel process is migrating at the moment.
If your database looks okay, you can manually release the lock by running `UPDATE migrations_lock set locked=0 where lock_key='km01';`.
MigrationsAreLockedError: Migrations are running at the moment. Please wait that the lock get`s released.
... далее следует непереводимая игра слов - результат распечатки стека вызовов ...   

Все, что остается сделать после этого - выполнить рекомендации. Но прежде, чем выполнить SQL команду, надо добраться до самой базы данных и найти утилиту для работы с ней. Ghost у меня работает с базой SQLite, а сам контейнер настроен на использование подмонтированного каталога на виртуалке, так что добраться до файла с базой данных совсем не сложно - он лежит в подкаталоге data и имя ему ghost.db. А утилиту... ну тут, как говорится, Гугл в помощь: коротенький запрос и вот у меня уже установлена программа для работы с БД SQLite: DB Browser for SQLite.

Далее все очень предсказуемо:

  • останавливаю контейнер (предварительно перейдя в каталог с файлом docker-compose.yml)

    docker-compose stop
    
  • копирую базу данных на локальный диск

  • открываю ее в программе

  • убеждаюсь в том, что в соответствующей таблице действительно установлен признак блокировки

  • произвожу нужные изменения

  • сохраняю данные и саму БД

  • Возвращаю файл с БД на место (в подкаталог data)

  • запускаю контейнер (мы же не выходили из каталога с файлом docker-compose.yml)

    docker-compose up -d
    
  • проверяю результат: в логах все хорошо

    [2018-04-19 11:12:59] INFO Finished database migration!
    [2018-04-19 11:13:13] WARN Theme's file locales/en.json not found.
    [2018-04-19 11:13:15] INFO Ghost is running in production...
    [2018-04-19 11:13:15] INFO Your blog is now available on https://blog.bozdaganian.com/
    [2018-04-19 11:13:15] INFO Ctrl+C to shut down
    [2018-04-19 11:13:15] INFO Ghost boot 16.229s
    

    да и в браузере тоже нет проблем:

Вот оно! Вот ради этого я и переносил свои сервисы на свое же оборудование в своей сети. Возможно, вы не совсем меня понимаете и задаетесь вопросом: зачем ему (мне) все эти заморочки? Не проще ли отдать все на откуп хостерам и провайдерам услуг? И, наверное, будете правы - когда все делают за вас, действительно, многое становится проще. Но, как вопрошал герой одного мультфильма, обращаясь к своим помошникам: "Вы что это?! И конфеты за меня есть будете?!" ©. Так что, да здравствует Царь Горы!