Guia de Instalação Saas

Procedimento de Instalação

1. Instalação do Docker

Siga os passos de instalação do Docker. Por exemplo, para sistema operacional Linux CentOS, o procedimento de instalação se encontra aqui.

2. Instalação do Docker Compose

Siga os passos de instalação do Docker compose.

Aviso

Para obter as imagens docker é necessario ter acesso à rede corporativa do CPqD e ao repositório cpqd-docker-dev. O download das imagens será feito nos passos adiante.

3. Criação da estrutura de diretórios

Nota

Esse procedimento assume que serão utilizado o disco /l/disk0 para a persistência do MongoDB e InfluxDB.

  • Organização de pastas proposta.

    l
    └──disk0
       ├──credentials
       │  ├──aws-credentials
       │  ├──config.json
       │  └──start.sh
       ├──influxdb
       ├──mongodb
       └──trd
          ├──docker-compose.controller.saas.yml
          └──init_controller_saas.sh
    
  • Crie a pasta de persistência para o MongoDB em /l/disk0/mongodb.

    $ mkdir -p /l/disk0/mongodb && \
      chmod 775 -R /l/disk0/mongodb
    
  • Crie a pasta de persistência para o InfluxDB em /l/disk0/influxdb.

    $ mkdir -p /l/disk0/influxdb && \
      chmod 775 -R /l/disk0/influxdb
    
  • Crie a pasta a credentials onde deveram estar as credenciais da aws /l/disk0/credentials.

    $ mkdir -p /l/disk0/credentials && \
      chmod 775 -R /l/disk0/credentials
    
  • Crie a pasta a trd onde deveram estar o script de inicialização e o docker-compose do projeto /l/disk0/credentials.

    $ mkdir -p /l/disk0/trd && \
      chmod 775 -R /l/disk0/trd
    

4. Organização e configuração das credenciais do Nó de Processamento

Dentro da pasta credenciais deveram estar os seguintes arquivos:

  • aws-credentials arquivo que contem as chaves de acesso para a aws.
[default]
region = us-east-1
aws_access_key_id=
aws_secret_access_key=
  • config.json arquivo que contem as imagens disponíveis e as suas configurações.
{
    "IamFleetRole": "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role",
    "AllocationStrategy": "lowestPrice",
    "TargetCapacity": 2,
    "TerminateInstancesWithExpiration": true,
    "LaunchSpecifications": [
      {
        "ImageId": "ami-0123456789EXAMPLE",
        "InstanceType": "r5dn.4xlarge",
        "SubnetId": "subnet-example",
        "KeyName": "aws-gtic",
        "EbsOptimized": true,
        "WeightedCapacity": 1,
        "SecurityGroups": [
        ],
        "TagSpecifications": [
          {
            "ResourceType": "instance",
            "Tags": [
            ]
          }
        ]
      }
    ],
    "Type": "maintain",
    "TagSpecifications": [
      {
        "ResourceType": "spot-fleet-request",
        "Tags": [
        ]
      }
    ]
  }
  • start.sh script de inicialização do nó de processamento, ele deverá ser criado seguindo o exemplo abaixo.

    • TRD_LOG: Diretório de logs (/var/log/cpqd).
    • LICENSE_HOST: Endereço do servidor de licença (license38.cpqd.com.br).
    • ASR_LICENSE_ID: ID da licença do Reconhecimento de fala, fornecido pelo CPqD.
    • ASR_LICENSE_CHANNELS: Número de canais do Reconhecimento de fala.
    • DIARIZATION_LICENSE_ID: ID da licença do Diarizador, fornecido pelo CPqD.
    • ND_CONTROL_HOST: Endereço do nó de controle.
    • SL_TAG: Tag de identificação da instancia utilizada pelo sistema de licença.
    • INFLUXDB_PASSWORD: Senha utilizada pela a aplicação para o usuário padrão.
    • INFLUXDB_ADMIN_PASSWORD: Senha utilizada pela a aplicação para administrador do InfluxDB.

Aviso

Os campos de licença e senha devem ser preenchido com os mesmo valores utilizadas no Nó de Controle.

#!/bin/bash

# Remove older containers
docker rm -vf $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
docker system prune -f
docker volume prune -f

cd /opt/
wget --user dummyuser --password dummypassword https://speechweb.cpqd.com.br/trd_dist/processor/latest/docker-compose.processor.yml

mkdir -p /var/log/cpqd/asr
chmod -R 777 /var/log/cpqd


# Parâmetros que tipicamente serão alterados
ND_CONTROL_HOST=awsdsda000.cpqd.com.br                  # Hostname do nó de controle
export TRD_LOG=/var/log/cpqd
export TRD_VERSION=latest

