Перейти к основному содержимому

Внутреннее хранилище

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

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

В конце главы — замер на четырёх больших порталах 12 октября 2026 года: какая доля файлов у них загружена, какая ведёт наружу и что происходит со ссылками.

Что это​

Под словом «хранилище» прячутся три разные вещи.

Хранилище файлов держит файл целиком: CSV, архив, снимок, PDF с методикой. Пользователь скачивает его по адресу каталога.

Хранилище таблиц — отдельная база, куда загружены строки таблицы. Из неё портал показывает таблицу в браузере, фильтрует её и отдаёт часть строк через API, не заставляя скачивать файл целиком. В CKAN это DataStore, у облачных сервисов — их собственная база записей.

Ссылка — хранилища нет вовсе: каталог хранит только описание и адрес файла или сервиса на чужом сайте.

В описании по DCAT разница видна в полях способа получения. Прямая ссылка на файл записывается в dcat:downloadURL, страница или сервис, через которые данные можно получить, — в dcat:accessURL. Ссылка на страницу ведомства — это уже не файл, а обещание, что файл где-то там найдётся. Подробнее о частях описания — в главе «Анатомия каталога».

«Внутреннее» не значит «на своём сервере». Почти все крупные порталы держат файлы в облачном объектном хранилище: греческий data.gov.gr — в Microsoft Azure, Humanitarian Data Exchange (HDX) и швейцарский opendata.swiss — в Amazon S3. Объектное хранилище — облачный склад файлов, где каждый файл лежит по своему ключу и отдаётся по HTTP. Пользователь этого не видит: он нажимает «Скачать» на странице портала. У HDX адрес портала переадресует на временную подписанную ссылку S3, которая 12 октября 2026 года жила три минуты. Ссылаться нужно на адрес портала, а не на тот, что оказался в строке браузера после скачивания.

Зачем нужна​

Чтобы файл не пропал вместе с чужим сайтом. Если файл лежит в каталоге, он доступен, пока жив каталог. Если каталог только ссылается на сайт ведомства, ссылка ломается при каждой переделке того сайта. При полной выгрузке data.gov.uk в 2023 году около 10% ссылок на файлы не открывались, а к 2026 году, по оценке самой службы, нерабочих ссылок стало больше четверти. Портал собирал ссылки на сайты муниципалитетов, а те меняли платформу или домен. Тот же вопрос в 2026 году разбирала Исследовательская служба Конгресса США: data.gov по закону — единая точка входа, которая ведёт на данные на сайтах ведомств, и в отчёте прямо поставлен вопрос, не должен ли он стать хранилищем, чтобы доступ к данным не пропадал вместе с сайтом ведомства.

Чтобы файл был тем же самым. Статья, отчёт или модель машинного обучения ссылаются на конкретные данные. Если по той же ссылке через год лежит другой файл, вывод уже не проверить. Своё хранилище позволяет посчитать контрольную сумму — короткий «отпечаток» содержимого, который меняется при изменении хотя бы одного байта, — и запретить подмену файла после публикации. С чужим сайтом ни то ни другое не гарантировать.

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

Чтобы проверить файл при загрузке. Кодировка, разделитель, заголовки, соответствие словарю полей проверяются в момент, когда файл приходит в каталог. Если файл живёт на чужом сайте, проверять приходится каждый раз заново, а исправить его каталог не может.

Чтобы проще было сохранить. Архив снимают с одного сайта, а не со ста. Как веб-архивы теряют данные, которые лежат по ссылкам на чужих серверах, — в главе «Архивация и спасение каталогов».

Обратная сторона — обязанности. Своё хранилище — это место, резервные копии, плата за исходящий трафик, удаление файла по требованию (персональные данные, ошибка, авторское право) и ответ на вопрос, кто следит за всем этим через пять лет. Документация DSpace, например, отдельно предупреждает, что при хранении в S3 возможна плата за трафик между хранилищем и сервером, если сервер стоит вне облака Amazon.

Варианты реализации​

Только ссылки​

