ФИАС с человеческим лицом

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет. Некоторое время назад пришлось разбираться в ФИАСе, хочу поделиться своими наработками. Эта статья расскажет о том как базу развернуть, как её обновлять и как ей пользоваться.

К счастью мне не пришлось во всём разбираться самому, потому что на Хабре есть хорошая серия статей о ФИАС (Адреса ФИАС в среде PostgreSQL), и у этих статей не менее ценные коменты. На их основе у меня получилось написать скрипты и написать Докер образ, всё опубликовано на ГитХабе.

Как работать с образом описано в README.md, здесь я распишу всё тоже самое но более подробно.

Требования

Для работы на базе Linux нужны:

  • docker

  • docker-compose

Для работы на базе Windows нужны:

  • WSL

  • Docker Desktop

Не менее 200 гигабайт постоянной памяти: 8 + 90 Гигабайт для бэкапа базы ФИАС, и 80 гигабайт на собственно базу.

200 Гигабайт это минимум, конечно надо иметь в запасе хотя бы 50 Гигабайт, потому что апдейты в разархивированном виде весят по 4 Гигабайта, и конечно надо следить за свободным местом.

Как установить

Что бы развернуть базу надо иметь бэкап этой базы. Идём на сайт ФИАСа и выкачиваем полную базу в формате DBF (8 Гб).

Выбираем директорию для установки базы (в том числе набора скриптов для обслуживания базы), в этой директории разворачиваем гит репозиторий:

git clone https://github.com/SbWereWolf/fias.git

Теперь надо разархивировать файлы бэкапа в директорию ./fias/fs/home/fias/base/, где ./ - это директория в которой мы развернули репозиторий (родительская для fias):

# извлечь файлы из архива
unzip /opt/fias_dbf.zip -d ./fias/fs/home/fias/base/
# удаляем "лишние" файлы
find ./fias/fs/home/fias/base/ -type f -regextype posix-awk \
    -regex ".*\/(STEAD|NORDOC)([0-9]{2}|[0-9]{4})\.DBF$" -exec rm {} \;

Для моего проекта нужны только Здания (HOUSE) и Помещения (ROOM), земельные участки (STEAD) и документы (NORDOC), мне не нужны, поэтому я их удаляю. Если вам в вашем проекте не нужны Помещения, то можно добавить их в маску поиска файлов для удаления: (STEAD|NORDOC|ROOM)

Переходим в директорию приложения

cd fias
# Делаем скрипт install.sh исполняемым и выполняем установку
chmod +x ./install.sh && ./install.sh

Все скрипты будут сделаны исполняемыми, будет создан docker-compose.yml

Открываем docker-compose.yml , изменяем параметры контейнера на свой вкус (можно поменять порт, можно установить пароль для пользователя postgres, можно сделать мапинг скриптов на директорию хостовой машины, что бы менять эти скрипты по ходу дела на свой вкус и тому подобное)

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

Теперь всё готово к сборке образа и запуска контейнера:

# Выполняем сборку и запуск контейнера
bash ./run.sh
# Разворачиваем базу
bash ./deploy.sh

База установлена. Выполнение процесса журналируется в ./docker/run.log и ./docker/deploy.log

Скрипты написаны с условием логина пользователя postgres без пароля, если вы установите пароль, то надо переписать все места запуска psql, убрать ключ -w добавить ключ с указанием пароля.

База развёрнута, можно пользоваться.

Как пользоваться

Можно пользоваться прямо в контейнере, подключаемся к терминалу:

cd /home/fias/
docker-compose -f ./docker/docker-compose.yml exec fias \
    psql -U postgres -d fias -w

Конечно можно подключиться любым клиентом (любой IDE, любым другим приложением):

Открываем на редактирование ./docker/docker-compose.yml, прописываем внешний порт и пароль пользователя postgres (переменная окружения контейнера POSTGRES_PASSWORD).

В приложении прописываем указанные ранее порт и пароль, пользователь postgres, сервер или 0.0.0.0 или localhost.

Запускаем контейнер: bash ./run.sh

Пользуемся и получаем удовольствие.

Как обновить

Выкачиваем со странички обновлений, архив с обновлениями в формате DBF.

Перед извлечением файлов из архива, чистим директорию обновлений в приложении: rm -rf ./fs/home/fias/update/*

Переходим в директорию репозитория (допустим репозиторий мы развернули в директории /home/): cd /home/fias/

Разворачиваем обновления в директорию репозитория: unzip /opt/fias_delta_dbf.zip -d ./fs/home/fias/update/

Удаляем "лишние" обновления:

find ./fs/home/fias/update/ -type f -regextype posix-awk \
    -regex ".*\/(STEAD|NORDOC)([0-9]{2}|[0-9]{4})\.DBF$" -exec rm {} \;

Запускаем контейнер: bash ./run.sh

Выполняем обновление: bash ./update.sh

Процесс обновления журналируется в файл ./docker/update.log

Have fun.

Производительность

На Pentium Gold + HDD под WSL база работает очень не спеша, разворачивание занимает до 4-х часов, большое обновление занимает до 8 часов.

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

10cpu | 18ram | 400hdd | nfs 10 раид из 16 sas дисков

На такой конфигурации затраты времени терпимые.

Разворачивание базы 1 час, обновление на 40 мегабайт (в архиве) раскатывается за полчаса, обновление на 400 мегабайт (в архиве) раскатывается около часа.

Выполнение построения полного адреса по uuid Здания занимает до 4-х секунд, но надо иметь в виду, что я не строил индексы для ускорения этой задачи, добавлены индексы только для ускорения разворачивания.

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

Хранимые процедуры для работы с базой смотрите в скриптах:

  • ./docker/cmd/deploy/get-address-object-group.sql

  • ./docker/cmd/deploy/get-address-object-name.sql

  • ./docker/cmd/deploy/get-address-object-tree.sql

  • ./docker/cmd/deploy/get-house-name.sql

И конечно читайте первоисточник - Адреса ФИАС в среде PostgreSQ

Спасибо за чтение. Пишите комментарии, будем обсуждать и делиться опытом.

Источник: https://habr.com/ru/post/573036/


Интересные статьи

Интересные статьи

Появившиеся в 2006 году сервисы Google по работе с текстовыми документами (Google Docs) и таблицами (Google Sheets), дополненные 6 лет спустя возможностями работы с вирту...
Много всякого сыпется в мой ящик, в том числе и от Битрикса (справедливости ради стоит отметить, что я когда-то регистрировался на их сайте). Но вот мне надоели эти письма и я решил отписатьс...
Возможность интеграции с «1С» — это ключевое преимущество «1С-Битрикс» для всех, кто профессионально занимается продажами в интернете, особенно для масштабных интернет-магазинов.
Одной из «киллер-фич» 12й версии Битрикса была объявлена возможность отдавать статические файлы из CDN, тем самым увеличивая скорость работы сайта. Попробуем оценить практический выигрыш от использова...
Согласно многочисленным исследованиям поведения пользователей на сайте, порядка 25% посетителей покидают ресурс, если страница грузится более 4 секунд.