### Parâmetros de licença
export LICENSE_HOST=sl.cpqd.com.br                      # Trocar em caso de licenciamento local
export ASR_LICENSE_ID=dummyasrid                        # ID da licença do ASR
export ASR_LICENSE_CHANNELS=0                           # Número de canais desejados no ASR
export DIARIZATION_LICENSE_ID=dummydiarizationid        # ID da licença do Diarizador
export SL_TAG=""                                        # Descrição da máquina
export SL_HOSTNAME=$(hostname)

# Parâmetros que só serão alterados caso haja alguma mudança no setup padrão
export PROFILE="prod"
export MONGODB=mongodb://${ND_CONTROL_HOST}:27017
export RABBIT_HOST=${ND_CONTROL_HOST}
export RABBIT_PORT=5672
export TIMEZONE="America/Sao_Paulo"
export ASR_SERVER_URL=ws://asr-server:8025/asr-server/asr
export ASR_WORD_HINTS=""
export ASR_REMOVE_UNK=false

### InfluxDB ###
export INFLUX_DATABASE="metrics"
export INFLUXDB_USER="trd"
export INFLUXDB_PASSWORD="dummypassword"
export INFLUXDB_ADMIN_USER="admin"
export INFLUXDB_ADMIN_PASSWORD="dummypassword"
export INFLUX_INIT='{"host":"'${ND_CONTROL_HOST}'", "port": 8086, "db":"'${INFLUX_DATABASE}'", "active": "true"}'

docker-compose -f docker-compose.processor.yml up -d

