История о том, как я бложик спасал

История о том, как я бложик спасал

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

🔞
Пост содержит небольшое количество программерской и ненормативной лексики

Изначально, когда я задался вопросом о создании такого сайта, я искал self-hosted решение, которое бы позволило работать по схеме "настроил и забыл". Решение было довольно быстро найдено - Ghost. Оно собственно сейчас и используется в бложике.

Конечно, не всё так радужно и идеально. Идеально было бы, если бы эта дура не была такой требовательной к ресурсам. По факту мой сайт - просто некоторое место, куда я пишу посты и скидываю ссылку на свои ресурсы. Не думаю, что кто-то будет искать в гугле какие-то статьи отсюда, да и с поисковой оптимизацией я не особо заморачиваюсь. Популярностью в интернете я особо не пользуюсь, поэтому и посещаемость сайта низкая. В идеале это должен быть очень примитивный сайт со статическим содержимым, который можно было бы развернуть на любом хосте за 150 рублей, и масштабировать при необходимости. Но я же лёгких путей не ищу... Мне подавай целую CMS-систему, чтобы посты можно было писать прямо в браузере с любого компьютера. Ну, за что боролись, как говорится...

Это была присказка, не сказка.

Скрытая угроза

Началось всё с обычного диалога в телеге.

тот самый диалог

Таймвеб - хостинг, услугами которого я пользовался. Мне всё там нравилось, но к повышению цен я был не готов. И хотя сервер хостился в Питере, а не в Европе, цена на конфигурацию тоже взлетела и суммарно составила 900 рублей в месяц. Меня, честно, задушила жаба.

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

вот они, родимые

Оказалось, что почти никто не умеет создавать сервера из такого формата (ну или я не нашёл как). Я даже написал в поддержку своего нового хостинга, но они ответили что-то в духе "Успокойтесь, здесь нет никаких коров".

Поняв, что это будет не так просто, я засучил рукава и решил переносить всё вручную через встроенный механизм миграции Ghost.

Оказалось, что миграция эта нифига не работала. То ли версии были не совместимы, то ли я криворукий и невнимательно читал доку, но в сухом остатке - я получил лишь архив с картинками, без каких-либо текстов, а при попытке установить их в новый инстанс, я получал ошибку.

здесь по мнению Ghost, находится полный контент с сайта le30r.xyz. Спойлер: не находится. Только картинки.

В итоге я плюнул на всё это дело, а в какой-то момент мне вообще стало не до реанимации бложика - мои мысли занимала работа и учёба.

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

буквально я

Таймвеб наносит ответный удар

Дальше наступил июль, там отпуск, я ездил в Питер и Казань (скоро появятся посты об этом).

После возвращения, я подумал что было бы здорово бабахнуть какие-нибудь посты про то, как вообще это было. Я зашёл по привычному адресу... И получил сообщение о cloudflare о том, что сервер недоступен.

картинку честно украл из интернета, не буду же я класть только что поднятый сайт ради одного скрина...

Я вспомнил (на самом деле не забывал), что для того, чтобы изливать душу на сайт, его необходимо восстановить.

Поскольку, таймвеб безжалостно и беспощадно снёс мой сервер, я разработал новую схему.

План был прост.

  1. Кладём на таймвеб 100 рублей
  2. Заливаем свой образ
  3. Поднимаем из него сервер
  4. Достаём с сервера все посты (любой ценой)
  5. Прощаемся с таймвебом навсегда.

таймвеб в этот момент

Поскольку образы весят по 15 Гб, я в то время я сидел на 100 Мбит интернете, я решил дождаться поездки в город, чтобы загрузить образ с хорошим интернетом.

В итоге что-то пошло не так. Образ остался висеть на 100% и не хотел догружаться. Я попробовал создать другой аккаунт, но там меня ждала та же участь.

А потом я опять отвлёкся на что-то важнее, и вот мы в точке 25 августа 2024 года.

За это время я много думал о том, что на самом то деле ситуация малоприятная. И если старые посты до сих пор доступны на других ресурсах, то новые я писал через Ghost и в нём они существуют в единственном экземпляре.

По приезде из Минска (про эту поездку тоже будет пост), я решил, что надо действовать. Тем более, что у меня оставалось буквально неделя, когда я смогу уделить этой проблеме внимание, потом начнётся учёба и времени будет совсем мало.

За время, пока меня не было, таймвеб пофиксили проблему с образами, и я смог загрузить свой, и даже создать из него сервер. Ну всё, подумал я. Сейчас просто перенастрою cloudflare, чтобы он вёл на него, вытащу с него посты и всё будет в ажуре.

Возвращение джедая

Сказано - сделано. Но единственное, что это изменило - ошибку от Cloudflare.

картинка 521 ошибка cloudflare скачать

Я полез смотреть, чо там не так, и в этот момент выяснилось, что я вообще не имею полноценного доступа к серверу извне: ssh выкидывал мне следующее.

ssh: connect to host 2a03:blabla:blabla::7c96 port 22: Unknown error

Единственный доступ, который у меня был - VNC от провайдера. Не очень удобная штука, без поддержки нормальных команд копирования-вставки, но это был единственный путь к спасению бложика.

