Инструменты разметки на своём сервере: что нужно каждому для работы и где его разместить
Label Studio, CVAT, doccano, Argilla, INCEpTION и Potato: сервисы, база данных, вход и резервные копии при установке на свой сервер, а также хостинги по цене.
Инструменту разметки на своём сервере нужны от этого сервера четыре вещи: диск, который переживает перезапуск, база данных, которую документация самого инструмента рекомендует для продакшена, способ входа для разметчиков и резервная копия, которую вы хотя бы раз восстановили. Открытые инструменты сильнее всего различаются тем, сколько сервисов они приносят с собой, от одного контейнера до восемнадцати, и это число определяет большую часть работы по размещению, которую берёт на себя исследование.
Под размещением на своём сервере здесь понимается запуск инструмента разметки на машине, которой вы управляете, будь то лабораторный сервер, выделенные университетом облачные ресурсы или арендованная VM, так что данные никогда не проходят через сервис вендора. Это обычный выход, когда этический комитет, соглашение об использовании данных или больница не позволяют данным покидать периметр. Ниже сравнивается, что требуется для установки на свой сервер шести открытых инструментов согласно документации каждого проекта на октябрь 2026 года, а затем хостинги сравниваются по цене и по тому, что они сохраняют при перезапуске.
Требования к установке на своём сервере
Каждый из инструментов ниже хранит три вида состояния: объекты для разметки (например, текст, изображения, медиа), разметку, а также учётные записи и проекты, которые всё это связывают. Установка на своём сервере должна держать все три на диске, переживающем перезапуск, копировать их куда-то ещё и ставить перед ними вход. Ещё два выбора вытекают из архитектуры инструмента. Инструмент, поставляемый с SQLite, обычно рекомендует для продакшена сервер базы данных, а инструменту с очередью, кешем или поисковым движком нужно, чтобы каждый из них работал и сохранял данные. Большая часть работы по размещению возникает именно из-за этих дополнительных сервисов. Каждый из них означает ещё один контейнер, за здоровьем которого надо следить, и ещё один том для резервного копирования, а его версия должна оставаться совместимой с остальными при каждом обновлении.
Сравнение шести инструментов
В таблице сведено то, что документация каждого проекта говорит об установке на свой сервер для продакшена. «Сервисы» означает число контейнеров в эталонном файле Docker Compose проекта.
| Инструмент | Поддерживаемые варианты | Сервисы | База данных | SSO в бесплатной редакции | Руководство по резервному копированию сервера |
|---|---|---|---|---|---|
| Label Studio | pip, Docker, Compose, Helm | 3 | по умолчанию SQLite, при масштабе рекомендуется PostgreSQL | SAML SSO и LDAP только в Enterprise | только в документации Enterprise |
| CVAT | Compose, Helm | 18 | PostgreSQL | LDAP описан для Community; OIDC и SAML SSO в Enterprise | есть |
| doccano | pip, Docker, Compose | 6 | по умолчанию SQLite, в продакшен-Compose PostgreSQL | OAuth через GitHub и Okta | не найдено |
| Argilla | Hugging Face Spaces, Compose | 5 | по умолчанию SQLite, поддерживается PostgreSQL, плюс Elasticsearch или OpenSearch | OAuth2 и Keycloak | только экспорт датасетов |
| INCEpTION | JAR, Docker, Compose | 2 | встроенная HSQLDB, для продакшена рекомендуется MariaDB | SAML2 и OIDC | есть |
| Potato | pip, Docker, potato deploy | 1 | файлы и SQLite, MySQL по желанию | провайдеры OAuth и OIDC | встроенное резервное копирование в HF или S3 |
Label Studio работает как один контейнер или как стек Compose из nginx, приложения и PostgreSQL. По умолчанию он использует SQLite, и его руководство по хранению советует рассмотреть PostgreSQL при более чем 100 000 задач и 5 и более одновременных пользователях. Руководство по установке требует не менее 8 ГБ RAM, рекомендует 16 ГБ и рекомендует 50 ГБ диска для продакшена. Сравнение редакций относит SAML SSO, LDAP, ролевой доступ и журналы активности к платным функциям, а в редакции Community каждый пользователь видит каждый проект.
CVAT работает в Docker Compose или в Kubernetes. Его эталонный файл Compose определяет 18 сервисов, среди них PostgreSQL, Redis, kvrocks для кеширования, восемь фоновых воркеров, Traefik, сервис Open Policy Agent для авторизации и аналитический стек из ClickHouse и Grafana. CVAT пошагово описывает резервное копирование. Его руководство останавливает контейнеры, архивирует тома базы данных, медиа и аналитики и предупреждает, что для восстановления нужна в точности та же версия CVAT. LDAP описан для редакции Community, а единый вход через OIDC и SAML помечен как Enterprise.
doccano запускается как один контейнер с SQLite, а его продакшен-файл Compose добавляет Celery, RabbitMQ, nginx и PostgreSQL. Его руководство по установке предупреждает, что при обновлении пакета база SQLite теряется. В нём описан вход через GitHub и Okta. На октябрь 2026 года новейший выпуск на PyPI имеет номер 1.8.4 и датирован июлем 2023 года, а версия 1.8.5, опубликованная на GitHub в январе 2026 года, была отозвана с PyPI.
Argilla разворачивается на Hugging Face Spaces или через Docker Compose, где вместе работают сервер, воркер, PostgreSQL, Elasticsearch и Redis. Требуется Elasticsearch 8.5 или OpenSearch 2.4, и руководство по развёртыванию отмечает, что большинство проблем с развёртыванием связано с Elasticsearch. На бесплатном Space без постоянного хранилища перезапуск уничтожает датасеты, рабочие пространства и пользователей. Последний выпуск датирован мартом 2025 года.
INCEpTION работает как Java-приложение или контейнер, и для продакшена рекомендуется база MariaDB, потому что встроенная HSQLDB может повредиться при сбое машины. Разметка и тексты хранятся в файлах в его домашней папке, а руководство администратора полностью описывает резервное копирование и восстановление на уровне системы, и раздел о резервном копировании открывается предупреждением: «резервная копия, которую не удаётся успешно восстановить, ничего не стоит».
Potato работает как один процесс, установленный через pip или из одного образа Docker. Работа каждого разметчика хранится в файле в выходном каталоге, данные проекта лежат рядом в SQLite, а MySQL является возможностью, а не требованием. Процесс держит пул объектов и очередь назначений в памяти, поэтому работает с одним воркером gunicorn и большим числом потоков и растёт за счёт перехода на более мощную машину, а не за счёт добавления серверов. Вход через Google, GitHub, Hugging Face или любого провайдера OIDC входит в открытый пакет и настраивается в authentication.providers.
Число сервисов у каждого инструмента отражает задачи, которые он на себя берёт. Восемнадцать сервисов CVAT включают отдельные воркеры для импорта, экспорта, разбиения на фрагменты и отчётов о качестве, аналитический стек и авторизацию на основе политик, и всем этим может пользоваться большая команда с долгоживущей установкой. Argilla требует поисковый движок для своих датасетов. Potato обходится одним контейнером, что подходит исследованию, которое одна лаборатория настраивает, ведёт несколько недель и затем сворачивает.
Хостинги по цене и сохранности диска
Любой из этих инструментов работает на VM с Docker, и главный вопрос в том, переживает ли диск хостинга перезапуск. Цены ниже взяты из оценок, которые Potato 2.10 выводит для своих целей potato deploy при размерах по умолчанию, и на тех же машинах по той же цене работают и другие инструменты с учётом их потребностей в памяти.
| Хостинг | Цена в месяц | Диск переживает перезапуск |
|---|---|---|
| AWS Lightsail, 2 ГБ | $12 | да |
| Hetzner Cloud, 2 vCPU и 4 ГБ | около €6 | да |
| Fly.io Machine с томом 1 ГБ | около $6 | да |
| Jetstream2, с выделением ACCESS | бесплатно | да |
| Веб-сервис Render | бесплатно или $7 плюс диск | только с платным диском |
| Heroku Basic dyno | $7 | нет |
| Hugging Face Docker Space | тариф PRO или Team | нет |
Jetstream2 представляет собой исследовательское облако на средства NSF, так что исследователь из США с выделением ACCESS ничего не платит, и каждый инстанс получает DNS-имя с обычным сертификатом. В фиксированную цену Lightsail входят адрес IPv4 и диск на 60 ГБ, а нужны ему только lightsail:* и sts:GetCallerIdentity, что подходит для ограниченной университетской роли IAM. Инстанс Lightsail на 2 ГБ годится для Potato, а заявленный Label Studio минимум в 8 ГБ требует тарифа побольше.
Резервные копии на хостингах, которые стирают диск
Heroku стирает диск каждый день, а бесплатный тариф Render и Hugging Face Spaces теряют его при перезапуске. Исследованию на одном из этих хостингов нужна резервная копия, которая к тому же восстанавливается, иначе вернувшийся разметчик найдёт пустое задание.
Начиная с версии 2.10, блок backup в Potato копирует выходные данные разметки и снимки баз данных проекта в датасет Hugging Face или в S3-совместимый бакет, по умолчанию каждые пять минут, и восстанавливает их, когда сервер запускается с пустым диском. Восстановление возвращает учётные записи вместе с разметкой, так что разметчики входят с теми же паролями и продолжают с того места, где остановились, и никогда не перезаписывает разметку, уже лежащую на диске. Добавьте в конфигурацию этот блок, задав HF_TOKEN в окружении сервера и установив extra hosting:
backup:
schedule_minutes: 5
restore_on_boot: true
sinks:
- type: huggingface
repo_id: lab/pilot-annotationspotato deploy up добавляет такое же резервное копирование с флагом --backup hf или --backup s3 и не станет разворачивать на Heroku или Hugging Face Space без него, если только --demo не объявляет разметку одноразовой. Render, Railway, Fly и ECS Express требуют его в любом случае, потому что проект попадает на эти хостинги через хранилище резервной копии. На хостингах, где диск сохраняется, резервная копия всё равно держит вторую копию вне сервера, что защищает и от удалённого инстанса, а не только от перезапуска.
Какой бы инструмент вы ни выбрали, проверьте восстановление до начала исследования. Запустите новый инстанс из резервной копии, войдите как разметчик и убедитесь, что последняя сделанная вами разметка на месте. В Potato potato deploy pull копирует на вашу машину всё, что собрало развёртывание, а potato deploy destroy не удалит развёртывание, данные которого ни разу не скачивались, поэтому в конце исследования сначала выполните pull. На странице Запуск Potato локально или в облаке приведена команда для каждого хостинга.
Что дальше
- Настройка для продакшена: gunicorn, Docker и обратный прокси
- SSO и OAuth: настройка провайдеров входа
- Сравнение инструментов разметки: возможности, а не размещение