Обновление до FindFace Multi 2.1.3

Совет

Если вы используете наш продукт FindFace Security, развернутый в Ubuntu 18.04, сначала обновите его до FindFace Multi 1.2, а затем обновите до FindFace Multi 2.1.3.

Если вы используете FindFace Multi 2.1 или FindFace Multi 2.1.0.1, обновите систему до FindFace Multi 2.1.3 с помощью следующей инструкции.

В версиях FindFace Multi 2.1+ не реализована работа плагинов Происшествия и VNS. Для этого есть отдельный продукт - FindFace CIBR. Поэтому включать плагины ffsecurity_incidents, ffsecurity_vns и ffsecurity_puppeteer в файле конфигурации findface-multi-legacy.py после обновления не нужно.

Интеграция с Axxon Next в версиях FindFace Multi 2.1+ является частью интеграции с внешними VMS и настраивается через плагин интеграции с VMS.

Если в версии FindFace Multi 1.2 вы создавали карточки человека или автомобиля с кастомными метаполями, то, чтобы они продолжали отображаться в интерфейсе FindFace Multi 2.1.3, необходимо в шаге №2 скопировать секцию CUSTOM_FIELDS из старого конфигурационного файла и в шаге №8 перенести ее в новый конфигурационный файл.

В этой главе:

Обновление FindFace Multi 1.2 до FindFace Multi 2.1.3

Важно

Перед началом обновления отключите все камеры.