В итоге я начал копаться в настройках nginx, но через какое-то время я пришёл к выводу, что сервак вообще не доступен из интернета. Убедился в этом я после того, как ping google.com c сервера вернул мне ошибку "Temporary failure in name resolution".

Тогда я обратился к великому и ужасному ChatGPT. Точнее сначала я спросил у Claude, но мне не очень понравились его ответы. Я составил примерно такое сообщение.

да, общался как быдло, но мне было интересно, поймёт ли машина меня (спойлер: поняла)

И великий и ужасный помог. Нет, полностью восстановить интернет на сервере не получилось, но у меня хотя бы появился полноценный SSH-доступ.

Под конец я уже сдался

Пока решал проблему с интернетом, заскочил в базу данных и обнаружил свои посты в целости и сохранности. Собственно, у меня и созрело решение забить на конфигурацию сети на сервере, просто взять и скачать к себе эту базу, а дальше уже разбираться. Главное было - получить текстовое содержание постов.

Я сделал дамп, скачал его к себе на комп, принял порцию СУБД локально и внутривенно и накатил базу. Всё запустилось - я был уже как минимум рад тому, что я не потеряю свои посты.

Дальше я решал, что же мне предпринять.

В июле я развлекался тем, что осваивал Obsidian.md и писал в нём драфт сценария для одной из игр. Мне очень понравился этот опыт, и одной из моих мыслей было отойти от Ghost, и писать все посты в markdown-формате, а потом просто генерировать из них статический html-сайт, как я описывал в самом начале. Это позволило бы мне сэкономить на хостинге, и избавиться от оверинжениринга в виде Ghost, но при этом не заморачиваться с вёрсткой, а просто писать посты.

Кроме того, вся эта возня с миграцией и бэкапами научила меня ещё и тому, что как минимум надо хранить копии своих постов больше чем в 1 месте. Это база, но пока я с этим не столкнулся, я этого не понял.

Markdown же помог бы мне ещё и тем, что в случае потери/блокировки/смены сервера, мне бы не потребовалось производить огромное число манипуляций, а просто сделать перезалив.

И я решил двигаться по этому пути. С помощью ChatGPT сделал конвертер постов из базы в .md. Через несколько итераций что-то даже получилось.

В целом схема меня устраивала. Да, я спускаюсь на уровень пониже, но я всё ещё пишу человеко-читаемые тексты на простом языке разметки.

В качестве основного инструмента взял Hugo. Натравил его на .md-файлы, и через какое-то время он меня порадовал сайтом с приятным дизайном и всеми моими постами.

le30r.xyz unreleased

Но осталась одна проблема - картинки.

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

Но мои посты - не только текст. Я предпочитаю разбавлять его картинками, и очень часто картинок много.

Ghost имеет одну очень важную особенность - можно делать галерею, где картинки отображаются в аккуратном и ровном виде. Markdown это что-то далекое от картинок. Я полез гуглить, и оказалось, что имплементация всяких каруселей и галерей в Hugo - не такая простая задача. Мне нужно было максимально тупое и простое решение, я был готов даже использовать какую-то специфическую разметку, я даже задал вопрос ChatGPT. Но простого решения найти я не смог.

То, к чему я пришёл - вот такой слайдер.

Но такая простая штука требует огромного количества html-кода, плюс возни с настройками. Хоть я и погромист, но когда я пишу текст, то по-минимуму хочу думать о разметке и прочем. Слабый, да.

В итоге я подумал и решил вернуться к Ghost'у. Как бы я не мучился со бэкапом и переносом, удобный редактор есть удобный редакто.

Как я это намеревался сделать? В голове созрел гениальный план.

Фактически, весь контент Ghost'a находится в его БД (как смерть Кощея в яйце, ага). Единственное, что лежит снаружи - конфиг для подключения в отдельном файле и всякие картиночки и видосики прямо на сервере.

План прост.

  1. Накатываем БД из дампа на сервере.
  2. Устанавливаем Ghost, указывая эту самую БД.
  3. Загружаем картиночки и видосики в нужную папку.
  4. Наслаждаемся работающим сайтом.

И да, он сработал. Результат - вы читаете этот пост прямо отсюда.

Единственная проблема, которая возникла в ходе всей этой возни, случилась когда я писал этот пост. Когда я начал грузить картинку, то получил ошибку сервера.

Оказалось, что когда я копировал контент на сервер, там применились другие настройки привелегий, и картинка просто не загружалась. Пара консольных команд в линухе это исправила.

Какие выводы я сделал?

Независимость от конкретного сервиса не означает, что нужно забыть о независимости от хостинга. Если честно, ситуация с таймвебом была пущена мной на самотёк, но результатом было удаление сервера (аналогично ситуации, когда бы хостинг удалил его, если бы принял решение больше не обслуживать, например, сутулых очкариков).

Спас меня бэкап, хотя и очень кривой. Очевидно, что не сделай я его тогда, все мои изливания души канули бы в лету. Однако, возвращаясь к написанному выше, бэкапы желательно делать чаще, а не когда прижмёт.

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

И да, надо делать локальные копии постов на компе или в облаке.

На этом всё, пока!