Каталог — указатель. Так устроены многие геопорталы: слой живёт на картографическом сервере, каталог хранит адрес сервиса. Так же устроены сборщики: data.europa.eu, поисковики данных, национальные порталы, которые собирают описания ведомств. Чешский data.gov.cz не хранит ни одного файла: 12 октября 2026 года все адреса скачивания примерно 31 тысячи наборов вели на сайты публикаторов. В замере в конце главы у ирландского и швейцарского национальных порталов в выборке нет ни одного загруженного файла.

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

Ссылка с проверкой​

Каталог хранит ссылку, но регулярно её открывает и записывает результат. Так работает data.gouv.fr: отдельный обходчик hydra проверяет каждый ресурс, а в описании ресурса в API видны дата последней проверки, код ответа сервера, доступность и контрольная сумма. В CKAN то же делает расширение ckanext-archiver: оно скачивает файлы по ссылкам, показывает на странице ресурса, что ссылка сломана, и собирает отчёт о нерабочих ссылках для публикаторов.

Проверка не спасает файл, но превращает «ссылки как-то ломаются» в список, с которым можно работать: какие источники и с какого дня перестали отвечать.

Ссылка с копией​

Следующий шаг — хранить копию того, на что ссылаешься. ckanext-archiver предлагает пользователю сохранённую копию, если исходная ссылка сломалась. Обходчик data.gouv.fr идёт дальше: таблицы CSV и Excel, в том числе внешние, он загружает в PostgreSQL и переводит в Parquet, а для этих таблиц работает отдельный табличный API. На внешних ссылках ирландского data.gov.ie в замере тоже лежат копии таблиц в DataStore: портал скачивает файлы Центрального статистического управления и загружает их строки в свою базу.

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

Файлы у каталога​

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

  • Диск сервера. Самое простое и дешёвое для небольшого каталога. Резервные копии, место и перенос — на администраторе.
  • Объектное хранилище — S3, Azure Blob, Google Cloud Storage или совместимые с S3 системы на своих серверах вроде MinIO и Ceph. Место почти не ограничено, копии делает поставщик, но появляется плата за хранение и скачивание. Пользователь получает файл либо через сервер каталога, либо по переадресации на временную ссылку хранилища, как на HDX.
  • Несколько хранилищ сразу. Dataverse позволяет выбрать хранилище для каждой коллекции или набора, DSpace — завести несколько пронумерованных хранилищ и переносить файлы между ними, CKAN с версии 2.12 — держать файлы ресурсов, логотипы и вложения расширений в разных местах. Это нужно, когда у разных данных разные требования: большие снимки — в дешёвом облаке, чувствительные файлы — на своём сервере.

Для больших файлов важно, чтобы они не шли через сервер каталога. Dataverse умеет загрузку прямо в S3, минуя сервер, InvenioRDM — загрузку частями, которую можно продолжить после обрыва связи. InvenioRDM умеет и забрать файл по ссылке: сервер сам скачивает его и дальше хранит как свой.

Доверенное внешнее хранилище​

Промежуточный вариант для очень больших и чувствительных данных: файл остаётся у владельца, но каталог знает его точный адрес и правила доступа. В Dataverse это «доверенное удалённое хранилище» (trusted remote store): все файлы должны лежать по адресам, начинающимся с заданного базового адреса, а служебные файлы набора — описания, миниатюры — хранятся у самого Dataverse. В InvenioRDM такой файл помечается как удалённый, и документация честно предупреждает: доступность и целостность такого файла платформа не гарантирует.

Таблица в базе​

Файл CSV не только лежит, но и загружен в базу. Тогда можно посмотреть первые строки в браузере, запросить нужные через API и не скачивать всё. В CKAN это DataStore — отдельная база PostgreSQL, где каждая таблица привязана к ресурсу. Поиск по умолчанию отдаёт 100 строк, за один запрос — не больше 32 тысяч, запросы на SQL выключены, пока администратор их не включит. Таблицу целиком скачивают по адресу /datastore/dump/ID-ресурса в CSV, TSV, JSON или XML.

