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

Совет

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

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

Если вы используете FindFace Multi в качестве сервера-«марионетки» для интеграции с FindFace CIBR, то после обновления включите заново и настройте плагин ffsecurity_vns в новом конфигурационном файле findface-multi-legacy.py.

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

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

В этой главе:

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

Важно

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

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

  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
    

    Примечание

    Если вы включили функцию Видеомагнитофон и хотите сохранить существующие видеозаписи в FindFace Multi 2.2, требуется дополнительный шаг. Создайте резервную копию MongoDB:

    sudo mongodump --out /etc/findface_dump/mongo_dump
    
  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 stop redis.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 disable redis.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 redis.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 redis.service
    
  6. Установите экземпляр FindFace Multi 2.2. Не забудьте предварительно подготовить сервер:

    См.:

  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-extraction-api, findface-ntls и findface-sf-api версии FindFace Multi 1.2, то сопоставьте изменённые вами параметры с параметрами в новых конфигурационных файлах версии FindFace Multi 2.2 и перенесите пользовательские параметры, такие как сетевые настройки (порты, URL и тд). Если параметр в старом конфигурационном файле версии FindFace Multi 1.2 не был изменен пользователем вручную, а в новом конфигурационном файле версии FindFace Multi 2.2 имеет другое значение после обновления, то изменять его вручную не рекомендуется.

    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.2 не имеет обратной совместимости с нейронными моделями предыдущих версий FindFace Multi 1.2 и ниже. Поэтому наименования нейронных сетей из конфигурационного файла /etc/findface-extraction-api.ini переносить нельзя в новый конфигурационный файл /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml.

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

    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.2.0 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 и т. д.).

  16. Восстановите в базе старые данные из резервной копии. Данные будут восстановлены в том виде, в котором они существовали в предыдущей версии: все галереи останутся в пространстве 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
    
  17. Выполните миграцию галерей из пространства 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.2.0 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate_tnt_space
    
  18. Выполните миграции базы данных PostgreSQL для совместимости с FindFace Multi 2.2. Сделайте следующее:

    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.2.0 /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.2.0 /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 и сохраните новое значение {NEW_POSTGRES_PASSWORD} для использования в последующих командах.

    grep postgresql\: docker-compose.yaml -A5 | grep POSTGRES_PASSWORD
        environment: {POSTGRESQL_ALLOW_REMOTE_CONNECTIONS: 'no', POSTGRES_PASSWORD: {NEW_POSTGRES_PASSWORD}}
    

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

    sudo rm -rf data/postgresql
    sudo docker-compose up -d --force-recreate postgresql
    

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

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

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

    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.2.0 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate
    

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

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

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

    sudo docker-compose up -d
    

    18.14. Запустите команду создания записей в таблице outbox для списков наблюдения и групп камер.

    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.2.0 /opt/findface-security/bin/python3 /tigre_prototype/manage.py export_to_outbox
    

    18.15. Прежде чем восстановить права доступа ролей в сервис 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.2.0 /opt/findface-security/bin/python3 /tigre_prototype/manage.py load_permissions /var/permissions.csv
    

    18.16. Скопируйте полные кадры, нормализованные изображения и лицензионный файл. Скопируйте файлы из папки /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-11.240325
      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.2.0
      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.2.0
      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.2.0
      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, nats-jetstream]
      image: docker.int.ntl/ntech/multi/multi/legacy:ffmulti-2.2.0
      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.2.0
      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.2.0
      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.2.0
      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.2.0
      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.17. Чтобы перенести данные 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
    

Примечание

Если вы создали резервную копию MongoDB на шаге 4 для сохранения видеозаписей Видеомагнитофона, выполните этот дополнительный шаг. Переместите резервную копию MongoDB в каталог /opt/findface-multi/data/mongodb и восстановите данные MongoDB. Сделайте следующее:

