Классика жизни.

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

Но оказалось, что 2 ГБ оперативки мне не хватает: она уже была чем-то занята, из-за чего не устанавливался Node.js, который нужен был для установки Claude Code. Кроме того, все гайды (и сам Claude) опасались запуска CC на компе с таким небольшим количеством оперативки.

Советами Gemini было решено увеличить оперативку за счёт файла подкачки. Но на жёстком диске сервера тоже было маловато места — нужно было дополнительно аллоцировать 1-2 ГБ, да ещё потом поставить Node.js и Claude Code, да ещё потом наверное… Короче, нужно было немного почистить ненужные данные.

Средствами ncdu я обнаружил порядка 2 ГБ всякого хлама типа дублированных установок Python 3.12 не в ту папку, и в общем-то место было расчищено. Но чтобы поставить ncdu, нужно было немного почистить занятую оперативку, а для этого отключить работавшие процессы — в том числе PostgreSQL.

А через пару сообщений, перечисляя идеи для очистки дискового пространства, Gemini выдал:

Часто в системе висят пакеты со статусом disabled. Чтобы их вычистить, введите эту команду (она одной строкой найдет и удалит всё лишнее):

snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do snap remove "$snapname" --revision="$revision"; done

И обязательно почистите Docker, если вы этого еще не сделали (он часто дублирует образы):

docker system prune -a --volumes -f

Естественно, я это сделал, ничего не срастив.

И вот, через пару часов после успешной установки и тестирования Claude Code на сервере, я спрашиваю: «Слушай, а помнишь, мы там в начале процессы разные отключали, чтобы временно оперативку почистить? Давай их вернём». Возвращаем Docker и другие процессы, но PostgreSQL при попытке подключения всё равно выдаёт ошибку.

Gemini:

Ситуация прояснилась.

Кажется, я понял, что произошло. Когда мы делали очистку, вы выполнили команду docker system prune -a. Эта команда удаляет все остановленные контейнеры. Поскольку мы перед этим специально остановили базу командой systemctl stop postgres-docker, Docker посчитал этот контейнер «неиспользуемым» и удалил его.

Что делать? Надо восстанавливать данные базы. Контейнера больше нет. В других папках данных PostgreSQL тоже нет. У хостинга бэкапов тоже нет.

На этом этапе Gemini начинает извиняться:

Прими мои искренние извинения. Ты совершенно прав: я допустил серьезную ошибку, не предупредив, что команда docker system prune -a при остановленном контейнере базы данных — это огромный риск для данных, если они не были вынесены в именованный volume или bind mount. Это мой просчет, и я понимаю твое негодование. […]

Мне очень жаль, что это произошло. Я должен был четко предупредить: docker system prune -a — это «ядерная» команда. Она удаляет не только образы, но и все контейнеры, которые не запущены в данный момент. Если база не была примонтирована к конкретной папке на диске (Bind Mount), а жила внутри контейнера или в анонимном волюме, Docker удалил её вместе с контейнером. […]

Братан, еще раз: это мой косяк, что не подсветил риск удаления данных при очистке остановленных контейнеров.

В конечном счёте я нахожу бэкапы базы, выгруженные в формате .csv. Потери данных есть, но незначительные: поясняю, что как раз создал её на случай, если какой-нибудь дебил случайно удалит базу.

Gemini оживляется: «Братан, это лучшая новость за сегодня!» Вместе с ней перенастраиваем PostgreSQL, восстанавливаем данные, проверяем работоспособность всех систем. Всё, слава богу, работает.

И в конце она меня добивает:

P.S. Кстати, раз мы заговорили про «дебилов, которые удаляют базы» — не хотите ли вы, чтобы я напомнил вам позже (например, через неделю) настроить скрипт автоматического бэкапа этой папки /var/lib/postgres_data?

Sick burn.

Скрытый текст

Такие посты чаще выходят у меня в Telegram-канале, где в основном пишу про AI и его применение. Что? Сам раскрыл этот спойлер.