5. Organização e configuração do Nó de Controle

  • Crie o script de inicialização do Nó de Controle init_node_controller.sh (/l/disk0/trd) e configure nele as variáveis de ambiente:

    • TRD_MONGODB: Diretório para persistência do MongoDB (/l/disk0/mongodb).
    • TRD_INFLUXDB: Diretório para persistência do InfluxDB (/l/disk0/influxdb).
    • TRD_CREDENTIALS: Diretório com os arquivos de configuração da aws (/l/disk0/credentials).
    • DIARIZATION_LICENSE_ID: ID da licença do Diarizador, fornecido pelo CPqD.
    • SL_TAG: Tag de identificação da instancia utilizada pelo sistema de licença.
    • INFLUXDB_PASSWORD: Senha utilizada na a criação do usuário padrão do InfluxDB.
    • INFLUXDB_ADMIN_PASSWORD: Senha utilizada na a criação do administrador do InfluxDB.

    Aviso

    Os campos de licença e senha devem ser preenchido com os mesmo valores que utilizadas no Nó de Processamento.

    #!/bin/bash
    
    ### Versão ###
    export TRD_VERSION=latest
    
    ### Parâmetros dos volumes mapeados no host ###
    export TRD_MONGODB=/l/disk0/mongodb
    export TRD_INFLUXDB=/l/disk0/influxdb
    export TRD_LOG=/var/log/cpqd/trd/
    
    ### Volume com arquivos para inicialização do nó de processamento ###
    export TRD_CREDENTIALS=/l/disk0/credentials
    
    ### Parâmetros de licença ###
    export LICENSE_HOST=sl.cpqd.com.br
    export DIARIZATION_LICENSE_ID=dummydiarizationid
    export SL_TAG="" #Descrição da máquina
    export SL_HOSTNAME=$(hostname)
    
    ### Parâmetros que só serão alterados caso haja alguma mudança no setup padrão ###
    export PROFILE="prod"
    export MONGODB=mongodb://mongo:27017
    export RABBIT_HOST=rabbitmq
    export RABBIT_PORT=5672
    export RABBIT_MANAGEMENT_PORT=15672
    export RABBIT_USER=guest
    export RABBIT_PWD=guest
    export TIMEZONE="America/Sao_Paulo"
    export VALID_EXTENSION_FORMATS='[".wav", ".mp3", ".flac", ".wma", ".mp4", ".avi", ".flv", ".mkv", ".mov", ".mpg", ".wmv"]'
    export MAX_AUDIO_DURATION_SECS=126000   #35h
    export MAX_AUDIO_SIZE_BYTES=2147483648  #2Gbyte
    export MONGODB_CACHE_GB="0.1"
    export EMPTY_QUEUE_TIMEOUT=43200
    export JOB_TTL_IN_MINUTES=7200 # 5 dias
    export ASR_LM_URI=builtin:slm/callcenter-small
    export CLUSTER_TH=-.4
    export BACKEND_CORS_ORIGINS='["http://localhost", "http://localhost:8000", "https://localhost", "https://localhost:8000"]'
    export EMPTY_QUEUE_INTERVAL=60  # 60 seconds
    
    ### Parâmetros usados com aws ###
    AWS_REGION=''
    SPOT_TARGET_CAPACITY=1  # Quantidade de instancias (spots)
    
    ### Parâmetros usados com gcp ###
    GCP_ZONE=''
    GCP_PROJECT_ID=''
    
    ### Parâmetros usados com aws ou gcp ###
    #NODES='"node001", "node002"' # Nomes dos nós de processamento, descomente para habilitar
    export NODES_CONFIG='{"nodes": ['${NODES}'], "timeout": {"start": 30, "stop": 300}}'
    
    ### AWS Cloud ###
    export AWS_CONFIG='{"region": "'${AWS_REGION}'"}'
    export AWS_SPOT_FLEET_CONFIG='{"spot_fleet_conf_file": "/home/credentials/config.json", "spot_user_data_file": "/home/credentials/start.sh", "target_capacity": "'${SPOT_TARGET_CAPACITY}'"}'
    
    ### Google Cloud ###
    export GCP_CONFIG='{"project": "'${GCP_PROJECT_ID}'", "zone": "'${GCP_ZONE}'"}'
    
    ### Webhook ###
    export ALLOW_HTTP_WEBHOOKS=false  # Desabilita webhooks HTTP puro
    
    ### InfluxDB ###
    export INFLUX_DATABASE="metrics"
    export INFLUXDB_USER="trd"
    export INFLUXDB_PASSWORD="dummypassword"
    export INFLUXDB_ADMIN_USER="admin"
    export INFLUXDB_ADMIN_PASSWORD="dummypassword"
    export INFLUX_INIT='{"host":"metrics", "port": 8086, "db":"'${INFLUX_DATABASE}'", "active": "true"}'
    
    docker-compose -f docker-compose.controller.saas.yml up -d
    
  • Crie o docker-compose docker-compose.controller.saas.yml (/l/disk0/trd) a seguir:

    # Docker compose file for Production environment: Controller Node
    version: '3'
    
    services:
      mongo:
        image: mongo:4.2
        restart: always
        environment:
          TZ: ${TIMEZONE}
        ports:
          - "27017:27017"
        volumes:
          - $TRD_MONGODB:/data/db
        command: --wiredTigerCacheSizeGB ${MONGODB_CACHE_GB}
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
    
      rabbitmq:
        image: artifactory.cpqd.com.br:8443/docker-dev/cpqd/trd/rabbitmq:${TRD_VERSION:-latest}
        restart: always
        environment:
          TZ: ${TIMEZONE}
        ports:
          - "5672:5672"
          - "8072:15672"
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
    
      metrics:
        image: influxdb:1.8.3
        restart: always
        environment:
          INFLUXDB_DB: ${INFLUX_DATABASE}
          INFLUXDB_HTTP_AUTH_ENABLED: "true"
          INFLUXDB_USER: ${INFLUXDB_USER}
          INFLUXDB_USER_PASSWORD: ${INFLUXDB_PASSWORD}
          INFLUXDB_ADMIN_USER: ${INFLUXDB_ADMIN_USER}
          INFLUXDB_ADMIN_PASSWORD: ${INFLUXDB_ADMIN_PASSWORD}
        ports:
          - "8086:8086"  
        volumes:
          - $TRD_INFLUXDB:/var/lib/influxdb
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
    
      node-manager:
        image: artifactory.cpqd.com.br:8443/docker-dev/cpqd/trd/node-manager:${TRD_VERSION:-latest}
        restart: always
        environment:
          INFLUX_INIT: ${INFLUX_INIT}
          INFLUXDB_USER: ${INFLUXDB_USER}
          INFLUXDB_USER_PASSWORD: ${INFLUXDB_PASSWORD}
          SL_HOSTNAME: ${SL_HOSTNAME}
          PROFILE: ${PROFILE}
          MONGODB: ${MONGODB}
          RABBIT_HOST: ${RABBIT_HOST}
          RABBIT_PORT: ${RABBIT_PORT}
          RABBIT_MANAGEMENT_PORT: ${RABBIT_MANAGEMENT_PORT}
          RABBIT_USER: ${RABBIT_USER}
          RABBIT_PWD: ${RABBIT_PWD}
          TZ: ${TIMEZONE}
          DIARIZATION_LICENSE_ID: ${DIARIZATION_LICENSE_ID}
          NODES_CONFIG: ${NODES_CONFIG}
          AWS_CONFIG: ${AWS_CONFIG}
          AWS_SPOT_FLEET_CONFIG: ${AWS_SPOT_FLEET_CONFIG}
          GCP_CONFIG: ${GCP_CONFIG}
          GOOGLE_APPLICATION_CREDENTIALS: /home/credentials/gcp-credentials.json
          AWS_SHARED_CREDENTIALS_FILE: /home/credentials/aws-credentials
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
        volumes:
          - $TRD_CREDENTIALS:/home/credentials
    
      transcription-api:
        image: artifactory.cpqd.com.br:8443/docker-dev/cpqd/trd/transcription-api:${TRD_VERSION:-latest}
        restart: always
        environment:
          INFLUX_INIT: ${INFLUX_INIT}
          INFLUXDB_USER: ${INFLUXDB_USER}
          INFLUXDB_USER_PASSWORD: ${INFLUXDB_PASSWORD}
          INFLUX_DATABASE: ${INFLUX_DATABASE}
          PROFILE: ${PROFILE}
          MONGODB: ${MONGODB}
          RABBIT_HOST: ${RABBIT_HOST}
          RABBIT_PORT: ${RABBIT_PORT}
          VALID_EXTENSION_FORMATS: ${VALID_EXTENSION_FORMATS}
          MAX_AUDIO_DURATION_SECS: ${MAX_AUDIO_DURATION_SECS}
          MAX_AUDIO_SIZE_BYTES: ${MAX_AUDIO_SIZE_BYTES}
          TZ: ${TIMEZONE}
          ALLOW_HTTP_WEBHOOKS: ${ALLOW_HTTP_WEBHOOKS}
          DIARIZATION_LICENSE_ID: ${DIARIZATION_LICENSE_ID}
          ASR_LM_URI: ${ASR_LM_URI}
          CLUSTER_TH: ${CLUSTER_TH}
          DIAR_CHUNK_MAX_SIL: 1200.0
          DIAR_CHUNK_MAX_LEN: 3600.0
          BACKEND_CORS_ORIGINS: ${BACKEND_CORS_ORIGINS}
          PORT: "8000"
        ports:
          - "8000:8000"
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
    
      transcription-pipeline:
        image: artifactory.cpqd.com.br:8443/docker-dev/cpqd/trd/transcription-pipeline:${TRD_VERSION:-latest}
        restart: always
        environment:
          INFLUX_INIT: ${INFLUX_INIT}
          INFLUXDB_USER: ${INFLUXDB_USER}
          INFLUXDB_USER_PASSWORD: ${INFLUXDB_PASSWORD}
          PROFILE: ${PROFILE}
          MONGODB: ${MONGODB}
          RABBIT_HOST: ${RABBIT_HOST}
          RABBIT_PORT: ${RABBIT_PORT}
          RABBIT_MANAGEMENT_PORT: ${RABBIT_MANAGEMENT_PORT}
          RABBIT_USER: ${RABBIT_USER}
          RABBIT_PWD: ${RABBIT_PWD}
          TZ: ${TIMEZONE}
          DIARIZATION_LICENSE_HOST: "https://${LICENSE_HOST}"
          DIARIZATION_LICENSE_ID: ${DIARIZATION_LICENSE_ID}
          SL_HOSTNAME: ${SL_HOSTNAME}
          SL_TAG: ${SL_TAG}
          ALLOW_HTTP_WEBHOOKS: ${ALLOW_HTTP_WEBHOOKS}
          EMPTY_QUEUE_TIMEOUT: ${EMPTY_QUEUE_TIMEOUT}
          EMPTY_QUEUE_INTERVAL: ${EMPTY_QUEUE_INTERVAL}
          JOB_TTL_IN_MINUTES: ${JOB_TTL_IN_MINUTES}
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
        volumes:
          - cache:/var/tmp
    
      normalization-executor:
        image: artifactory.cpqd.com.br:8443/docker-dev/cpqd/trd/normalization-executor:${TRD_VERSION:-latest}
        restart: always
        environment:
          INFLUX_INIT: ${INFLUX_INIT}
          INFLUXDB_USER: ${INFLUXDB_USER}
          INFLUXDB_USER_PASSWORD: ${INFLUXDB_PASSWORD}
          SL_HOSTNAME: ${SL_HOSTNAME}
          PROFILE: ${PROFILE}
          MONGODB: ${MONGODB}
          RABBIT_HOST: ${RABBIT_HOST}
          RABBIT_PORT: ${RABBIT_PORT}
          TZ: ${TIMEZONE}
          DIARIZATION_LICENSE_ID: ${DIARIZATION_LICENSE_ID}
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "5"
        volumes:
          - $TRD_LOG:/var/log/cpqd/trd/
    
    networks:
      default:
        driver: bridge
    
    volumes:
      cache:
    

Iniciando e parando os serviços

Para iniciar os serviços do Nó de Controle:

$ ./init_controller_saas.sh

Para parar os serviços do Nó de Controle:

$ docker-compose -f docker-compose.controller.saas.yml down

Nota

Antes de parar os serviços do Nó de Controle, verifique se todas as instancias de processamento já foram desligada, esse processo ocorre de forma automática com o fim da demanda de processamento.

Visualizando os logs

Os logs são armazenados pelo docker, normalmente em: /var/lib/docker/containers/<container id>/<container id>-json.log

Para visualizar os logs dos containers Docker, utilize os comandos abaixo.

Na máquina do Nó de Controle:

$ docker-compose -f docker-compose.controller.saas.yml logs -f --tail 50