Не так давно на Хабре была небольшая волна постов и комментариев о том, как можно быстро и эффективно потерять данные своего проекта — неработающие или отсутствующие бэкапы, ошибки «железа» и прочие радости инженеров DevOps. Тогда я это всё прочитал с интересом — всегда же любопытно почитать про чужие факапы (про свои неинтересно). Через несколько дней я вдруг оказался среди таких же несчастных "уже делающих бэкапы".
Немного контекста - у меня есть свой домашний проект, которым я занимаюсь в свободное от работы время. Проект этот - User-Generated Content</p><p></p>" data-abbr="UGC-сайт">UGC-сайт. Лента постов пользователей, если по-нашему. Вот он - https://vombat.su, вдруг кому-то интересно. Проект существует с сентября, есть своя аудитория, пара модераторов и довольно лояльные правила. На проекте нет рекламы, т.е. он некоммерческий (не считая донатов, которые иногда прилетают от благодарных пользователей). Даже антикоммерческий слегка, т.к. на него я только трачу - даже периодически мерч пользователям отправляю.
Куда пропал мой сервер?
Теперь к сути. Сижу я, значит, "в базе", собираю статистику по пользователям. Вдруг подключение обрывается. Переподключиться не удаётся - отпадает на этапе ssh-коннекта к самому серверу. IP вообще перестал пинговаться. В личном кабинете хостера моего сервера нет вообще. А через минуту приходит на почту письмо о том, что сервер удалён. Причём, падает в спам.
Письмо об удалении
Сразу же пишу в поддержку не очень вежливое сообщение.
Понимаю, что начинаются проблемы, и в выходные отдохнуть не получится. Но ещё надеюсь на быстрое восстановление, ведь у меня куплена услуга бэкапов на внешнем хранилище. Параллельно ищу в почте хоть одно уведомление от хостера - проверяю весь спам, все входящие за последние 2 недели - пусто. У специалиста почему-то цель доказать, что уведомления были. Отправляю в ответ скриншот из Gmail с поиском всех писем по названию их компании.
Несколько раз спрашиваю про восстановление из бэкапов - в ответ получаю "ждите".
Дальше все скрины переписок буду добавлять под спойлер
Скрин переписки 2
Жду почти час. От поддержки тишина, напоминаю о себе. В ответ - "ждите, я отпишу". Ещё через некоторое время приходит ответ, из которого становится понятно, что ничего восстановить не удастся. И тут есть интересный момент №1 - специалист уточняет у меня, был ли сделан клон сервера. И действительно, я хотел сделать себе что-то типа UAT/препрода с полной копией проекта и актуальной базой за пару недель до описываемых событий. И по совету поддержки купил новый сервер (с оплатой на несколько дней) и создал тикет, чтобы развернули там актуальную копию из бэкапов (по обещаниям это должно было занять 1 день). 4 дня спустя копию никто так и не развернул, я перестал оплачивать тот сервер, и он удалился.
Скрин переписки 3
Ну и последнее сообщение поддержки о том, что всё плохо, но попробуют восстановить. Это уже спустя 2 часа после удаления. После этого меня просто игнорировали - я спросил ещё дважды, есть ли новости, но ответа не получил. Повесил заглушку на сайте и решил подождать до следующего утра, а заодно переспать со всеми этими мыслями о том, что дальше делать. Всё, что было локально - это бэкап базы почти 4-месячной давности (а ведь ещё было около 150 тыс. изображений), все видео (они лежат в отдельном хранилище) и 20 открытых вкладок с базой в TablePlus (к слову, часть данных оттуда удалось вытащить).
Скрин переписки 4
Ожидаемо, с утра ответа от поддержки не было. Попросил коллегу со своего компьютера написать им в чат - ответили сразу же. На вопрос "Где бэкапы, Лебовски?" был ответ, что они все удалены вместе с сервером, восстановить ничего не удалось.
Что же произошло?
Просрочка оплаты. Почему-то в их личном кабинете нет возможности добавить автоплатежи картой. В рабочей суматохе я забыл оплатить сервер. Раньше (у предыдущих хостеров) это решалось уведомлениями за несколько дней до необходимой оплаты. Либо же остановкой сервера до оплаты. В этот раз уведомлений не было, а сервер по истечении недели молча удалился. И все бэкапы, лежавшие на холодном хранилище, вместе с ним. Есть ли тут моя вина? Конечно - ответственность за оплату на мне. Но такой подход я встретил впервые.
Уже по факту я проверил их почтовый сервер на чёрные списки и обнаружил такую картину.
Видимо, поэтому Gmail эти письма (если они были) решил даже в спам не класть. Как при этом дошло письмо об удалении - загадка.
Почему я выбрал этот новый и не особо известный
Ещё немного об общении с хостером
В процессе размышлений о том, что же делать с проектом, я заглянул в оферту хостера. И нашёл там пункт:
Исполнитель имеет право
...
4.2.12 В случае не поступления оплаты от Заказчика или поступления оплаты не в полном объеме, не начинать оказание Услуг, либо незамедлительно приостановить предоставление Услуг до момента оплаты, уведомив об этом Заказчика.
Имеет право. Тем не менее, я пообщался со знакомым юристом, получил совет написать досудебку в любом случае. О чём и написал в письме хостеру. Получил вот такой ответ (авторский текст без изменений).
Добрый день!
Ваш сервер, был удален через 7 дней, после просрочки оплаты.
Наша система автоматически уведомляет о дате оплаты за 7 дней.
То, что Вы скинули в 4.2.12 это не обязательное требование, мы можем остановить, а можем нет.
За балансом Вы должны следить сами, письмо, по какой причине не дошло до вашего Email мы не знаем.
Претензию, Вы можете написать, но это пустая трата времени, у нас так же в оферте написано, что в случае каких либо сбоев и потери ваших данных по техническим причинам, мы можем возместить только сумму не более чем стоимость оплаченных вами услуг за 12 месяцев, не более того. В вашем случае, никаких сбоев не было, вы не оплатили услуги, по этой причине ваш сервер был удален. Он проработал бесплатно, неделю.
C уважением, Николай!
На вопрос о том, какой смысл в услуге бэкапов, если они (бэкапы) сразу удаляются, и нет возможности отделить их от услуги самого сервера, получил тоже прекрасный ответ.
Добрый день!
Что значит нет смысла? Бэкапы хранятся пока услуга активна, или вы хотите чтобы мы хранили бэкапы после удаления сервера?
Бэкапы в конкретном случае делаются, для восстановления вашего виртуально сервера, в случае каких то проблем с ним (пока услуга активна), но после удаления сервера, бэкапы так же удаляются.
Если Вы нимательно читали то в оферте написано :
4.2. Исполнитель имеет право:
4.2.12. В случае не поступления оплаты от Заказчика или поступления оплаты не в полном объеме,
не начинать оказание Услуг, либо незамедлительно приостановить предоставление Услуг до момента
оплаты, уведомив об этом Заказчика.Тут нет ни слова, что обязан отключить, мы имеем право отключить, а так же можем не отключать. За балансом и сроками оплаты услуг, вы обязаны следить сами, система удалила ваш виртуальный сервер не в день оплаты, а через 7 дней просрочки.
Так же, в Соглашение об уровне предоставления услуги (SLA - Service Level Agreement) - (https://ml.cloud/documents/appendix_3_SLA.pdf) написано :
6.3.2. При утрате данных пользователя без возможности восстановления из резервной копии (если
такая утрата обусловлена взломом сервера, администрируемого Исполнителем, либо является
следствием действий сотрудника Исполнителя, связана с аварией на оборудовании Исполнителя),
Заказчику компенсируется документально подтвержденный ущерб, но не более стоимости услуг за 12
месяцев.Хотя даже и этот пункт не попадает под ваш случай. Вы просрочили оплату, сервер удален, никаких других причин тут нет.
С уважением, Николай!
И следом ещё одно письмо:
Добрый день!
Давай те по существу, что Вы хотите?
С уважением, Александр!
А потом ответ на предложение компенсировать часть расходов:
Добрый вечер!
С этим мы не можем вам помочь.
Мы по доброте душевной, можем Вам активировать ВПС (той же конфигурации) на пол года, и это не в качестве компенсации, а просто по той причине, что нам вас жалко по человечески, хотя все что произошло, это сугубо ваша вина, 1 - за датой оплаты вы должны следить сами, вы могли закинуть денег на баланс с запасом, или привязать карту для автоматических списаний. 2 - бэкапы самих сайтов, вы так же должны делать сами!
С уважением, Александр!
Подход профессиональный, вызывает доверие. Как мне предлагалось привязать карту при отсутствии такой функции в ЛК - я не знаю, а от предложения бесплатного сервера по доброте душевной отказался.
И я, конечно, не сторонник теорий заговоров, но за день или два до удаления сервера мне пришло письмо от какой-то компании с вопросом о том, не хочу ли я продать свой проект. На что я ответил отказом.
Что было дальше?
Сразу промелькнула мысль - проект придётся закрыть. Это был бы самый простой вариант, конечно. Но ответственность перед пользователями и сожаления о проделанной для запуска проекта работе пересилили. Взял несколько выходных дней на основной работе, запасся чаем и едой и сел за восстановление. Развернул базу 4-месячной давности, посмотрел старые посты без картинок...
Первое, что сильно помогло, это сохранившиеся sitemap-файлы, в которых был список ссылок на все посты на момент падения. Выбрал те, что отсутствуют в базе, и получил список постов для восстановления.
Дальше глянул, что есть в кэше Гугла, Бинга и Яндекса. Как оказалось, есть там много, но, увы, без картинок. При этом в Бинге страницы начали таять буквально на глазах - при запросе страницы он её сразу начинал переиндексировать, и в кэш попадала 404. Яндекс же хранил кэш без каких-либо попыток его обновить, если сервер отдавал 404. Написал парсер кэша Яндекса, собрал оттуда за несколько часов посты вместе с юзернеймами, тэгами и оценками. Посты собрал, но вот часть из них была создана пользователями, которые тоже удалились. Восстановить пользователей возможным не представлялось, т.к. у меня был только список логинов, а email'ов не было. Создал юзера vombat-zombie, стал добавлять ему посты без пользователей, сохраняя отдельно оригинальный логин. Параллельно написал механизм, который возвращал посты, если пользователь заново зарегистрировался. Пока ложных срабатываний не было. Или я об этом не знаю.
Теперь у нас есть практически все посты, но нет ни одного изображения. Любители длиннотекстов порадовались, а я думал, что делать дальше.
Большой плюс (для восстановления, конечно) UGC-проектов - контент часто постится сразу на несколько подобных площадок. У меня даже предусмотрен механизм импорта постов со своего аккаунта Пикабу при регистрации на Вомбате. Дописал логику, чтобы можно было не только импортировать новые, но и обновить картинки у текущих постов, если найдены соответствия по URL.
А каким файлообменником для бэкапов вы пользуетесь? Конечно же Скайпом Пикабу.
Мем из недалёкого прошлого
Позже были написаны парсеры DTF (спасибо за удобное API) и Dzen (это было ужасно), которые вытащили ещё часть изображений. Были единичные случаи, когда картинки не соответствовали посту, но, как правило, пользователи об этом быстро сообщали, а мы исправляли.
Неожиданно подкинул картинок CDN Cloudinary, который использовался на проекте некоторое время назад. Как оказалось, он хранил все ассеты изображений, которые к нему попали. Ещё несколько десятков тысяч файлов были извлечены оттуда.
Оставшиеся без картинок посты я скрыл из общей ленты и сделал доступными для редактирования самими авторами - на текущий момент 1112 постов исправлено пользователями.
По итогу я запустил сайт через 4 дня от момента удаления, а за пару недель было восстановлено около 80% утраченных постов. К сожалению, комментарии восстановить не удалось, т.к. их не было в индексе поисковиков - они приезжают асинхронно.
Аудитория отнеслась к произошедшему довольно лояльно, сейчас проект продолжает свою работу, а я написал синхронизацию изображений и дампа БД на внешнее хранилище, что, разумеется, увеличит ежемесячные траты на проект, но уменьшит траты нервных клеток.
Автор: vombatina