Просмотр запущенных контейнеров:

docker ps

Остановка сервиса Address Book без очистки docker container и docker network:

./ecss-address-book.sh stop

Остановка сервиса Address Book с очисткой docker container и docker network:

./ecss-address-book.sh down

Запуск сервиса Address Book:

./ecss-address-book.sh up

Запуск обновления сервиса Address Book. Можно указать дополнительный параметр --version с желаемой версией:

./ecss-address-book.sh update --version 1.7.0

Перезагрузка сервиса Address Book:

./ecss-address-book.sh restart

Сервис Address Book использует четыре конфигурационных файла:

  1. ./address-book/stable/.env — основной файл конфигурации с настройками по умолчанию;

  2. ./address-book/stable/.env.override — файл для пользовательских настроек. Его значения заменяют настройки в основном файле .env при запуске сервиса или обновлении версии;

  3. ./address-book/stable/settings.yaml  — основной файл конфигурации настроек импорта (источники, мапперы, настройки импорта); 
  4. ./address-book/stable/settings.override.yaml — файл для пользовательских настроек импорта. В отличие от .env.override, он не заменяет основной файл settings.yaml, а расширяет или переопределяет отдельные параметры, имея приоритет при запуске.

Для корректной работы все настройки необходимо вносить в файл .env.override. Сервис автоматически перенесёт указанные значения в основной файл .env.

В файле .env.override не должно быть строк-комментариев.

Для корректного импорта контактов все настройки импорта необходимо вносить в файл settings.override.yaml. Для применения изменений перезапускать сервис не обязательно.

Важно! При заполнении файла settings.override.yaml необходимо строго соблюдать структуру YAML — отступы, двоеточия и иерархию разделов.


DOCKER_REPO="hub-ims.eltex-co.ru"

TAG=1.7.0
RESTART_POLICY="unless-stopped"
VOLUMES_DIR=./volumes
# SECRET_KEY_BASE=""
AUTH_TYPE=BY_ELPH_TOKEN # || BY_KEYCLOAK_JWT || API_KEY
API_SECRET_KEY="some-token"
HOST=localhost
PORT=4000
LOGGER_LEVEL="info" # Поддерживаемые уровни логирования: "emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"
SYSTEM_ADDITIONAL_SETTINGS_FILE_NAME="settings.yaml"
USER_ADDITIONAL_SETTINGS_FILE_NAME="settings.override.yaml"

# ============================ НАСТРОЙКИ MONGODB =========================
MONGO_TAG=6.0-${TAG}
DATABASE_SEEDS=mongo1:27017
DATABASE_TIMEOUT=60000
DATABASE_IDLE_INTERVAL=1000
DATABASE_QUEUE_TARGET=5000
DATABASE_NAME=address-book

FAVORITES_LIMIT=50 # Лимит избранных контактов пользователя
# ======================= НАСТРОЙКИ KEYCLOAK =======================

KEYCLOAK_ENABLED=TRUE # В случае отключения будет невозможна работа с сервисом с авторизацией типа BY_KEYCLOAK_TICKET и выгрузка контактов из КК

KEYCLOAK_INIT_TAG=26.0.0-${TAG}
KEYCLOAK_CLIENT_SECRET="some-token"
KEYCLOAK_HOST=${HOST}
KEYCLOAK_PORT="8080"
KEYCLOAK_PROTOCOL="http" # или https
KEYCLOAK_FRONTEND_URL="${KEYCLOAK_PROTOCOL}://${KEYCLOAK_HOST}:${KEYCLOAK_PORT}/auth/"
KEYCLOAK_USER="admin"
KEYCLOAK_PASSWORD="admin"
KEYCLOAK_REALM="ecss"
KEYCLOAK_ADDRESS_BOOK_CLIENT_ID="some-token"
KEYCLOAK_WEB_CLIENT_ID="some-token"
KEYCLOAK_GROUP_NAME="urn:aup:groups:admins"
KEYCLOAK_CLIENT_SETTINGS_FILE_NAME="client.json"
KEYCLOAK_WEB_CLIENT_SETTINGS_FILE_NAME="web.json"
KEYCLOAK_CLIENT_AUTHZ_SETTINGS_FILE_NAME="authz.json"
KEYCLOAK_LOGLEVEL="INFO"
KEYCLOAK_MANAGEMENT_CLIENT_ID="some-id"
KEYCLOAK_MANAGE_USERS_MANAGEMENT_CLIENT_ROLE_ID="some-id"
KEYCLOAK_MANAGE_USERS_MANAGEMENT_CLIENT_ROLE_NAME="manage-users"
KEYCLOAK_AUTH_PATH="FALSE" # или TRUE. Определяет, нужно ли использовать /auth в URL
KEYCLOAK_TOKEN_INTROSPECT_MODE="local_jwks" # или remote_jwks
KEYCLOAK_IDP_AVAILABLE_METHOD="health_check" # или keep_alive
KEYCLOAK_HEALTH_CHECK_WORKER_PORT=9000
KEYCLOAK_JWKS_URI="${KEYCLOAK_PROTOCOL}://${KEYCLOAK_HOST}:${KEYCLOAK_PORT}/realms/${KEYCLOAK_REALM}/protocol/openid-connect/certs"


