Перенёс этот блог с Друпала на Хьюго
Небольшое лирическое вступление
Я уже не помню точно когда я сделал первую версию этого блога, но доменное имя romka.eu
я зарегистрировал 10 августа 2006 года, 17 лет назад =8) Все эти 17 лет блог работал на CMS Drupal. Опять-таки, я уже не помню, на какой версии Друпала была сделана его первая версия, вполне вероятно, что это была версия 4.7. Версия упомянутая в этом блог-посте уже, скорее всего работала на пятёрке, а затем, позднее, по мере выхода новых релизов, я обновил блог до шестёрки и семёрки.
Примерно с 2007 по 2014 год я профессионально (в смысле, за деньги) занимался веб-разработкой и Друпал был моим основным рабочим инструментом. Не могу сказать, что работа с этой системой это ценный профессиональный опыт, но чего совершенно точно нельзя отрицать, так это того, что без участия в Друпал-сообществе не случилась бы та цепочка событий, которая сегодня привела меня туда где я есть. Семинары и конференции по Друпалу, новые знакомства, работа в forbes.ru (полученная в том числе благодаря моей самоуверенности в том, что друпальщика лучше меня ребятам просто не найти), а затем и в Яндексе, всё это скорее всего не произошло бы, если бы я тогда, году в 2006 не заинтересовался Друпалом. Я как-нибудь напишу эту историю подробнее, думаю, она может получиться интересной, но этот пост не об этом.
Обновление
Уже почти 10 лет как я не работаю с Друпалом и я давно хотел с него съехать. Используемый им стек технологий постоянно требовал внимания к себе: админка Друпала была красной от предупреждений о найденных уязвимостях для модулей, обновления к которым не выходили последние как минимум лет 5; спамеры находили всё новые и новые способы зафлудить БД бесполезными мусорными комментариями. Сайт работал на давно устаревшей Ubuntu 14.04, обновление которой потянуло бы за собой и обновление основных зависимостей Друпала: версии PHP и связанных с ним библиотек. В общем, сайт причинял головную боль, а разбираться со всем этим мне было уже совсем не интересно. Да и, кроме всего прочего, мне стали очевидны две вещи:
- мне не нужна такая сложная CMS для такого простого блога,
- я хочу, чтобы весь созданный мною контент представлял из себя простое дерево директорий, где каждый материал это одна директория, содержащая и текст, и связанные с ним фотографии и другие файлы. С таким подходом для просмотра содержимого не нужен ни веб-сервер, ни тем более БД и интерпретатор 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 гигабайт, получившийся результат вполне приемлемый.
На этом всё, теперь я могу отложить веб-разработку надолго в сторону и забыть о поддержке старых сайтов :)