Внутреннее хранилище
Каталог может хранить сами файлы или только описывать их и давать ссылку туда, где файл лежит. От этого выбора зависит, кто отвечает за то, что файл откроется через пять лет, и можно ли быть уверенным, что это тот же самый файл.
Практический вывод главы такой. Научному репозиторию и любому каталогу, на файлы которого ссылаются годами, нужно своё хранилище, и файл после публикации в нём не меняют: исправление — это новая версия. Порталу, который собирает чужие описания, и геопорталу, который показывает слои с картографических серверов, достаточно ссылок, но тогда ссылки нужно регулярно проверять, а у важных наборов держать копию. Таблицу в базе с 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) | поднять предел, если хватает места и сети; большие файлы класть в объектное хранилище и ссылаться |
| Zenodo | 50 ГБ и 100 файлов на запись | один раз до 200 ГБ по запросу; дробить набор ради обхода предела правила запрещают |
| Harvard Dataverse | 2,5 ГБ на файл через браузер | крупнее — по договорённости; на своём Dataverse предел задаётся для каждого хранилища |
| GitHub | 100 МиБ на файл, репозиторий лучше держать меньше 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.
Как проверить живой портал
Ручная проверка занимает десять минут.
- Откройте пять-десять наборов разных организаций и нажмите «Скачать». Посмотрите адрес файла.
- Домен совпадает с порталом или это облачное хранилище портала — файл лежит у каталога. Домен другой — это ссылка на источник.
- Откройте несколько внешних ссылок. Посмотрите, что открылось: файл, страница со списком файлов, главная страница сайта или ошибка.
- Если на странице набора есть таблица с фильтром и отдельный адрес API для её строк — включено хранилище таблиц.
- Найдите контрольную сумму или дату последней проверки ссылки. Если их нет, каталог не знает, тот ли это файл и жив ли он.
Замер на четырёх порталах
На большом портале то же делают программой. 12 октября 2026 года через API CKAN взята тысяча наборов на каждом из четырёх порталов: десять блоков по сто наборов, равномерно по всему каталогу. Затем из каждого набора взят один случайный внешний ресурс, всего 300 на портал, и каждую ссылку открыли. Неудачные запросы повторили по одному с ожиданием до минуты.
| Портал | Наборов | Ресурсов в выборке загружено на портал | Наборов с таблицей в DataStore | Внешние ссылки: открылись | Ошибка или ресурса нет | Закрыто для программ | Страница вместо файла |
|---|---|---|---|---|---|---|---|
| data.gov.gr (Греция) | 22 736 | 35% | 3% | 94% | 5% | 1% | 1% |
| HDX (ООН) | 28 312 | 55% | 7% | 68% | 6% | 24% | 2% |
| data.gov.ie (Ирландия) | 22 770 | 0% | 41% | 95% | 3% | меньше 1% | 1% |
| opendata.swiss (Швейцария) | 16 521 | 0% | 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 облачное хранилище меняет расширение.
- Давайте пользователю постоянный адрес файла на портале, а не временную ссылку облачного хранилища.
Источники
- CKAN 2.12: хранение файлов и настраиваемые хранилища — предел 10 МиБ, адаптеры облаков в отдельном расширении, предупреждение о публичном хранилище, неизменяемые файлы нового способа; DataStore — PostgreSQL, пределы выдачи, выгрузка, XLoader, DataPusher+ и прекращение поддержки DataPusher
- Расширения CKAN: ckanext-file-keeper-cloud, ckanext-s3filestore, ckanext-cloudstorage, ckanext-blob-storage, XLoader, DataPusher+, ckanext-archiver, ckanext-qa — файлы автоматических тестов и даты изменений, проверено 12 октября 2026 года
- Dataverse: хранение файлов — S3, Swift, Globus, доверенное удалённое хранилище, прямая загрузка, временные ссылки, контрольные суммы
- InvenioRDM: хранение в S3 (с v13) и способы передачи файлов — свой, забрать по ссылке, частями, удалённый
- Zenodo: работа с файлами — 50 ГБ и 100 файлов, правка в течение 30 дней
- DSpace: слой хранения — диск и S3, несколько хранилищ, контрольные суммы, плата за трафик
- GeoNetwork: модули хранения в выпуске 4.4.12
- Socrata: ссылка на внешний источник данных
- data.gouv.fr: обходчик hydra и табличный API; поля проверки в API наборов, проверено 12 октября 2026 года
- Замер 12 октября 2026 года: API CKAN порталов data.gov.gr, HDX, data.gov.ie, opendata.swiss, по 1000 наборов и 300 внешних ссылок на портал; адрес
status_showдля версий и расширений; переадресация HDX на временную ссылку S3 - И. Бегтин, Хорошие и плохие практики публикации данных, ноябрь 2024 — доля нерабочих ссылок на data.gov.uk при выгрузке 2023 года
- Congressional Research Service, Data.gov: Implementation and Perspectives on Its Functions, R48954, 21 мая 2026 года — реестр или хранилище, сохранность доступа к данным
- GDS, What's changing on data.gov.uk and why, 25 марта 2026 года — не меньше 25% ссылок ведут на ошибку
- Анатомия каталога, API и массовая выгрузка, публикация без портала: статические сайты — data.gov.cz как портал без файлов
- Передовые каталоги — табличный API data.gouv.fr и перевод наборов в Parquet на Hugging Face