Перенёс этот блог с Друпала на Хьюго

Небольшое лирическое вступление

Я уже не помню точно когда я сделал первую версию этого блога, но доменное имя romka.eu я зарегистрировал 10 августа 2006 года, 17 лет назад =8) Все эти 17 лет блог работал на CMS Drupal. Опять-таки, я уже не помню, на какой версии Друпала была сделана его первая версия, вполне вероятно, что это была версия 4.7. Версия упомянутая в этом блог-посте уже, скорее всего работала на пятёрке, а затем, позднее, по мере выхода новых релизов, я обновил блог до шестёрки и семёрки.

Примерно с 2007 по 2014 год я профессионально (в смысле, за деньги) занимался веб-разработкой и Друпал был моим основным рабочим инструментом. Не могу сказать, что работа с этой системой это ценный профессиональный опыт, но чего совершенно точно нельзя отрицать, так это того, что без участия в Друпал-сообществе не случилась бы та цепочка событий, которая сегодня привела меня туда где я есть. Семинары и конференции по Друпалу, новые знакомства, работа в forbes.ru (полученная в том числе благодаря моей самоуверенности в том, что друпальщика лучше меня ребятам просто не найти), а затем и в Яндексе, всё это скорее всего не произошло бы, если бы я тогда, году в 2006 не заинтересовался Друпалом. Я как-нибудь напишу эту историю подробнее, думаю, она может получиться интересной, но этот пост не об этом.

Обновление

Уже почти 10 лет как я не работаю с Друпалом и я давно хотел с него съехать. Используемый им стек технологий постоянно требовал внимания к себе: админка Друпала была красной от предупреждений о найденных уязвимостях для модулей, обновления к которым не выходили последние как минимум лет 5; спамеры находили всё новые и новые способы зафлудить БД бесполезными мусорными комментариями. Сайт работал на давно устаревшей Ubuntu 14.04, обновление которой потянуло бы за собой и обновление основных зависимостей Друпала: версии PHP и связанных с ним библиотек. В общем, сайт причинял головную боль, а разбираться со всем этим мне было уже совсем не интересно. Да и, кроме всего прочего, мне стали очевидны две вещи:

  1. мне не нужна такая сложная CMS для такого простого блога,
  2. я хочу, чтобы весь созданный мною контент представлял из себя простое дерево директорий, где каждый материал это одна директория, содержащая и текст, и связанные с ним фотографии и другие файлы. С таким подходом для просмотра содержимого не нужен ни веб-сервер, ни тем более БД и интерпретатор PHP.

Собственно, по этой причине я перенёс этот блог на статический генератор сайтов Hugo. Исходники блога лежат на Гитхабе (например, вот так выглядит этот пост), а из них Хьюго генерирует html-файлы, которые раскладываются на арендуемый мною сервер на Digital Ocean, а также на два CDN: netlify.com и render.com. Зеркала этого сайта на этих двух CDN доступны по адресам mirror1.romka.eu / romka-eu.onrender.com и mirror2.romka.eu / nimble-figolla-e0e98e.netlify.app. Для того объема контента, который у меня есть, использование этих CDN бесплатно, так что возможно, со временем, один из них может стать основным хостингом для этого блога.

Для сайта я сделал свою собственную тему оформления frühling, пока она распространяется только как часть этого блога, но позднее, когда я завершу её разработку, я планирую выложить её отдельным проектом.

История

Для истории и из собственных ностальгичечких чувств я упаковал все свои старые сайты в Docker-контейнер и теперь одной командой могу развернуть свой собственный кусочек интернета образца 2008-2010 годов :) Вот этот Интернет-2008:

  • d6.romka.eu — Drupal 6 версия этого блога, которая просуществовала примерно с 2008 по 2012 год,
  • d7.romka.eu — Drupal 7 версия, работавшая с 2012 по 2023 годы,
  • zerut.ru — весёлые картинки, которые я собирал примерно в 2010 (?) году,
  • shvabrashvabr.ru — мой старый демо-сайт со скринкастами о Друпале. В современных браузерах они не проигрываются, из-за того что сделаны на флеше, но если раздобыть виртуалочку с Windows XP и Internet Explorer 6, то можно будет по настоящему погрузиться в Интернет-2008 :)
  • 2start.romka.eu — еще один демо-сайт, который я собирал в дополнение к своим статьям в PC Magazine. Оригинальный домен 2start.ru я благополучно забыл продлить, поэтому перенёс эту демку на поддомен.

Немного технических деталей