У облачных сервисов Huwise (бывший OpenDataSoft) и Socrata таблица в базе — основной режим: набор и есть таблица записей, файл получается выгрузкой из неё. Dataverse разбирает загруженные таблицы SPSS, Stata, R, Excel и CSV и описывает их переменные. У каталогов показателей — PxWeb, .Stat Suite — файлов нет вовсе, только база и API к ней.

Таблица в базе удобна для больших и часто обновляемых таблиц и бессмысленна для карты в PDF. Её цена — ещё одна база, которую нужно обновлять, и загрузчик, который ломается на «грязных» файлах: неожиданная кодировка, лишние строки над заголовком, разные типы в одной колонке.

Загрузчик можно вынести из рук издателя. data.gouv.fr, как сказано выше, сам загружает в базу каждый табличный файл, а Hugging Face так же переводит наборы в Parquet. Издатель при этом ничего не делает, но «грязный» файл и тогда даёт «грязный» API. Подробнее — в главе о передовых каталогах.

Смесь​

Часть наборов хранится, часть ссылается наружу. Так устроено большинство порталов открытых данных: реестр выгружается файлом в каталог, датчики и карты остаются на сервере ведомства. Смесь честна, если пользователь видит, какой способ у какого ресурса, а каталог проверяет внешние ссылки.

Неизменность, версии и контрольные суммы​

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

  • CKAN в классическом режиме перезаписывает файл ресурса при обновлении: адрес тот же, содержимое новое, прежнее не сохраняется. Для портала открытых данных, где ресурс «бюджет текущего года» обновляют каждый месяц, это удобно. Для данных, на которые ссылаются в исследованиях, — нет. В CKAN 2.12 появился новый способ работы с файлами: у каждого файла свой идентификатор и контрольная сумма, а изменить содержимое уже созданного файла нельзя, только удалить и создать новый.
  • Zenodo разрешает поправить файлы в течение 30 дней после публикации. Позже — только новая версия записи со своим DOI, а файлы старой версии остаются доступны, если автор их не закроет. Менять файлы старше 30 дней можно лишь в исключительных случаях: нарушение авторских прав, раскрытие персональных данных.
  • Dataverse при замене файла в опубликованном наборе создаёт новую версию набора, прежняя остаётся. Для каждого файла считается контрольная сумма, по умолчанию MD5, на выбор SHA-1, SHA-256 или SHA-512.
  • DSpace хранит контрольную сумму каждого файла и умеет регулярно сверять её с содержимым.

Контрольную сумму полезно отдавать и наружу. В DCAT 3 у способа получения для этого есть свойство spdx:checksum, data.gouv.fr показывает сумму в описании ресурса. Тогда пользователь, сборщик и архив могут проверить, что скачали тот же файл, а не исправленный тихо. Как устроены версии и идентификаторы — в главе «Постоянные идентификаторы, DOI и версии».

Размеры и лимиты​

У хранилища почти всегда есть предел размера файла, и о нём узнают, когда публикатор приходит с большим архивом.

ГдеПределЧто делать сверх него
CKAN, настройки по умолчанию10 МиБ на загружаемый файл (ckan.max_resource_size)поднять предел, если хватает места и сети; большие файлы класть в объектное хранилище и ссылаться
Zenodo50 ГБ и 100 файлов на записьодин раз до 200 ГБ по запросу; дробить набор ради обхода предела правила запрещают
Harvard Dataverse2,5 ГБ на файл через браузеркрупнее — по договорённости; на своём Dataverse предел задаётся для каждого хранилища
GitHub100 МиБ на файл, репозиторий лучше держать меньше 1 ГБGit LFS, вложения к выпуску, отдельное хранилище
Hugging Faceдля открытых наборов место «по возможности», для закрытых — 100 ГБсм. главу о ML-каталогах

Предел CKAN по умолчанию особенно коварен: 10 МиБ — это небольшая таблица. Портал, где предел не подняли, незаметно превращается в портал ссылок: всё, что крупнее, публикаторы кладут на свой сайт. Лимиты и цены научных репозиториев подробно — в главе о научных репозиториях.

