Цифровая автаркия
Как жить, если отключат интернет
Утро, кофе, вы садитесь работать — а интернета нет. Не на пять минут, а насовсем. pip install — ошибка. docker pull — таймаут. GitHub не открывается. Что из вашей работы переживёт этот день? А месяц?
Цифровая автаркия — это инфраструктура, которая позволяет разрабатывать, собирать и запускать софт без доступа к интернету. По сути — полная копия интернета. Точнее, та его часть, которой программисту достаточно, чтобы написать любую программу, не беспокоясь о внешних потрясениях.
К автаркии стремится каждая крупная IT-компания — не из паранойи, а из опыта. Вендор внезапно меняет цены. Патентный тролль подаёт в суд. Репозиторий «прекращает работу в вашей стране». Санкции веером отключают целые регионы. Гиганту можно выключить интернет — он проживёт вечность на своих зеркалах и сборочных конвейерах. А где такая автаркия для всех остальных?
Возможна ли автаркия дома?
Чтобы ответить на этот вопрос, нужно поместить себя в нулевое состояние — когда не было вообще ничего.
Представьте: злой волшебник отправил вас на пять тысяч лет назад, в эпоху, когда только-только появились первые числа. Как восстановить математику? Человечеству понадобилось три тысячи лет, чтобы изобрести отрицательные числа, и ещё шестьсот, чтобы додуматься до ноля. Современный школьник открывает для себя и всё это за один урок. Три с половиной тысячи лет поисков и страданий сжимаются в сорок пять минут — потому что знание уже добыто и записано.
Если знание сохранено, цивилизация восстанавливается в кратчайшие сроки. Страшна не потеря вещей — страшна потеря знания.
В софте роль знания играет исходный код. Это единственный источник правды. Пакеты, бинарники и образы — лишь его производные: их всегда можно создать заново. А вот потерянный код придётся снова открывать, как это делали наши предки.
Отлично. Получается, если у меня есть полная копия GitHub, то автаркия готова? Не спешите. Дьявол, как всегда, кроется в деталях.
Проблема курицы и яйца
Копия GitHub — это как инструкция по сборке стола из IKEA в руках человека, стоящего в чистом поле. Ни отвёртки, ни болтов, ни дерева.
Или так: я стою в том же чистом поле с большой кулинарной книгой и хочу торт. Знания — вот они, все рецепты мира. Надо лишь: яйца, мука, масло... и духовка, разогретая до 200 градусов. Получается, мне, пока я одомашниваю курицу и выращиваю пшеницу, надо успеть построить мельницу и изобрести духовку. Судорожно листаю энциклопедию — и понимаю, что ради духовки придётся поднять целую промышленность. И это называется автаркия? До стола из IKEA с вкусным тортиком — сотни лет. Не пять тысяч, конечно, — знания-то есть, — но всё равно невыносимо долго.
С кодом та же история. Возьмём всеми любимую библиотеку PyTorch и попробуем собрать её из исходников. Смотрим зависимости: numpy, ninja, cmake, pyyaml... У каждой из них — свои зависимости, а у тех — свои. Ладно, строим дерево и собираем по порядку, машина всё стерпит. Стоп — а собирать я на чём буду? Нужен компилятор. И системные пакеты. Да и саму операционную систему надо бы собрать. А её — на чём?
Тупик: чтобы собрать что-то, нужно уже иметь всё. А на это уходят года.
Почему в софте это всё-таки возможно
В физическом мире из этого тупика не выбраться: духовка не сделана из рецептов. Но цифровой мир интереснее — в нём работает чистая математика, и если применить правильную теорему, можно срезать тысячелетия. Как с отрицательными числами и нулём.
Первыми всерьёз к проблеме отнеслись Nix и Guix двадцать лет назад. Правда, задачу они решали другую, до боли знакомую: пакет, собранный на одной машине, отказывался работать на другой. Виновата была «пожившая» среда сборки — она незаметно вносила свои зависимости в результат. Не всегда, конечно, — что бесит ещё сильнее, потому что ловить плавающую ошибку приходится в разы дольше.
Для решения проблемы позаимствовали идею у функционального программирования и объявили сборку чистой функцией. Получилось очень красиво: одинаковые исходники на входе дают байт-в-байт одинаковый результат на выходе. Всегда, на любой машине, хоть через сто лет.
Guix отшлифовал всё до предела. Вся система вырастает из бинарного файла размером 357 байт — его можно проверить вручную, глазами. Из него собирается крошечный ассемблер, из него — интерпретатор Mes, из него — TinyCC, из него — старый GCC, из него — современный, а дальше — что угодно, вплоть до PyTorch. Ни одного бинарника, которому приходится верить на слово. Вся мощь функционального программирования на ладони — в 357 байтах.
А в nixpkgs сегодня больше 100 000 инструкций воспроизводимой сборки. И вот что красиво: эти инструкции — тоже код, и лежат они в обычном git-репозитории. Функциональное программирование говорит: всё есть функция. Цифровая автаркия повторяет: всё есть код. Надо только это разглядеть.
Значит, если скопировать из интернета нужное и суметь это правильно прочитать, дома можно собрать любой пакет, любой бинарник и любой образ.
Автаркия возможна. Состоит она из четырёх слоёв: семена, ферма, склад и витрина. Два нижних — фундамент, два верхних — интерфейс для удобства.
Слой 1. Семена — исходный код
Решений тут море. Публичные хранилища — GitHub и GitLab — знают все. Менее известен Software Heritage — и это не хранилище, а архив в библиотечном смысле слова: он непрерывно обходит публичные репозитории и сохраняет их навсегда. Даже если разработчик передумает и удалит проект, код останется в Software Heritage — как книга остаётся в национальной библиотеке после того, как тираж сожгли.
Для собственного контура достаточно лёгких self-hosted зеркал: Forgejo или Gitea. Они поднимаются за вечер на самом скромном железе и умеют автоматически зеркалировать нужные вам репозитории.
Слой 2. Ферма — сборка
Семена в амбаре — ещё не еда. Их надо выращивать, и ферма для этого уже построена: установите Nix или Guix — и у вас конвейер, который превращает код в работающие программы.
Кстати, пересобирать всё из 357 байт при каждом чихе не придётся. Собранные узлы дерева зависимостей попадают в кэш и ускоряют сборку следующих пакетов с теми же ветками. Честность при этом не страдает: в основе лежит чистая функция, а значит, любой узел из кэша байт-в-байт совпадает с тем, что выросло бы из семени.
Урожай собран. Теперь его надо где-то хранить и как-то раздавать — и тут выясняется неприятное.
Слой 3. Склад — хранение и раздача
Склад не один: каждая экосистема изобрела свой. У Python — PyPI, у JavaScript — npm, у Rust — crates.io, у Debian и Ubuntu — apt-репозитории, у контейнеров — Docker Hub. И у каждого свой формат индекса, свой протокол, свои подписи. Обычный проект тянет зависимости из трёх-пяти таких складов одновременно — отключите интернет, и pip install умрёт первым, ещё до того, как вы заметите пропажу GitHub.
К счастью, есть два проекта, закрывающих вопрос. Harbor — личный склад для контейнерных образов и Helm-чартов. Универсальный Pulp умеет зеркалировать и раздавать pip, npm, apt и maven из одной коробки.
Осталось последнее: превратить склад в магазин, где готовое приложение достаётся с полки.
Слой 4. Витрина — запуск одним кликом
Для обычных пользователей есть множество сервисов с красивым UI: Cloudron, CasaOS, Umbrel, Runtipi, Coolify, CapRover, Dokploy. Кому нужно больше контроля — классическая связка Ansible + Docker. А для масштабных систем — Kubernetes.
Витрина прекрасна, на ней держится весь современный DevOps. Но есть нюанс: без первых трёх слоёв это витрина чужого магазина. Кнопка «установить» тянет образы из Docker Hub, те собраны из пакетов PyPI, а те — из кода на GitHub. Обрыв любого звена — и полка пуста. Именно поэтому «развернуть у себя» и «автаркия» — не одно и то же: разворачивать умеют все, переживать отключение — никто.
Витрина без нижних слоёв — отличный инструмент CI/CD. Витрина поверх трёх слоёв — цифровая автаркия.
Пояса цифровой автаркии
Собирать автаркию можно по частям, а зрелость измерять, как в единоборствах, — поясами.
Белый пояс. Своя инфраструктура плюс прокси-кэш: всё, что вы однажды скачали, остаётся у вас. Работает, пока работает интернет, — но монополист уже не диктует вам цены: стоимость ваших сервисов — розетка плюс железо.
Коричневый пояс. Локальное зеркало 20% лучших библиотек — тех, от которых вы реально зависите. Код без истории или с историей на полгода, сборка только последних версий, всё выращено и разложено по Harbor и Pulp. Отключение интернета вы заметите из новостей, а не из терминала.
Чёрный пояс. 100% лучших библиотек — а это, положа руку на сердце, процентов двадцать всего кода: остальное — легаси и шлак, который не жалко оставить за бортом. Полная история git, и вся пирамида сборки выращена из тех самых 357 байт, которым не нужно верить на слово. Интернет можно выключать. И самое удивительное: посчитайте объёмы — этот пояс помещается на личном компьютере.
Что в итоге
Ещё недавно сценарии «репозиторий ушёл из региона» и «сервис поднял цены вдвое» считались чёрными лебедями. Теперь лебеди летают стаями, по сезонному расписанию. Страховка, которая была нужна только гигантам, стала нужна каждому.
Все слои решения лежат в открытом доступе — осталось их собрать. Корпорации собрали это для себя. Очередь за всеми остальными.