Для обновления FindFace Multi 1.2 до версии FindFace Multi 2.1.3 выполните следующие действия:

  1. Создайте резервную копию старой схемы базы данных Tarantool:

    sudo cp /etc/findface-security/tnt_schema.lua /etc/findface-security/old_tnt_schema.lua
    

    Начиная с версии 2.0, одним из самых существенных отличий FindFace Multi от предыдущих версий продукта является структура биометрической базы данных Tarantool (так называемая «метасхема»). В новой структуре выделено несколько пространств (spaces), тогда как в прежних версиях было только одно пространство (space) по умолчанию.

  2. Откройте файл конфигурации /etc/findface-security/config.py. Сохраните значения параметров EXTERNAL_ADDRESS, SECRET_KEY, VIDEO_DETECTOR_TOKEN, ROUTER_URL, CUSTOM_FIELDS для последующего использования.

    sudo vi /etc/findface-security/config.py
    
    EXTERNAL_ADDRESS = "http://172.20.77.58"
    ...
    # use pwgen -sncy 50 1|tr "'" "." to generate your own unique key
    SECRET_KEY = 'c8b533847bbf7142102de1349d33a1f6'
    FFSECURITY = {
    'VIDEO_DETECTOR_TOKEN': '381b0f4a20495227d04185ab02f5085f',
    ...
    'ROUTER_URL': 'http://172.20.77.58',
    ...
    # -- Custom model fields --
    # Edit CUSTOM_FIELDS -> `human_card` section to customize human card fields.
    # Edit CUSTOM_FIELDS -> `face_object` section to customize face object fields.
    # Below is an example with every field type possible.
    # 'CUSTOM_FIELDS': {
    #     'human_card': {
    #         'items': [
    #             {
    #                 'name': 'personid',
    #                 'default': '',
    #                 'label': 'PersonID',
    #                 'display': ['list', 'form'],
    #                 'description': 'Sigur person ID',
    #                 'editable': False
    #             },
    #             {
    #                 'name': 'firstname',
    #                 'default': '',
    #                 'label': 'First Name',
    #                 'display': ['list', 'form'],
    #                 'description': 'Sigur first name',
    #                 'editable': False
    #             },
    #             {
    #                 'name': 'lastname',
    #                 'default': '',
    #                 'label': 'Last Name',
    #                 'display': ['list', 'form'],
    #                 'description': 'Sigur last name',
    #                 'editable': False
    #             },
    #             {
    #                 'name': 'version',
    #                 'default': '',
    #                 'label': 'Version',
    #                 'display': ['list', 'form'],
    #                 'description': 'Sigur photo version',
    #                 'editable': False
    #             }
    #         ],
    #         'filters': [
    #             {
    #                 'name': 'personid',
    #                 'label': 'Sigur person ID filter',
    #                 'field': 'personid'
    #             }
    #         ]
    #     },
    #     'face_object': {
    #         'items': [
    #             {
    #                 "field_name": "tag_name_1",
    #                 "type": "string",
    #                 "default": "change_me"
    #             },
    #             {
    #                 "field_name": "tag_name_2",
    #                 "type": "uint",
    #                 "default": 123
    #             },
    #             {
    #                 "field_name": "tag_name_3",
    #                 "type": "bool",
    #                 "default": True
    #             },
    #         ]
    #     }
    # },
    }
    
  3. Остановите сервис findface-security.

    sudo systemctl stop findface-security.service
    
  4. Создайте резервную копию базы данных векторов признаков на основе Tarantool в любой выбранной директории, например, /etc/findface_dump.

    sudo mkdir -p /etc/findface_dump
    cd /etc/findface_dump
    sudo findface-storage-api-dump -config /etc/findface-sf-api.ini
    
  5. Перед установкой новой версии остановите и отключите все сервисы во избежание конфликта портов.

    Примечание

    В примере ниже восемь шардов. Если количество шардов в вашей системе отличается от количества шардов в примере, измените приведенную ниже команду соответствующим образом. Например, для системы с шестнадцатью шардами замените tarantool@shard-00{1..8}.service на tarantool@shard-0{01..16}.service. Список активных шардов можно посмотреть с помощью команды ls /etc/tarantool/instances.enabled/.

    Можно остановить и отключить сервисы один за другим:

    sudo systemctl stop postgresql.service
    sudo systemctl stop postgresql@10-main
    sudo systemctl stop findface-*.service
    sudo systemctl stop pgbouncer.service
    sudo systemctl stop tarantool@shard-00{1..8}.service
    sudo systemctl stop nats-server.service
    sudo systemctl stop etcd.service
    sudo systemctl stop mongod.service
    sudo systemctl stop mongodb.service
    sudo systemctl stop memcached.service
    sudo systemctl stop nginx.service
    
    sudo systemctl disable postgresql.service
    sudo systemctl disable postgresql@10-main
    sudo systemctl disable pgbouncer.service
    sudo systemctl disable findface-extraction-api.service
    sudo systemctl disable findface-security.service
    sudo systemctl disable findface-security-onvif.service
    sudo systemctl disable findface-sf-api.service
    sudo systemctl disable findface-ntls.service
    sudo systemctl disable findface-video-manager.service
    sudo systemctl disable findface-video-worker-cpu.service
    sudo systemctl disable findface-video-worker-gpu.service
    sudo systemctl disable findface-counter.service
    sudo systemctl disable findface-liveness-api.service
    sudo systemctl disable findface-video-streamer-cpu.service
    sudo systemctl disable findface-video-streamer-gpu.service
    sudo systemctl disable findface-video-storage.service
    sudo systemctl disable tarantool@shard-00{1..8}.service
    sudo systemctl disable nats-server.service
    sudo systemctl disable etcd.service
    sudo systemctl disable mongod.service
    sudo systemctl disable mongodb.service
    sudo systemctl disable memcached.service
    sudo systemctl disable nginx.service
    

    Или использовать более компактные команды:

    sudo systemctl stop postgresql.service postgresql@10-main findface-*.service pgbouncer.service tarantool@shard-00{1..8}.service nats-server.service etcd.service mongod.service mongodb.service memcached.service nginx.service
    
    sudo systemctl disable postgresql.service postgresql@10-main pgbouncer.service findface-extraction-api.service findface-security.service findface-security-onvif.service findface-sf-api.service findface-ntls.service findface-video-manager.service findface-video-worker-cpu.service findface-video-worker-gpu.service findface-counter.service findface-liveness-api.service findface-video-streamer-cpu.service findface-video-streamer-gpu.service findface-video-storage.service tarantool@shard-00{1..8}.service nats-server.service etcd.service mongod.service mongodb.service memcached.service nginx.service
    
  6. Установите экземпляр FindFace Multi 2.1.3. Не забудьте предварительно подготовить сервер:

    См.:

  7. После установки продукта остановите все контейнеры FindFace Multi из директории /opt/findface-multi/.

    cd /opt/findface-multi/
    
    sudo docker-compose stop
    
  8. Откройте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py и вставьте сохраненные на шаге №2 значения для параметров EXTERNAL_ADDRESS, SECRET_KEY, VIDEO_DETECTOR_TOKEN, ROUTER_URL, и CUSTOM_FIELDS.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    ...
    # Use pwgen -sncy 50 1|tr "'" "." to generate your own unique key
    SECRET_KEY = '002231ccb690586f4d33e98322c591bb'
    ...
    SERVICE_EXTERNAL_ADDRESS = 'http://172.20.77.58'
    # EXTERNAL_ADDRESS is used to access objects created inside FFSecurity via external links.
    EXTERNAL_ADDRESS = 'http://172.20.77.58'
    ...
        # findface-video-worker authorization token
        'VIDEO_DETECTOR_TOKEN': '8977e1b0067d43f6c908d0bf60363255',
    ...
        # findface-video-worker face posting address,
        # it must be set to either FFSecurity EXTERNAL_ADDRESS (by default)
        # or findface-facerouter url (in some specific cases)
        'ROUTER_URL': 'http://127.0.0.1:80',
    
  9. Откройте старую версию файла конфигурации findface-ntls, доступную по адресу /etc/findface-ntls.cfg, и сравните ее с новой версией /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml. Перенесите все пользовательские параметры из старой версии в новую. Сделайте то же самое для других компонентов, например, для findface-extract-api проверьте /etc/findface-extract-api.ini на соответствие /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml, для findface-sf-api проверьте /etc/findface-sf-api.ini на соответствие /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml и т. д.

    sudo vi /etc/findface-ntls.cfg
    sudo vi /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml
    sudo vi /etc/findface-extraction-api.ini
    sudo vi /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml
    sudo vi /etc/findface-sf-api.ini
    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    

    Важно

    Правила переноса параметров из старого файла конфигурации в новый:

    • Если в новом конфигурационном файле на месте старой модели нейронной сети указана новая модель, замените новую модель на ту, которая использовалась ранее (при условии, что предыдущая модель все еще включена в FindFace Multi 2.1.3), а если предыдущая модель отсутствует в FindFace Multi 2.1.3, то ничего не меняйте. В этом случае вам придется выполнить миграцию на другую модель нейронной сети.

    • Если параметр в старом файле конфигурации имел пустое значение, а в новом файле конфигурации он заполнен – сотрите это значение.

    • Оставьте как есть параметры, не включенные в старый файл конфигурации, но присутствующие в новом файле конфигурации.

  10. Измените структуру базы данных Tarantool, применив схему tnt_schema.lua из версии Findface Multi 2.1.3.

    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3 make-tnt-schema | sudo tee /etc/findface-security/tnt_schema.lua
    
  11. Удалите данные из каталогов, соответствующих активным шардам.

    sudo rm /opt/ntech/var/lib/tarantool/shard-*/{index,snapshots,xlogs}/*
    
  12. Скопируйте метасхему пространства (space) default из старого файла конфигурации old_tnt_schema.lua в новый файл tnt_schema.lua, чтобы старая метасхема продолжала быть доступной. Это можно сделать следующим простым способом:

    12.1. В файле /etc/findface-security/old_tnt_schema.lua переименуйте следующие поля:

    meta_scheme --> meta_scheme_default
    meta_indexes --> meta_indexes_default
    

    12.2. В новом файле конфигурации /etc/findface-security/tnt_schema.lua замените строки в начале файла:

    cfg_spaces = {
      default = {
        meta_scheme = {
          -- internal.normalized_id:
          {
              default = '',
              field_type = 'string',
              id = 1,
              name = 'normalized_id',
          },
          -- internal.feat:
          {
              default = '',
              field_type = 'string',
              id = 2,
              name = 'feat',
          },
        },
        meta_indexes = {}
      },
    

    на следующие:

    dofile("/etc/findface-security/old_tnt_schema.lua")
    spaces = {
     default = {
        meta_scheme=meta_scheme_default,
        meta_indexes=meta_indexes_default
      },
    
  13. Перейдите в директорию с файлами конфигурации Tarantool /etc/tarantool/instances.available/. Импортируйте новую метасхему tnt_schema.lua в каждый файл конфигурации shard-00*.lua, как показано в примере.

    sudo vi /etc/tarantool/instances.available/shard-00*.lua
    
    dofile("/etc/findface-security/tnt_schema.lua")
    FindFace = require("FindFace")
    FindFace.start("127.0.0.1", 8104, {
        license_ntls_server="127.0.0.1:3133",
        replication = replication_master,
        spaces = spaces
     })
    
  14. Удалите генерируемый пакетом findface-tarantool-server дефолтный конфигурационный файл FindFace.lua (он помешает сделать перезагрузку).

    sudo rm -rf /etc/tarantool/instances*/FindFace.lua
    
  15. Перезапустите шарды findface-tarantool-server.

    TNT=$(ls /etc/tarantool/instances.enabled/ | cut -c 7,8,9)
    for i in $TNT; do sudo systemctl restart tarantool@shard-$i.service ; done
    