sudo cp -r /etc/findface_dump/mongo_dump/ /opt/findface-multi/data/mongodb
sudo chown mongodb:mongodb -R /opt/findface-multi/data/mongodb/mongo_dump/*
sudo docker exec findface-multi-mongodb-1 mongorestore data/db/mongo_dump

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

Важно

Настоятельно рекомендуется отключить автоматическое обновление 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.3 до FindFace Multi 2.2

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

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

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

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

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

      grep postgresql\: docker-compose.yaml -A5 | grep POSTGRES_PASSWORD
          environment: {POSTGRESQL_ALLOW_REMOTE_CONNECTIONS: 'no', POSTGRES_PASSWORD: {POSTGRES PASSWORD}}
      
    2. Создайте папку для резервного копирования данных PostgreSQL.

      mkdir ~/backup_data/pg_bkp
      
    3. Создайте резервные копии и вставьте значение {POSTGRES_PASSWORD}, которое вы ранее скопировали.

      sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} pg_dump --username postgres ffsecurity" > ~/backup_data/pg_bkp/legacy.sql
      sudo docker exec -i findface-multi-postgresql-1 /bin/bash -c "PGPASSWORD={POSTGRES_PASSWORD} pg_dump --username postgres ffsecurity_identity_provider" > ~/backup_data/pg_bkp/identity_provider.sql
      
  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  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.2 в директорию /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.

      Примечание

      Если вы обновляетесь с версии FindFace Multi, к которой применена офлайн лицензия Guardant, реализованная через USB-ключ, сначала выполните действия по настройке секции findface-ntls в файле /opt/findface-multi/docker-compose.yaml. Выполните шаги 2, 3 из инструкции Лицензирование через USB-ключ аппаратной защиты.

    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.3. Старый пароль можно получить из файла резервной копии ~/backup_data/configs/postgresql/40-init.sql. Пароль NTECH USER должен быть заменен в следующих конфигурационных файлах:

    • findface-multi-legacy.py

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

    • findface-multi-identity-provider.py

    • findface-multi-alerts.yaml

    • findface-multi-audit.py

    • pgbouncer -> userlist.txt

    • postgresql -> 40-init.sql

  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.3. Старые значения можно получить из файла резервной копии ~/backup_data/configs/findface-multi-legacy/findface-multi-legacy.py.

  12. Если вы вносили изменения в конфигурационный файл /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml версии FindFace Multi 2.1.3, то сопоставьте изменённые вами параметры с параметрами в новом конфигурационном файле /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml версии FindFace Multi 2.2 и внесите пользовательские параметры в него.

    sudo vi /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml
    

    Важно

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

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

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

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

    Важно

    Если вы вносили изменения в конфигурационные файлы /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml и /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml в версии FindFace Multi 2.1.3, то сопоставьте изменённые вами параметры с параметрами в новых конфигурационных файлах /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml и /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml версии FindFace Multi 2.2 и внесите пользовательские параметры в них при необходимости.

    sudo vi /opt/findface-multi/configs/findface-ntls/findface-ntls.yaml
    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    

    Возможно, потребуется внести изменения в файл docker-compose.yaml, если ранее вы добавляли или удаляли сервисы, или вносили какие-либо другие изменения.

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

    cd /opt/findface-multi
    sudo docker rm -f -v findface-multi-postgresql-1
    sudo rm -rf data/postgresql
    sudo docker-compose down
    
  14. Восстановите данные из резервной копии.

    1. Создайте контейнер postgresql заново.

      sudo docker-compose up -d --force-recreate postgresql
      
    2. Откройте файл /opt/findface-multi/docker-compose.yaml и сохраните новое значение {NEW_POSTGRES_PASSWORD} для использования на следующем шаге. Обратите внимание, что этот пароль будет отличаться от предыдущего.

      grep postgresql\: docker-compose.yaml -A5 | grep POSTGRES_PASSWORD
          environment: {POSTGRESQL_ALLOW_REMOTE_CONNECTIONS: 'no', POSTGRES_PASSWORD: {NEW_POSTGRES_PASSWORD}}
      
    3. Восстановите данные из резервных копий. Вставьте значение {NEW_POSTGRES_PASSWORD}, которое вы скопировали ранее.

      sudo docker exec -i  findface-multi-postgresql-1  bash -c "PGPASSWORD={NEW_POSTGRES_PASSWORD} psql --username postgres ffsecurity" < <(cat ~/backup_data/pg_bkp/legacy.sql)
      sudo docker exec -i  findface-multi-postgresql-1  bash -c "PGPASSWORD={NEW_POSTGRES_PASSWORD} psql --username postgres ffsecurity_identity_provider" < <(cat ~/backup_data/pg_bkp/identity_provider.sql)
      
  15. Запустите все контейнеры FindFace Multi.

    sudo docker-compose up -d
    

Примечание

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