ADAMANT IPFS Node v0.1.0: ограниченное хранилище и детерминированная репликация
Выпущен первый релиз ADAMANT IPFS Node v0.1.0, образ контейнера доступен по адресу ghcr.io/adamant-im/ipfs-node:0.1.0. Это автономное приложение на Node.js и Helia, выполняющее роль узла хранения IPFS для доставки файлов приложений. Оно не является оберткой для Kubo и не предоставляет API, совместимый с Kubo. Хотя ADAMANT Messenger является эталонным вариантом развертывания, любое приложение может самостоятельно разместить данный узел.
Среда выполнения службы предоставляет Express API по двенадцати документированным путям, включая проверку работоспособности, административные данные, многокомпонентную загрузку (multipart upload), скачивание по CID и метрики хранилища. Классы доступа принудительно ограничиваются централизованно, административный ключ по умолчанию закрывает доступ, а CORS работает на основе явного списка разрешенных источников. Жизненный цикл хранилища включает реестр файлов с поддержкой базы данных, надежный конечный автомат, резервирование дискового пространства, бюджет на прием данных, временные загрузки с TTL и сборку мусора на основе пороговых значений. Размещение использует детерминированное хеширование (rendezvous hashing) по настроенному набору узлов, при этом количество копий уменьшается по мере устаревания файлов. Репликация выполняется через версионированные протоколы с этапами подготовки, фиксации и отката. Каждый сеанс загрузки отслеживает созданные блоки, гарантируя, что отклоненные или прерванные запросы удаляют именно эти блоки.
Контрольные точки работоспособности учитывают состояние сети, используют сохраненную монотонную высоту и явную эпоху членства, принимая аттестации только от настроенных узлов. Улучшения надежности сети включают периодические проверки активности libp2p ping со сбросом сеанса при сбое и реактивное восстановление после ошибок устаревших потоков репликации. Обновления CORS и кодов ошибок включают возможность выбора точного происхождения app://. для настольных систем, машиночитаемые значения code и подстановочные знаки http(s)://*.onion, ограниченные форматами скрытых сервисов v3 для совместимости с Tor Browser.
Контейнер собран на базе node:24.13.0-bookworm-slim с использованием многоэтапного Dockerfile. Он работает от имени непривилегированного пользователя node с HOME=/data, что позволяет использовать один том для хранения blockstore, datastore, идентификатора узла, закрепленных файлов (pins), реестра, курсора восстановления и контрольных точек работоспособности. Образ поставляется без конфигурации; операторы должны смонтировать файл по пути /app/config.json5. Образ опубликован для архитектур linux/amd64 и linux/arm64 с SBOM и аттестацией происхождения.
Узел намеренно не использует DHT, IPNS, публичные шлюзы и API Kubo. Сохраненный контент не анонсируется в публичной сети IPFS, а контент из публичной сети не может быть получен через этот узел. Контролируемая топология узлов снижает публичное раскрытие метаданных маршрутизации контента, но сама по себе не делает развертывание приватным, анонимным, не требующим доверия или устойчивым к цензуре. Загрузка и скачивание по дизайну не требуют аутентификации, единственным учетным данным является административный ключ. В планах на будущее: удаление файлов с подписью загрузчика, обнаружение узлов, учет трафика, абсолютные пути к директориям данных и взаимодействие с публичной сетью.
Чтобы запустить узел, создайте том данных и запустите контейнер с соответствующей конфигурацией и пробросом портов:
docker volume create ipfs-node-data
docker run -d \
--name ipfs-node \
--restart unless-stopped \
--stop-timeout 20 \
-v ipfs-node-data:/data \
-v "$PWD/config.json5:/app/config.json5:ro" \
-p 127.0.0.1:4000:4000 \
-p 4001:4001 \
ghcr.io/adamant-im/ipfs-node:0.1.0
Релиз был проверен с помощью CI, аудитов безопасности и дымовых тестов контейнера для обеих архитектур. Рабочий процесс публикации подтверждает, что тег является предком master, соответствует версии в package.json и выполняет пересборку с OCI-метками, SBOM и аттестацией перед проведением второго дымового теста.