Для данных в терабайты каталог обычно хранит описание, а сами файлы лежат в объектном хранилище, открытом на чтение всем, в форматах, которые читают по частям: Parquet для таблиц, Cloud Optimized GeoTIFF для снимков, Zarr для многомерных массивов. Так устроены Registry of Open Data on AWS и Source Cooperative — о них в главе об облачных хранилищах и хабах.

Когда нужна, а когда нет​

СитуацияЧто выбратьПочему
Научный репозиторий, данные к статьямсвои файлы, без перезаписи, версии, контрольные суммыстатья ссылается на конкретный файл через DOI, подмена ломает проверяемость
Портал организации, у которой данные лежат «на общем диске»свои файлынадёжного места у публикатора нет, ссылаться некуда
Национальный или региональный портал, который собирает ведомства и муниципалитетыссылки с регулярной проверкой; копии важных наборовдублировать всё дорого и даёт две расходящиеся копии, но о пропаже файла нужно узнавать первым
Геопортал над картографическими серверамиссылки на сервисы; файлы — только для выгрузок целикомслой живёт на сервере, каталог его не заменяет
Каталог показателейбаза показателей и API, файлов нетпользователь берёт срез, а не файл
Большие таблицы, которые фильтруют программы и людитаблица в базе с API плюс выгрузка целикомчастичный доступ без скачивания всего; выгрузка — для тех, кому нужно всё
Квартальный отчёт из одного файлатолько файлтаблица в базе ничего не добавит
Терабайты снимков, моделей, выгрузокобъектное хранилище, описание в каталогечерез сервер каталога такие файлы не пройдут
Чувствительные данныефайл у владельца, в каталоге — описание и порядок доступасм. главу о доступе и ролях

Коротко, как выглядит обоснование по шаблону карточки решения:

  • Контекст. Региональный портал на CKAN собирает описания 40 муниципалитетов. Половина ресурсов — ссылки на их сайты, часть сайтов в прошлом году переехала, жалобы на «битые ссылки» приходят ежемесячно.
  • Варианты. Оставить как есть; перенести все файлы на портал; оставить ссылки, но проверять их и хранить копии.
  • Критерии. Доля нерабочих ссылок, стоимость места и трафика, кто обновляет данные, риск двух расходящихся копий.
  • Решение. Ссылки остаются, ckanext-archiver проверяет их каждую неделю и хранит копии; отчёт о нерабочих ссылках раз в месяц уходит публикаторам. Муниципалитетам без своего сайта предложено загружать файлы прямо на портал.
  • Почему. Перенос всех файлов делает портал ответственным за свежесть чужих данных, а муниципалитеты продолжат обновлять свои сайты, и копии разойдутся. Проверка с копиями дешевле и даёт список проблем по источникам.
  • Когда пересмотреть. Если доля нерабочих ссылок за полгода не снизится или если портал станет единственным местом публикации по закону.

Как это сделано в платформах​

Пометки — ядро, расширение, нет, не проверено, как в сводной таблице. Сверено с документацией и репозиториями 12 октября 2026 года.

ПлатформаФайлы у себяОблачное хранилищеСсылки наружуТаблица в базе и APIФайл после публикации
CKAN 2.12ядрорасширение: в 2.12 — ckanext-file-keeper-cloud, раньше — ckanext-s3filestore и другиеядроядро (DataStore); заливка CSV — расширение XLoaderперезаписывается; новый способ работы с файлами в 2.12 — без изменения содержимого
Dataverseядроядро: S3 и совместимые, Swift, Globus; несколько хранилищядро: доверенное удалённое хранилищеядро: разбор табличных файлов, описание переменныхзамена создаёт новую версию набора
InvenioRDM, Zenodoядроядро с v13: S3 и совместимыеядро: удалённый файл, без гарантийнетZenodo — правка 30 дней, дальше новая версия
DSpaceядроядро: S3; несколько хранилищнетнетхранится контрольная сумма
Huwise (OpenDataSoft)ядро: вложения к наборухранит поставщикне провереноядро: набор и есть таблица записейне проверено
Socrataядрохранит поставщикядро: запись «ссылка на внешний источник»ядроне проверено
ArcGIS Hubядрохранит поставщикядро: слой может жить на сервере ArcGISядро (сервисы ArcGIS)не проверено
GeoNetwork 4.4ядро: вложения к записи в каталоге данных серверамодули S3, JCloud и CMIS в поставкеядро, основной режимнетне проверено
udata (data.gouv.fr)ядроне провереноядроотдельные открытые сервисы hydra и api-tabularне проверено
PxWeb, .Stat Suiteнет—нетядро (у PxWeb — собственный API, у .Stat — SDMX)—
Статический сайт, Gitфайлы рядом со страницами или по ссылкекак решитекак решитенет, пока сами не сделаетеистория Git хранит все версии