После выполненных операций в шардах по-прежнему останутся старые галереи, созданные в пространстве default. При этом станут доступны новые пространства (например, ffsec_body_objects_space, ffsec_face_clusters_space и т. д.).

  1. Восстановите в базе старые данные из резервной копии. Данные будут восстановлены в том виде, в котором они существовали в предыдущей версии: все галереи останутся в пространстве default.

    sudo systemctl start findface-ntls.service
    cd /etc/findface_dump
    for x in *.json; do sudo findface-storage-api-restore -config /etc/findface-sf-api.ini < "$x"; done
    
  2. Выполните миграцию галерей из пространства default на новые пространства:

    sudo systemctl start findface-sf-api.service
    sudo systemctl start nginx.service
    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate_tnt_space
    
  3. Выполните миграции базы данных PostgreSQL для совместимости с FindFace Multi 2.1.3. Сделайте следующее:

    18.1. Перейдите в файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py. В секции DATABASES -> default временно поменяйте пароль PASSWORD на старый, используемый в конфигурационном файле /etc/findface-security/config.py.

    Важно

    Обязательно сохраните пароль из файла конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py. Позже он понадобится.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'DISABLE_SERVER_SIDE_CURSORS': True,
            'NAME': 'ffsecurity', 'HOST': '127.0.0.1', 'PORT': 5439, 'USER': 'ntech', 'PASSWORD': 'XXXXXXXXXXXXXXXX'
        }
    }
    

    18.2. В файле /etc/pgbouncer/pgbouncer.ini добавьте следующую строку в секцию databases:

    ffsecurity_session = dbname=ffsecurity host=localhost port=5432 user=ntech pool_mode=session pool_size=10
    

    18.3. Выполните миграции базы данных на хосте:

    sudo systemctl start postgresql.service
    sudo systemctl start pgbouncer.service
    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate
    

    18.4. Сделайте резервное копирование существующей базы данных с PostgreSQL, установленной на хост-системе.

    cd /opt/findface-multi/
    sudo -u postgres pg_dump --verbose --disable-triggers ffsecurity | sudo tee dump_ffsecurity.sql
    sudo -u postgres pg_dump -t auth_group -t ffsecurity_adgroupguid -t ffsecurity_deviceblacklistrecord -t ffsecurity_ffsecauthsession -t ffsecurity_grouppermission -t ffsecurity_runtimesetting -t ffsecurity_user -t ffsecurity_user_groups -t ffsecurity_user_user_permissions -t ffsecurity_userkeyvalue -t knox_authtoken -t ffsecurity_watchlistpermission -t ffsecurity_cameragrouppermission --data-only --verbose --no-acl --no-owner --disable-triggers ffsecurity | sudo tee dump_identity_provider.sql
    

    18.5. Сделайте резервное копирование прав доступа ролей.

    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py dump_permissions | sudo tee permissions.csv
    

    18.6. Поменяйте обратно пароль, измененный на шаге №18.1

    18.7. Остановите все сервисы.

    sudo systemctl stop findface-sf-api.service nginx.service tarantool@shard-00{1..8}.service postgresql.service pgbouncer.service
    

    18.8. Откройте файл /opt/findface-multi/docker-compose.yaml и сохраните значение POSTGRES_PASSWORD для использования в последующих командах.

    18.9. Пересоздайте базу данных ffsecurity, чтобы очистить её от дефолтных данных. Вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали в шаге №18.8, в команду ниже:

    sudo docker-compose up -d postgresql
    sudo docker exec -it -u postgres findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} dropdb ffsecurity"
    sudo docker exec -it -u postgres findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} createdb -O ntech --encoding=UTF-8 --lc-collate=C.UTF-8 --lc-ctype=C.UTF-8 --template=template0 ffsecurity"
    

    18.10. Восстановите данные в только что созданную базу ffsecurity. Вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали в шаге №18.8, в команду ниже:

    sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} psql --username postgres ffsecurity" < dump_ffsecurity.sql
    

    18.11. Пересоздайте базу данных ffsecurity_identity_provider, чтобы очистить её от дефолтных данных. Вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали в шаге №18.8, в команду ниже:

    sudo docker exec -it -u postgres findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} dropdb ffsecurity_identity_provider"
    sudo docker exec -it -u postgres findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} createdb -O ntech --encoding=UTF-8 --lc-collate=C.UTF-8 --lc-ctype=C.UTF-8 --template=template0 ffsecurity_identity_provider"
    

    18.12. Запустите миграции.

    sudo docker-compose up -d pgbouncer
    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-identity-provider/findface-multi-identity-provider.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/identity-provider:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate
    

    18.13. Восстановите данные в базу ffsecurity_identity_provider. Вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали в шаге №18.8, в команду ниже:

    sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} psql --username postgres ffsecurity_identity_provider" < dump_identity_provider.sql
    

    18.14. Запустите все сервисы.

    sudo docker-compose up -d
    

    18.15. Запустите команду создания записей в таблице outbox для списков наблюдения и групп камер. Вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали в шаге №18.8, в команду ниже:

    sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} pg_dump --username postgres -f cg_wl_permissions.sql -t ffsecurity_cameragrouppermission -t ffsecurity_watchlistpermission --data-only ffsecurity_identity_provider"
    sudo docker run --rm --network host --volume '/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro' docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py create_outbox
    sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} psql --username postgres -c 'TRUNCATE ffsecurity_cameragrouppermission, ffsecurity_watchlistpermission RESTART IDENTITY;' ffsecurity_identity_provider"
    sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} psql --username postgres ffsecurity_identity_provider < cg_wl_permissions.sql"
    

    18.16. Прежде чем восстановить права доступа ролей в сервис identity_provider, проверьте файл /opt/findface-multi/permissions.csv. Обязательно замените *_ffsecauthtoken на *_authtoken, если таковой имеется. Чаще всего это применимо к тем случаям, когда установка FindFace Multi 1.2 представляла собой обновление с более ранних версий продукта.

    После этого восстановите права доступа ролей в сервис identity_provider.

    sudo docker run --rm --network host -v /opt/findface-multi/configs/findface-multi-identity-provider/findface-multi-identity-provider.py:/etc/findface-security/config.py:ro -v $(pwd)/permissions.csv:/var/permissions.csv:ro docker.int.ntl/ntech/multi/multi/identity-provider:ffmulti-2.1.3 /opt/findface-security/bin/python3 /tigre_prototype/manage.py load_permissions /var/permissions.csv
    

    18.17. Скопируйте полные кадры, нормализованные изображения и лицензионный файл. Скопируйте файлы из папки /opt/ntech/license/ в папку /opt/findface-multi/data/findface-ntls/, из /var/lib/findface-security/uploads/ в /opt/findface-multi/data/findface-multi-legacy/uploads/, из /var/lib/ffupload/uploads/ в /opt/findface-multi/data/findface-upload/uploads/.

    sudo cp -r /opt/ntech/license/* /opt/findface-multi/data/findface-ntls/
    sudo cp -r /var/lib/findface-security/uploads/* /opt/findface-multi/data/findface-multi-legacy/uploads/
    sudo cp -r /var/lib/ffupload/uploads/* /opt/findface-multi/data/findface-upload/uploads/
    sudo chmod 777 -R /opt/findface-multi/data/findface-upload/uploads/
    sudo chown www-data:www-data -R /opt/findface-multi/data/findface-upload/uploads/*
    

    Также можно напрямую смонтировать указанные выше папки в соответствующие контейнеры через файл docker-compose.yaml, как показано в примере ниже:

    sudo vi /opt/findface-multi/docker-compose.yaml
    
    ...
    findface-upload:
      image: docker.int.ntl/ntech/universe/upload:ffserver-9.230407.1
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-upload/40-ffupload.sh:/docker-entrypoint.d/40-ffupload.sh:ro',
        '/var/lib/ffupload:/var/lib/ffupload']
    ...
    findface-multi-identity-provider:
      depends_on:
        findface-multi-identity-provider-migrate: {condition: service_completed_successfully}
      healthcheck: {interval: 5s, retries: 3, start_period: 60s, test: 'curl -f http://localhost:8022/healthcheck
          || exit 1', timeout: 3s}
      image: docker.int.ntl/ntech/multi/multi/identity-provider:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-identity-provider/findface-multi-identity-provider.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-identity-provider-migrate:
      command: [migrate]
      depends_on: [pgbouncer, nats, nats-jetstream, findface-sf-api, findface-liveness-api,
        etcd]
      environment: {ADMIN_PASSWORD: admin}
      image: docker.int.ntl/ntech/multi/multi/identity-provider:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: on-failure
      volumes: ['./configs/findface-multi-identity-provider/findface-multi-identity-provider.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-legacy:
      depends_on:
        findface-multi-identity-provider: {condition: service_started}
        findface-multi-legacy-migrate: {condition: service_completed_successfully}
      healthcheck: {interval: 5s, retries: 3, start_period: 60s, test: 'curl -f http://localhost:8002/healthcheck
          || exit 1', timeout: 3s}
      image: docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-legacy-migrate:
      command: [migrate]
      depends_on: [pgbouncer, nats, findface-sf-api, findface-counter, nats-jetstream]
      image: docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: on-failure
      volumes: ['./configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-legacy-singleton-services:
      command: [run-single-instance-services]
      depends_on:
        findface-multi-identity-provider: {condition: service_healthy}
        findface-multi-legacy-migrate: {condition: service_completed_successfully}
      healthcheck: {interval: 5s, retries: 3, start_period: 60s, test: 'curl -f http://localhost:9901/healthcheck
          || exit 1', timeout: 3s}
      image: docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    cleaner:
      command: [run-cleaner-service]
      depends_on: [pgbouncer, findface-sf-api, findface-multi-legacy]
      image: docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-legacy/findface-multi-legacy.py:/etc/findface-security/config.py:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-ui:
      depends_on: [findface-multi-legacy]
      image: docker.int.ntl/ntech/multi/multi/ui:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-ui/nginx-site.conf:/etc/nginx/conf.d/default.conf:ro',
        '/var/lib/findface-security/uploads:/var/lib/findface-security/uploads']
    ...
    findface-multi-file-mover:
      command: [python3, /app/service.py, --config=/etc/config.yml]
      depends_on: [findface-multi-legacy, nats-jetstream]
      image: docker.int.ntl/ntech/multi/multi/file-mover:ffmulti-2.1.3
      logging: {driver: journald}
      network_mode: service:pause
      restart: always
      volumes: ['./configs/findface-multi-file-mover/findface-multi-file-mover.yaml:/etc/config.yml:ro',
        '/var/lib/findface-security/uploads:/mnt/slow_storage/uploads']
    ...
    

    18.18. Чтобы перенести данные Tarantool, выполните следующие действия:

    Остановите все контейнеры FindFace Multi:

    sudo docker-compose down
    

    Запустите снова старые шарды и сервис findface-sf-api :

    sudo systemctl start tarantool@shard-00{1..8}.service findface-sf-api.service
    

    Создайте новую резервную копию базы данных векторов признаков:

    sudo mkdir -p /etc/findface_dump_final
    sudo findface-storage-api-dump -output-dir=/etc/findface_dump_final -config /etc/findface-sf-api.ini
    

    Остановите остальные сервисы, очистите директорию instances.enabled, снова запустите контейнеры и выполните storage-api-restore:

    sudo systemctl stop tarantool@shard-00{1..8}.service findface-sf-api.service findface-ntls.service
    sudo rm /etc/tarantool/instances.enabled/*
    sudo docker-compose up -d
    sudo findface-storage-api-restore -config /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml /etc/findface_dump_final/*.json
    

Обновление завершено, но в новой версии присутствуют новые модели нейронных сетей, поэтому необходимо также сделать миграцию векторов признаков на другую модель нейронной сети, либо можно использовать старые нейронные сети, перенеся их из директории /usr/share/findface-data/models/ в директорию /opt/findface-multi/models/, указав их в файле /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml.

Обратите внимание, что модели обнаружения объектов в FindFace Multi 1.2 хранятся в отдельных директориях, то есть модели обнаружения лиц хранятся в директории /usr/share/findface-data/models/facedet/, модели обнаружения автомобилей и силуэтов хранятся в директориях /usr/share/findface-data/models/cadet/ и /usr/share/findface-data/models/pedet/ соответственно. В то время как в FindFace Multi 2.1.3 все модели обнаружения объектов можно найти в одной директории /opt/findface-multi/models/detector/. При переносе старых моделей нейронных сетей из директории /usr/share/findface-data/models/ в директорию /opt/findface-multi/models/ поместите все модели обнаружения объектов (facedet, cadet, pedet) в директорию /opt/findface-multi/models/detector/.

См. для справки:

$ ls -lash /usr/share/findface-data/models
total 52K
4.0K drwxr-xr-x 13 root root 4.0K Jul 15 14:48 .
4.0K drwxr-xr-x  3 root root 4.0K Jul 15 14:48 ..
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 cadet
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 carattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 carnorm
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 carrec
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 face
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 faceattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 facedet
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 facenorm
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 pedattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 pedet
4.0K drwxr-xr-x  2 root root 4.0K Jul 15 14:48 pedrec


$ ls -lash /opt/findface-multi/models/
total 44K
4.0K drwxr-xr-x 11 root root 4.0K Jul 17 13:37 .
4.0K drwxr-xr-x  6 root root 4.0K Jul 19 15:31 ..
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:37 carattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:37 carnorm
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:36 carrec
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 16:20 detector
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 16:24 face
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 16:24 faceattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:37 facenorm
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:37 pedattr
4.0K drwxr-xr-x  2 root root 4.0K Jul 17 13:37 pedrec

Важно

Настоятельно рекомендуется отключить автоматическое обновление Ubuntu, чтобы сохранить совместимость FindFace Multi со средой установки. В этом случае вы сможете обновлять ОС вручную, контролируя процесс обновления отдельных пакетов.

Для отключения автоматического обновления Ubuntu выполните следующие команды:

sudo apt-get remove unattended-upgrades
sudo systemctl stop apt-daily.timer
sudo systemctl disable apt-daily.timer
sudo systemctl disable apt-daily.service
sudo systemctl daemon-reload

Обновление FindFace Multi 2.1 / 2.1.0.1 до FindFace Multi 2.1.3

Независимо от того, какую версию FindFace Multi: 2.1 или 2.1.0.1 вы обновляете до FindFace Multi 2.1.3, процесс обновления будет одинаковым. Выполните следующие действия:

  1. В домашней директории пользователя создайте папку для резервного копирования данных FindFace Multi 2.1.

    mkdir ~/backup_data/
    
  2. Создайте резервную копию конфигурационных файлов FindFace Multi и файла docker-compose.yaml, а затем перейдите в директорию /opt/findface-multi/.

    sudo tar -cvzf ~/backup_data/configs.tar.gz -C /opt/findface-multi/ configs
    sudo cp /opt/findface-multi/docker-compose.yaml ~/backup_data/
    
    cd /opt/findface-multi/
    
  3. Сделайте резервное копирование данных PostgreSQL.

    sudo docker-compose cp postgresql:/bitnami/postgresql ~/backup_data/pg_bkp
    
  4. Сделайте резервное копирование данных Tarantool.

    sudo docker exec -it findface-multi-findface-sf-api-1 bash -c "mkdir ffmulti_dump; cd ffmulti_dump && /storage-api-dump -config /etc/findface-sf-api.ini"
    sudo docker cp findface-multi-findface-sf-api-1:/ffmulti_dump ~/backup_data/
    
  5. Для папки backup_data/, расположенной в домашней директории пользователя, выполните команду ls, чтобы просмотреть содержимое папки. Оно должно быть таким.

    ls ~/backup_data/
    
    configs.tar.gz  docker-compose.yaml  ffmulti_dump  pg_bkp
    
  6. Остановите все контейнеры FindFace Multi.

    sudo docker-compose down
    
  7. Удалите папки /opt/findface-multi/data/findface-tarantool-server/ и /opt/findface-multi/data/postgresql/.

    sudo rm -r /opt/findface-multi/data/findface-tarantool-server/
    
    sudo rm -r /opt/findface-multi/data/postgresql/
    
  8. Установите экземпляр FindFace Multi 2.1.3 в директорию /opt/findface-multi.

  9. Восстановите данные Tarantool из резервной копии.

    1. Скопируйте папку ~/backup_data/ffmulti_dump/ в контейнер findface-multi-findface-sf-api-1.

      sudo docker cp  ~/backup_data/ffmulti_dump/ findface-multi-findface-sf-api-1:/
      
    2. Восстановите данные Tarantool.

    sudo docker exec -it findface-multi-findface-sf-api-1 bash -c 'cd ffmulti_dump && for x in *.json; do /storage-api-restore -config /etc/findface-sf-api.ini < "$x"; done;'
    
  10. В новых конфигурационных файлах замените пароль для NTECH USER на тот, который использовался в FindFace Multi 2.1. Старый пароль можно получить из файла configs/postgresql/40-init.sql, находящегося в архиве резервной копии configs.tar.gz. Пароль NTECH USER должен быть заменен в следующих конфигурационных файлах:

    • findface-multi-legacy.py

    • findface-multi-line-crossing-analytics.yaml

    • findface-multi-identity-provider.py

    • findface-multi-audit.py

    • pgbouncer -> userlist.txt

    • postgresql -> 40-init.sql

    • findface-counter.yaml

  11. В новом конфигурационном файле /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py замените значения SECRET_KEY в секции GENERAL SETTINGS и 'VIDEO_DETECTOR_TOKEN' в секции FINDFACE SECURITY SETTINGS на те, которые использовались в FindFace Multi 2.1. Старые значения можно получить из файла configs/findface-multi-legacy/findface-multi-legacy.py, находящегося в архиве резервной копии configs.tar.gz.

  12. Сравните конфигурационные файлы версии 2.1 с файлами версии 2.1.3 для сервисов findface-ntls, findface-extract-api, findface-sf-api и т.д. Перенесите все пользовательские параметры из старой версии в новую. Возможно, потребуется внести изменения в файл docker-compose.yaml, если ранее вы добавляли или удаляли сервисы или вносили какие-либо другие изменения.

    Важно

    Правила переноса параметров из старого файла конфигурации в новый:

    • Если в новом конфигурационном файле на месте старой модели нейронной сети указана новая модель, замените новую модель на ту, которая использовалась ранее (при условии, что предыдущая модель все еще включена в FindFace Multi 2.1.3), а если предыдущая модель отсутствует в FindFace Multi 2.1.3, то ничего не меняйте. В этом случае вам придется выполнить миграцию на другую модель нейронной сети.

    • Если параметр в старом файле конфигурации имел пустое значение, а в новом файле конфигурации он заполнен – сотрите это значение.

    • Оставьте как есть параметры, не включенные в старый файл конфигурации, но присутствующие в новом файле конфигурации.

  13. Остановите все контейнеры FindFace Multi из директории /opt/findface-multi.

    cd /opt/findface-multi
    
    sudo docker-compose down
    
  14. Скопируйте данные из директории ~/backup_data/pg_bkp/data/ в директорию /opt/findface-multi/data/postgresql.

    sudo cp -r ~/backup_data/pg_bkp/data/ /opt/findface-multi/data/postgresql
    
  15. Запустите все контейнеры FindFace Multi.

    sudo docker-compose up -d
    

Примечание

Вы можете дополнительно развернуть Видеомагнитофон. См. Пошаговое развертывание Видеомагнитофона.