EGRUL FTS API - микросервис, обрабатывающий информацию об организациях (юридических лицах) из Единого государственного реестра юридических лиц. Написан на Django-rest-framework, использует полнотекстовый поиск PostgreSQL.
Сервис предоставляет возможность обработки следующей информации:
- полное наименование организации;
- сокращенное наименование организации;
- ИНН;
- КПП;
- ОГРН;
- фактический адрес;
- код региона.
Предполагается, что все сведения из ЕГРЮЛ расположены в XML-документах, доступ к которым
предоставляет Федеральная налоговая служба России в соответствии с
установленным порядком.
Сведения из ЕГРЮЛ могут быть обработаны как по формату 405 (адреса в формате КЛАДР), так и по формату
406 (адреса в формате ФИАС).
Сведения о ликвидированных организациях в сервисе не обрабатываются.
В ЕГРЮЛ присутствуют организации с дублирующейся тройкой (ИНН, КПП, ОГРН). Логика работы сервиса
предлагает отказаться от филиалов организаций, чьи КПП одинаковые.
Сервис может использоваться как источник знаний для других сервисов, например cert_ecosystem, логика которого не предполагает использование более 10 миллионов записей из ЕГРЮЛ, но предполагает использовать определенное множество организаций, размер которого ограничен несколькими тысячами.
Установить проект:
git clone https://github.com/PrudyvusP/egrul_fts_api.git && cd "$(basename "$_" .git)"
Создать файл .env
, который должен содержать следующие переменные окружения:
- DB_ENGINE
- DB_NAME
- POSTGRES_USER
- POSTGRES_PASSWORD
- DB_HOST
- DB_PORT
- SECRET_KEY
- BACKEND_HOSTS
Предусмотрены два способа использования сервиса: локально и в docker-контейнере. Расположение
файла .env
зависит от выбранного способа развертывания сервиса.
├── egrul
│ ├── api
│ ├── egrul
│ ├── organizations
│ ├── .env <--- файл с переменными окружения для локального использования
│ ├── Dockerfile
│ ├── manage.py
│ └── requirements.txt
├── infra
│ ├── nginx
│ ├── .env <--- файл с переменными окружения для использования в docker
│ └── docker-compose.yaml
├── .gitignore
├── README.md
└── setup.cfg
Пример содержания файла .env
для способа развертывания в docker-контейнере:
DB_ENGINE=django.db.backends.postgresql
DB_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
DB_HOST=db
DB_PORT=5432
SECRET_KEY=indonesia_Xena
BACKEND_HOSTS=localhost web 127.0.0.1 testserver
Для развертывания необходимо перейти в директорию infra
и запустить последовательно
следующие команды от пользователя с правами root:
docker-compose up --build --d
docker exec -it infra_web_1 python3 manage.py migrate
docker exec -it infra_web_1 python3 manage.py collectstatic
Для того, чтобы попасть в psql из-вне нужно ввести команду:
docker exec -it infra_db_1 psql -U {POSTGRES_USER}
Для демонстрации логики работы сервиса предусмотрена команда, которая сгенерит 100 000 относительно похожих на реальные данные строчек в БД:
docker exec -it infra_web_1 python3 manage.py fill_test_data
Для использования реальных данных из ЕГРЮЛ предусмотрено использование следующей команды:
docker exec -it infra_web_1 python3 manage.py fill_egrul egrul_data/<path_to_dir_with_xml>
При этом egrul_data/<path_to_dir_with_xml>
в текущем виде конфига
смонтируется в /tmp/<path_to_dir_with_xml>
, где должны лежать XML-файлы из ЕГРЮЛ
В настоящее время сервис поддерживает три endpoint'а:
/api/organizations/
например, GET-запрос на/api/organizations/?page=2
вернет что-то вроде:
{
"count": 100000,
"next": "http://127.0.0.1/api/organizations/?page=3",
"previous": "http://127.0.0.1/api/organizations/",
"results": [
{
"full_name": "АКЦИОНЕРНОЕ ОБЩЕСТВО \"АВТОМОБИЛЬ\"",
"short_name": "АО \"АВТОМОБИЛЬ\"",
"inn": "550435143306",
"kpp": "123412345",
"url": "/api/organizations/129147/"
},
{
"full_name": "АКЦИОНЕРНОЕ ОБЩЕСТВО \"АВТОМОБИЛЬ\"",
"short_name": "АО \"АВТОМОБИЛЬ\"",
"inn": "396462764649",
"kpp": "567856789",
"url": "/api/organizations/196174/"
},
]
}
/api/organizations/<id>/
например, GET-запрос на/api/organizations/100043/
вернет нечто похоже на:
{
"full_name": "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"ЭПОХА\"",
"short_name": "ПАО \"ЭПОХА\"",
"inn": "205975495862",
"kpp": "123456789",
"ogrn": "4537933140928",
"factual_address": "ПЕР. ТЕСТОВЫЙ, Д.8, К.А, ВОРОНЕЖСКАЯ ОБЛАСТЬ, Г. ВОРОНЕЖ, 111111",
"region_code": "74"
}
/api/organizations/fts-search/?q=<запрос к полнотекстовому поиску>
GET-запрос на подобный эндпоинт вернет найденные записи в БД точно в таком же формате как указано в п. 1).
Параметрq
обязателен.
В админке по адресу admin/organizations/organization/
намеренно отключено отображение
всех организаций за нецелесообразностью такового. Доступен поиск.
- DRF
- PostgreSQL
- NGINX
- Docker
Для локального развертывания в закрытом контуре (без использования подключения к сети "Интернет")
возможно с помощью команд docker pull
, docker save
и docker load
получить docker images с Docker Hub.
Для реализации адекватного поиска по организациям целесообразно дополнить русскоязычный словарь стоп-слов PostgreSQL словами "общество", "акционерное" и тд.