Для облачных сервисов «хранит поставщик» означает, что владелец портала не выбирает, где лежат байты, и не может забрать их иначе как выгрузкой. Это нужно учитывать в договоре: формат и срок выгрузки при уходе — такое же требование, как цена. Подробнее — в главе «Свои силы, свободное ПО или облачный сервис».

Расширения CKAN и их риски​

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

  • Облачное хранилище. В CKAN 2.12 появились настраиваемые хранилища, но в поставке только хранение на диске. Адаптеры облаков вынесены в ckanext-file-keeper-cloud сообщества CKAN; его тесты идут только на 2.12, выпусков на GitHub пока нет. Для версий до 2.12 есть расширения прежнего поколения: ckanext-s3filestore компании Keitaro тестируется на 2.10 и 2.11, но не на 2.12; ckanext-cloudstorage не меняли с февраля 2024 года и автоматических тестов у него нет; ckanext-blob-storage компании Datopian тестируется на 2.8 и 2.9, последний выпуск — январь 2023 года. Переход на 2.12 для портала с файлами в облаке — это смена расширения хранения, а не просто обновление.
  • Публичный бакет. Документация CKAN 2.12 предупреждает: если файлы ресурсов и картинки организаций лежат в одном хранилище и оно открыто на чтение, файлы закрытых наборов доступны всем без проверки прав. Для ресурсов и публичных картинок заводят разные хранилища.
  • Загрузка таблиц в DataStore. Официально поддерживаемый загрузчик — XLoader, тесты на 2.10–2.12. Альтернатива с разбором типов и вычислением полей описания — DataPusher+ компании datHere, его тесты идут на CKAN 2.11, выпуск 3.0.0 — январь 2026 года. Прежний DataPusher больше не поддерживается, документация CKAN предлагает уйти с него.
  • Проверка ссылок и копии. ckanext-archiver и работающий поверх него ckanext-qa, который оценивает открытость формата, ведёт сообщество CKAN, тесты на 2.10–2.12.

На живых порталах эти сборки видны по адресу /api/3/action/status_show. 12 октября 2026 года data.gov.gr на CKAN 2.11.3 держал файлы в Azure через cloudstorage и свой модуль, проверял ссылки archiver и qa, таблицы загружал XLoader. opendata.swiss на 2.11.6 и HDX на 2.11.4 хранили файлы в S3 через s3filestore, таблицы загружали собственная версия XLoader и DataPusher+. Ирландский data.gov.ie работал на CKAN 2.9.16 с прежним DataPusher — версия ядра и загрузчик, которые уже не поддерживаются.

Публикация без портала​

Без портала хранилище выбирают сами, и вариантов больше, чем кажется.

  • Файлы рядом со страницами статического сайта — для небольших наборов: всё лежит в одном месте и переезжает вместе с сайтом.
  • Git-репозиторий — история всех версий бесплатно, но предел 100 МиБ на файл. Большие файлы — во вложения к выпуску или в Git LFS. Подробнее — в главе о Git-репозиториях.
  • Zenodo или другой универсальный репозиторий — когда нужна неизменная копия с DOI. Выпуск репозитория GitHub можно архивировать в Zenodo автоматически.
  • Открытый бакет объектного хранилища — для больших данных; рядом нужен файл README.md с описанием и лицензией. Подробнее — в главе об облачных хранилищах и хабах.