Для запуска сайтов нужен мой архив legacy-romka-eu_2.7.tar.gz (md5 515634c7e541bbe6420b8d015933e962), содержащий Докер-образ, и операционная система с нужной версией ядра Linux. Я собирал образ на ядре 5.15, но, думаю, что на ядрах выпущенных с разницей в +-5 лет тоже всё должно заработать.

Сначала импортируем образ в систему:

docker image load < legacy-romka-eu_2.7.tar.gz
docker image ls

Последняя команда должна вернуть что-то похожее на:

REPOSITORY         TAG                        IMAGE ID       CREATED          SIZE
legacy-romka-eu    2.7                        7540f7659e1c   13 minutes ago   5.53GB

Далее запускаем Интернет-2008:

docker run --name legacy-romka-eu -p 80:80 -d legacy-romka-eu:2.7

К шеллу запущенного контейнера можно присоединиться командой:

docker exec -it legacy-romka-eu /bin/bash

Важно учитывать, что либо в hosts, либо на уровне DNS указанные выше доменные имена должны указывать на хост, на котором запущен контейнер.

Как образ был собран

На всякий случай, если в будущем понадобится еще раз собрать похожий образ, вот короткая инструкция как это сделать.

За основу своего образа я взял готовый образ drupal:7.95 с Docker Hub, в котором уже был установлен Друпал, Apache, PHP. Далее, запустил контейнер на его основе и зашел внутрь контейнера:

docker run --name some-container-name -p 8080:80 -d drupal:7.95
docker exec -it some-container-name /bin/bash

Установил в него весь необходимый софт. Я понимаю, что собирать один жирный образ со всеми зависимостями это не совсем Docker-way, но в моем случае задача состояла в том, чтобы на выходе получить один архив, содержащий всё необходимое для запуска одной командой всех своих legacy-сайтов. Поэтому, такой подход как раз то что надо. Итак, установка софта внутри контейнера:

apt update
apt install vim less mc mysql

Также понадобилось доустановить некоторые модули к PHP:

/usr/local/bin/docker-php-ext-install exif
/usr/local/bin/docker-php-ext-install mysql

Далее я снаружи контейнера скопировал в него весь контент старых сайтов:

docker cp source-dir/from/host-system/ some-container-name:/target-dir/in/container 

сдампил БД со старых сайтов и залил дампы в БД в контейнере и затем закоммитил работающий контейнер и сохранил его в виде файла, который в дальшейшем можно использовать как Докер-образ:

docker commit some-container-name legacy-romka-eu:all-php-sites
docker image save legacy-romka-eu:all-php-sites | gzip > legacy-romka-eu_all-php-sites.tar.gz

Проблемой этого образа было то, что в нем автоматом не стартовал MySQL, поэтому пришлось еще немного подшаманить. Я сделал вот такой небольшой шелл-скрипт entrypoint.sh, который запускает весь нужный софт:

#!/bin/bash
service mysql start
apache2-foreground

и на основе существующего Докер-образа и этого файла создал Dockerfile:

FROM legacy-romka-eu:all-php-sites

COPY --chmod=0111 entrypoint.sh /tmp/

ENTRYPOINT ["/tmp/entrypoint.sh"]

На основе этого файла сбилдил новый образ:

docker build -t legacy-romka-eu:1.0 .

Теперь все нужные сервисы стартовали автоматически, но возникла еще одна проблема. Получившийся образ весил больше 16 гигабайт, при том что моего собственного контента в этом образе около 3-4 гигабайт, а остальное — слои overlayfs, образовавшиеся во время сборки образа. Чтобы решить эту проблему и склеить все слои в один пришлось еще немного подшаманить с Докерфайлом:

FROM legacy-romka-eu:1.0 as initial

FROM scratch

COPY --from=initial / /

ENTRYPOINT ["/tmp/entrypoint.sh"]

Эта конфигурация буквально означает “взять за основу пустой образ и скопировать в него всё содержимое legacy-romka-eu:1.0”. Дальше, после выполнения команд:

docker build -t legacy-romka-eu:2.7 .
docker image save legacy-romka-eu:2.7 | gzip > legacy-romka-eu_2.7.tar.gz

у меня получился архив размером 3.5 гигабайта, который в распакованном виде занимает 5.5 Гб, втрое меньше чем до “склеивания” слоёв. С учётом того, что одних только фотографий и прочих картинок на моих сайтах около 3 гигабайт, получившийся результат вполне приемлемый.

На этом всё, теперь я могу отложить веб-разработку надолго в сторону и забыть о поддержке старых сайтов :)