Для изменения любых параметров их нужно внести в файл .env.override и перезапустить сервис командой:

./ecss-address-book.sh up

В разделе «Настройка режима авторизации» приведены примеры настройки .env.override и описание разных режимов авторизации. 

# ============================
# НАСТРОЙКИ ИСТОЧНИКОВ ДАННЫХ
# ============================

# В каждую отдельную настройку добавляется поле source, которое равно хосту, с которого загружаются данные

# Настройки для КК и CSV отличаются, потому что там настройки для единичного экземпляра

# !!!!! Важная переменная source !!!!!
# Параметр source является критически важным идентификатором источника данных
# При синхронизации система ищет данные по связке source + external_id (для AD/LDAP external_id устанавливается автоматически)
# Если в БД есть записи с определенным source, но в загружаемых данных они отсутствуют - все существующие записи с этим source будут удалены и заменены новыми данными.

sources:
  csv:
    base_ou: "Имя компании"

  keycloak:
    # source: "example.com"
    base_ou: "Имя компании"

  active_directory:
    - # server: "example.com"
      # source: "example.com"
      port: 389
      ssl: false
      timeout: 10000
      # base_dn: "CN=Users,DC=example,DC=com"
      # user_dn: "ivan.ivanov@example.com"
      # password: "example_password"
      # base_ou: "Имя компании"

  ldap:
    - # server: "example.com"
      # source: "example.com"
      port: 389
      ssl: false
      timeout: 10000
      # base_dn: "dc=example,dc=com"
      # user_dn: "uid=example,ou=Users,dc=example,dc=com"
      # password: "password"
      # base_ou: "Имя компании"

  mysql:
    - # host: "example.com"
      port: 3306
      database: "ecss_address_book"
      username: "service_address_book"
      password: "service_address_book"
      base_ou: "Имя компании"
      # domain: "example.domain"
      # source: "mysql:domain:host"

  http_terminal:
    - # host: "example.com"
      port: 9999
      protocol: "http"
      username: "admin"
      password: "password"
      # domain: "example.domain"
      base_ou: "Имя компании"
      query_limit: 2000
      # source: "http_terminal:domain:host"

auto_update:
  ldap:
    enabled: false
    timeout: 86400000 # Обновление раз в день, время указывается в миллисекундах

  keycloak:
    enabled: false
    timeout: 86400000

# ============================
# КОНФИГУРАЦИЯ МАППИНГА
# ============================

# Конфигурация мапперов для трансформации данных из внешних источников в структуру контакта Address Book
#
# Доступные поля контакта: domain, external_id, birthday, common_name, first_name,
# last_name, middle_name, nickname, org, title, full_name, position, gender, avatar, addresses, emails, messengers,
# phones, additional_info
#
# Структура маппера:
#   <источник>:
#     <поле_контакта>: [<путь_к_данным_в_источнике>, <тип_данных>]
#     <поле_контакта>: [[<вложенный_путь>, <тип_данных>]]
#     additional_info:
#       <подполе>: [<путь_к_данным>, <тип_данных>]
#
# Поддерживаемые типы данных:
#   - string: строковые значения
#   - url: тип аватара; означает, что аватар хранится в виде пути
#   - jpeg: тип аватара; бинарные данные изображений
#   - email: адреса электронной почты
#   - phone: номера телефонов
#   - date: даты
#
# Особенности:
#   - Поле 'kind' автоматически устанавливается сервисом ('contact' или 'group')
#   - Поле 'additional_info' поддерживает только одноуровневую вложенность
#   - Вложенные структуры в 'additional_info' отбрасываются с записью в лог
#   - Для полей emails, phones, avatar поддерживается множественное отображение