Правило то же, что у портала: адрес файла не должен меняться, а исправленный файл — получать новое имя или новую версию. Контрольные суммы можно положить рядом файлом SHA256SUMS или записать в datapackage.json.

Как проверить живой портал​

Ручная проверка занимает десять минут.

  1. Откройте пять-десять наборов разных организаций и нажмите «Скачать». Посмотрите адрес файла.
  2. Домен совпадает с порталом или это облачное хранилище портала — файл лежит у каталога. Домен другой — это ссылка на источник.
  3. Откройте несколько внешних ссылок. Посмотрите, что открылось: файл, страница со списком файлов, главная страница сайта или ошибка.
  4. Если на странице набора есть таблица с фильтром и отдельный адрес API для её строк — включено хранилище таблиц.
  5. Найдите контрольную сумму или дату последней проверки ссылки. Если их нет, каталог не знает, тот ли это файл и жив ли он.

Замер на четырёх порталах​

На большом портале то же делают программой. 12 октября 2026 года через API CKAN взята тысяча наборов на каждом из четырёх порталов: десять блоков по сто наборов, равномерно по всему каталогу. Затем из каждого набора взят один случайный внешний ресурс, всего 300 на портал, и каждую ссылку открыли. Неудачные запросы повторили по одному с ожиданием до минуты.

ПорталНаборовРесурсов в выборке загружено на порталНаборов с таблицей в DataStoreВнешние ссылки: открылисьОшибка или ресурса нетЗакрыто для программСтраница вместо файла
data.gov.gr (Греция)22 73635%3%94%5%1%1%
HDX (ООН)28 31255%7%68%6%24%2%
data.gov.ie (Ирландия)22 7700%41%95%3%меньше 1%1%
opendata.swiss (Швейцария)16 5210%2%94%2%0%4%

«Ошибка или ресурса нет» объединяет ответы 404 и 410, ошибки сервера, недоступные домены, таймауты и ошибки сертификата. «Закрыто для программ» — ответы 401, 403 и 429: файл может существовать, но программа его не получает. «Страница вместо файла» — у ресурса указан формат файла (CSV, XLSX, PDF), а открывается веб-страница. Выборка в 300 ссылок даёт точность в несколько процентных пунктов, это ориентир, а не перепись. Все загруженные файлы, которые попали в контрольную выборку (по сто на греческом портале и HDX), открылись.

Что из замера следует.

Ошибки сосредоточены у немногих источников. На греческом портале 12 из 300 ссылок не открылись из-за ошибки сертификата, и все они ведут на один картографический сервер муниципалитета Ираклиона. На HDX 73 ссылки из 300 ответили отказом 403, и все — на каталог микроданных УВКБ ООН, который закрыт от программ. Проверку ссылок поэтому полезно сводить по доменам: один разговор с одним источником убирает большую часть проблем.

«Закрыто» и «удалено» — разные проблемы. Файл за проверкой от роботов существует, человек его скачает. Но сборщик, веб-архив и программа пользователя его не получат, и для них это такая же пропажа. Канадский open.canada.ca в тот же день отвечал на автоматические запросы отказом и задержками и на свой собственный служебный адрес API, поэтому в таблицу он не вошёл. Подробнее — в антипаттерне «Дверь закрыта для программ».

Ссылка открылась — ещё не значит, что данные на месте. Восемь наборов из выборки на швейцарском портале указывают формат CSV, а ссылка у всех ведёт на одну и ту же страницу города Берна со списком файлов. Ссылка с форматом PDF на сайт statistiquedesrevenus.ch переадресует на раздел сайта Agroscope: старый домен перенаправили, и вместо документа открывается раздел сайта. Программа, которая проверяет только код ответа, посчитает обе ссылки рабочими.

Хорошо собранный портал ссылок может быть надёжным. У ирландского и швейцарского порталов ни одного своего файла в выборке, а явных пропаж меньше 3%. Основные источники — статистические службы и городские порталы — сами ведут свои данные и не меняют адреса. Цифра data.gov.uk о четверти нерабочих ссылок — результат многолетнего сбора ссылок на сайты сотен муниципалитетов без проверки, а не неизбежное свойство модели ссылок.

