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 -dCrie 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