mappers:
  csv:
    external_id: ["external_id", "string"]
    full_name: ["full_name", "string"]
    first_name: ["first_name", "string"]
    middle_name: ["middle_name", "string"]
    last_name: ["last_name", "string"]
    org: ["org", "string"]
    title: ["title", "string"]
    avatar: ["avatar_path", "url"]
    source: ["source", "string"]
    emails: ["emails", ["email", "work"]]
    phones: ["phone_numbers", ["phone", "work"]]

  http_terminal:
    external_id: ["id", "string"]
    domain: ["domain", "string"]
    additional_info:
      login: ["login", "string"]
      password: ["password", "string"]
    emails: [["iface", ["email", "work"]]]

  kk:
    first_name: ["firstName", "string"]
    last_name: ["lastName", "string"]
    middle_name: [["attributes", "middleName"], "string"]
    emails: ["email", ["email", "work"]]
    full_name: [["attributes", "fullName"], "string"]
    external_id: ["id", "string"]
    ldap_dn: [["attributes", "LDAP_ENTRY_DN"], "ldap_dn"]
    title: [["attributes", "title"], "string"]
    avatar: [["attributes", "avatarURL"], "url"]
    additional_info:
      example: [["attributes", "example"], "string"]
    phones:
      [
        [["attributes", "phoneNumber"], ["phone", "work"]]
      ]

  mysql:
    avatar: ["avatar_path", "url"]
    emails: ["email", ["email", "work"]]
    external_id: ["external_id", "string"]
    first_name: ["first_name", "string"]
    full_name: ["full_name", "string"]
    last_name: ["last_name", "string"]
    middle_name: ["middle_name", "string"]
    org: ["org", "string"]
    phones: ["phone_numbers", ["phone", "work"]]
    title: ["title", "string"]
    domain: ["domain", "string"]
    additional_info:
      group: ["contact_group", "string"]

  ldap:
    common_name: ["ou", "string"]
    full_name: ["cn", "string"]
    first_name: ["givenName", "string"]
    middle_name: ["patronymic", "string"]
    last_name: ["sn", "string"]
    birthday: ["BirthDate", ["date", "{0D}.{0M}.{YYYY}"]]
    title: ["title", "string"]
    org: ["o", "string"]
    nickname: ["NickName", "string"]
    emails:
      [
        [["mailExt"], "email"],
        [["mail"], "email"]
      ]
    phones:
      [
        [["telephoneNumber"], ["phone", "work"]],
        [["TelephoneNumberExt"], ["phone", "work"]],
        [["homePhone"], ["phone", "home"]],
      ]
    avatar: [["jpegPhoto", "jpeg"], ["avatarURL", "url"]]

  ad:
    common_name: ["name", "string"]
    full_name: ["cn", "string"]
    first_name: ["givenName", "string"]
    last_name: ["sn", "string"]
    middle_name: ["initials", "string"]
    org: ["company", "string"]
    emails: ["mail", "email"]
    phones:
      [
        [["telephoneNumber"], ["phone", "work"]],
        [["othertelephoneNumber"], ["phone", "work"]],
        [["ipPhone"], ["phone", "work"]],
        [["homePhone"], ["phone", "home"]],
        [["mobile"], ["phone", "cell"]],
        [["otherMobile"], ["phone", "cell"]],
      ]
    avatar: [["jpegPhoto", "jpeg"], ["thumbnailPhoto", "url"]]

# ============================
# КЛАССИФИКАЦИЯ ОБЪЕКТОВ
# ============================

kinds:
  ad:
    contact: ["person"]
    group: ["group", "container", "organizationalUnit", "domain"]

  ldap:
    contact: [["object_name"], "started_at", "uid"]
    service_by_class: [["attributes", "objectClass"], "contain", "device"]
    samba: [["object_name"], "started_at", "sam"]
    eltex: [["object_name"], "started_at", "dc="]
    service: [["object_name"], "started_at", "cn="]
    group_by_class: [["attributes", "objectClass"], "contain", "groupOfNames"]
    group: [["object_name"], "started_at", "ou="]

# ============================
# ОБЩИЕ НАСТРОЙКИ
# ============================

additional_import_settings:
  common:
    include_incompletely_filled_contacts: false # | true

    # Настройка для MongoDB, необходимая для индексации полей для корректной работы полнотекстового поиска
    fields_to_index: [
      "first_name",
      "middle_name",
      "last_name",
      "common_name",
      "org",
      "source"
    ]

    full_name_parsing:
      enabled: false
      pattern: "LFM" # L - last_name, M - middle_name, F - first_name
      fallback_enabled: true # если не удалось распарсить - класть всё в fallback_field
      fallback_field: "middle_name" # middle_name | first_name | last_name; по умолчанию middle_name

  csv:
    ignore_data: ["\\N", ""]

  ldap:
    ignore_data: [""]
    object_name: ["object", "string"]

  ad:
    ignore_data: [""]
    object_name: ["object", "string"]

  mysql:
    ignore_data: [""]
    select_group: false

  kk:
    ignore_data: [""]

  http_terminal:
    ignore_data: [""]


Для изменения любых параметров их нужно внести в файл settings.override.yaml и сохранить. При этом перезапускать сервис необязательно.

  • Нет меток