Команды​

Для портала на CKAN. Первая команда берёт 500 наборов и считает долю загруженных ресурсов, ресурсов с таблицей в DataStore и самые частые внешние домены:

PORTAL=https://data.gov.gr
curl -s "$PORTAL/api/3/action/package_search?rows=500&start=5000" \
| jq '[.result.results[].resources[]] as $r | ($r | length) as $n | {
resources: $n,
uploaded: ([$r[] | select(.url_type == "upload")] | length / $n),
in_datastore: ([$r[] | select(.datastore_active == true)] | length / $n),
top_external_hosts: ([$r[] | select(.url_type != "upload") | .url | capture("^https?://(?<h>[^/]+)").h]
| group_by(.) | map({host: .[0], n: length}) | sort_by(-.n) | .[0:5])
}'

Вторая открывает внешние ссылки из той же выборки и печатает код ответа, тип содержимого и конечный адрес. Код 200 с типом text/html у ресурса с форматом CSV — повод открыть ссылку глазами:

curl -s "$PORTAL/api/3/action/package_search?rows=50&start=5000" \
| jq -r '.result.results[].resources[] | select(.url_type != "upload") | .url' \
| head -30 \
| while read -r url; do
curl -s -o /dev/null -L -m 30 -A "Mozilla/5.0" \
-w "%{http_code}\t%{content_type}\t%{url_effective}\n" "$url"
done

Не все серверы отвечают на запрос HEAD, поэтому команда делает обычный запрос и не сохраняет тело ответа. Запускайте проверку медленно, по одной ссылке: десятки параллельных запросов к одному сайту выглядят как атака, и вы получите отказ, которого у обычного пользователя не было бы.

Чтобы узнать, какие расширения хранения и проверки ссылок стоят на портале:

curl -s "$PORTAL/api/3/action/status_show" \
| jq '{ckan_version: .result.ckan_version,
storage: [.result.extensions[] | select(test("xloader|datapusher|archiver|qa|cloud|s3|blob|filestore|file_keeper"))]}'

Для data.gouv.fr результаты проверки уже записаны в описании каждого ресурса: поля check:status, check:available, check:date и контрольная сумма analysis:checksum. Доля загруженных на портал файлов видна по полю filetype: file — у портала, remote — ссылка.

curl -s "https://www.data.gouv.fr/api/1/datasets/?page_size=100&page=200" \
| jq '[.data[].resources[]] as $r | ($r | length) as $n | {
resources: $n,
uploaded: ([$r[] | select(.filetype == "file")] | length / $n),
checked: ([$r[] | select(.extras["check:status"] != null)] | length / $n),
not_available: ([$r[] | select(.extras["check:available"] == false)] | length / $n)
}'

Как превратить доли нерабочих ссылок в метрику качества и отслеживать её — в главе о метриках качества.

Что из этого следует​

  • Решите до запуска, где лежат байты: диск, облако или ссылки. Перенос уже загруженных файлов дороже, чем выбор в первый день.
  • Если на ваши файлы ссылаются годами — храните их у себя, не перезаписывайте после публикации и считайте контрольные суммы. Исправление — новая версия.
  • Если каталог ссылается наружу — проверяйте ссылки по расписанию, сводите ошибки по источникам и храните копии важных наборов. Проверяйте не только код ответа, но и то, что открылся файл, а не страница.
  • Поднимите предел размера загрузки до реального: 10 МиБ по умолчанию в CKAN незаметно превращают портал в портал ссылок.
  • Таблицу в базе с API заводите для таблиц, которые фильтруют и запрашивают, и всегда оставляйте рядом выгрузку целиком.
  • В CKAN выбирайте расширения хранения под свою версию ядра: при переходе на 2.12 облачное хранилище меняет расширение.
  • Давайте пользователю постоянный адрес файла на портале, а не временную ссылку облачного хранилища.

Источники​