Ir para o conteúdo principal

Conhecendo e Disponibilizando a ferramenta FormsFlow.ai

Data: 19/05/23

Autores:
1. João Batista da Silva Junior (Assessor)
2. Michel Farias Ferreira (Assessor)

_________________________________________________________________________________________________________________________________________

1. OBJETIVO

             O objetivo do FormsFlow.ai é fornecer uma solução completa para gerenciamento de fluxo de trabalho. Isso é alcançado por meio de um sistema que permite a automação de processos de negócios, melhorando a eficiência e produtividade da organização. O FormsFlow.ai é capaz de fornecer uma solução escalável, personalizada e fácil de usar para gerenciamento de fluxo de trabalho. O objetivo deste estudo é fornecer uma visão geral do FormsFlow.ai, incluindo sua instalação e configuração no ambiente local da SETIC

2. INTRODUÇÃO

            Nos últimos anos, tem havido um aumento significativo na adoção de soluções de gerenciamento de fluxo de trabalho para melhorar a eficiência das organizações. O FormsFlow.ai é um exemplo de um sistema que permite o gerenciamento de fluxo de trabalho em diferentes setores. 

3. DESENVOLVIMENTO

           O FormsFlow.ai é um sistema que pode ser instalado localmente em um ambiente Docker. Isso permite às organizações personalizar a instalação de acordo com suas necessidades específicas. O processo de instalação pode ser realizado seguindo as instruções detalhadas no guia de instalação do FormsFlow.ai. Uma vez instalado, o sistema pode ser configurado para atender às necessidades da organização.

A configuração do FormsFlow.ai é feita por meio de um painel de administração, que é acessado por meio de um navegador da web. A partir deste painel, é possível configurar as opções de autenticação, adicionar usuários e definir permissões. Também é possível criar e gerenciar fluxos de trabalho personalizados e definir as etapas específicas do fluxo de trabalho.

Uma das principais características do FormsFlow.ai é a sua capacidade de disponibilizar uma rota de acesso para os usuários. Isso significa que os usuários podem enviar solicitações de fluxo de trabalho diretamente pelo sistema, sem a necessidade de enviar e-mails ou preencher formulários em papel. A rota de acesso permite que os usuários enviem solicitações, verifiquem o status de suas solicitações e recebam notificações por e-mail quando uma etapa do fluxo de trabalho é concluída.

3.1 INSTALAÇÃO LOCAL (OCP)

             O OpenShift é uma plataforma de contêineres baseada em Kubernetes, que permite hospedar e gerenciar aplicativos em contêineres de forma escalável e automatizada.

Para subir um serviço no FormsFlow, você precisará seguir alguns passos básicos. Primeiro, certifique-se de que seu projeto FormsFlow esteja configurado corretamente em seu ambiente OpenShift.

Em seguida, você precisará criar um arquivo YAML que descreva seu serviço e seus requisitos. O arquivo YAML especifica o nome do serviço, o tipo de serviço (ClusterIP, NodePort, LoadBalancer), a porta a ser usada para acessar o serviço e outros detalhes.

Depois de criar o arquivo YAML, você pode usar o comando "oc apply" para implantar o serviço no OpenShift. O comando irá criar um objeto de serviço e implantá-lo no cluster.


3.1.1 IMPEDIMENTOS

         Caso apareça a mensagem de falta de permissão em volume volumes:

- ./postgres/camunda:/var/lib/postgresql/data 777 , como faço sendo que ao iniciar o serviço está dando crash e não tenho acesso ao terminal?

  • A mensagem de erro indica que o processo que executa o contêiner não tem permissão para acessar o volume que você definiu em seu arquivo YAML. A solução para esse problema pode depender das permissões definidas em seu ambiente e das políticas de segurança que estão em vigor.


Se você não tem acesso ao terminal do contêiner, você pode tentar algumas ações para solucionar o problema:

Verifique se o usuário ou processo que executa o contêiner tem permissões suficientes para acessar o volume definido. Em alguns casos, pode ser necessário adicionar permissões adicionais para o usuário ou processo que executa o contêiner.

Verifique se o volume foi criado corretamente e se as permissões de acesso do volume estão corretas. Certifique-se de que o volume esteja montado corretamente em seu contêiner e que o caminho para o volume esteja correto.

Tente usar o comando "oc logs" para visualizar os logs do contêiner e ver se há alguma informação adicional sobre o erro. Isso pode ajudar a identificar qual é o problema e como resolvê-lo.

Se tudo mais falhar, você pode tentar alterar as permissões do volume diretamente em seu ambiente OpenShift ou em seu sistema de arquivos. Certifique-se de que essas alterações não afetem a segurança de seu ambiente e que as permissões estejam definidas corretamente.

Lembre-se de que, se você não tem experiência em solucionar problemas em ambientes OpenShift, pode ser útil solicitar ajuda de alguém com mais experiência ou consultar a documentação oficial e fóruns de suporte para obter assistência adicional.

Consigo passar alguma variavél para dar essa permissão? Qual?

Sim, você pode usar a variável de ambiente PGDATA para especificar o diretório de dados do PostgreSQL e, em seguida, definir as permissões corretas para esse diretório.

Para fazer isso, você pode adicionar uma seção env ao seu arquivo YAML do contêiner, como o exemplo abaixo:


yaml

containers:

- name: postgres

  image: postgres:latest

  env:

  - name: PGDATA

    value: /var/lib/postgresql/data

  command: ["postgres"]

  args: ["-c", "config_file=/etc/postgresql/postgresql.conf"]

  volumeMounts:

  - name: postgres-data

    mountPath: /var/lib/postgresql/data

  ports:

  - containerPort: 5432


Em seguida, você pode definir as permissões corretas para o diretório /var/lib/postgresql/data usando o comando chmod. Por exemplo:

chmod 777 /var/lib/postgresql/data

Certifique-se de que as permissões que você definir sejam seguras e adequadas para o ambiente em que o contêiner está sendo executado.

como posso passar isso "chmod 777 /var/lib/postgresql/data" no yaml para dar a permissão logo no início, ao subir o container?


  • Você pode usar a seção initContainers em seu arquivo YAML para executar um contêiner de inicialização que define as permissões do diretório /var/lib/postgresql/data antes que o contêiner principal do PostgreSQL seja iniciado.


Para fazer isso, adicione a seção initContainers ao arquivo YAML e especifique um contêiner de inicialização com o comando chmod para definir as permissões corretas no diretório de dados do PostgreSQL, como no exemplo abaixo:


yaml

apiVersion: v1

kind: Pod

metadata:

  name: postgres

spec:

  initContainers:

  - name: init-permissions

    image: busybox

    command: ["sh", "-c", "chmod 777 /var/lib/postgresql/data"]

    volumeMounts:

    - name: postgres-data

      mountPath: /var/lib/postgresql/data

  containers:

  - name: postgres

    image: postgres:latest

    command: ["postgres"]

    args: ["-c", "config_file=/etc/postgresql/postgresql.conf"]

    volumeMounts:

    - name: postgres-data

      mountPath: /var/lib/postgresql/data

    ports:

    - containerPort: 5432

  volumes:

  - name: postgres-data

    persistentVolumeClaim:

      claimName: postgres-pvc



Observe que, neste exemplo, estou usando um contêiner de inicialização baseado na imagem busybox, que inclui o comando chmod. Isso é apenas um exemplo; você pode usar outra imagem de contêiner que tenha o comando chmod instalado.


Certifique-se de que as permissões que você definir sejam seguras e adequadas para o ambiente em que o contêiner está sendo executado.


3.2 DOCKER-COMPOSE

          Segue abaixo o exemplo de compose com os serviços disponiveis para o formsflow.ai que você pode utilizar para disponibilizar o sistema no Openshift de forma manual:


version: '3.7'


services:

  keycloak-db:

    image: postgres:14

    volumes:

      - ./postgres/keycloak:/var/lib/postgresql/data 777

    environment:

      POSTGRES_DB: ${KEYCLOAK_JDBC_DB:-keycloak}

      POSTGRES_USER: ${KEYCLOAK_JDBC_USER:-admin}

      POSTGRES_PASSWORD: ${KEYCLOAK_JDBC_PASSWORD:-changeme}

      PGDATA: /var/lib/postgresql/data

    networks:

      - formsflow


  keycloak:

    image: quay.io/keycloak/keycloak:14.0.0

    volumes:

      - ./configuration/imports:/opt/jboss/keycloak/imports

    command:

      - "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/formsflow-ai-realm.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING"

    environment:

      - DB_VENDOR=POSTGRES

      - DB_ADDR=keycloak-db

      - DB_PORT=5432

      - DB_DATABASE=${KEYCLOAK_JDBC_DB:-keycloak}

      - DB_USER=${KEYCLOAK_JDBC_USER-admin}

      - DB_PASSWORD=${KEYCLOAK_JDBC_PASSWORD:-changeme}

      - KEYCLOAK_USER=${KEYCLOAK_ADMIN_USER:-admin}

      - KEYCLOAK_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD:-changeme}

    ports:

      - "8080:8080"

    links:

      - keycloak-db

    networks:

      - formsflow


  forms-flow-forms-db:

    image: mongo:5.0

    restart: always

    environment:

      MONGO_INITDB_ROOT_USERNAME: ${FORMIO_DB_USERNAME:-admin}

      MONGO_INITDB_ROOT_PASSWORD: ${FORMIO_DB_PASSWORD:-changeme}

      MONGO_INITDB_DATABASE: ${FORMIO_DB_NAME:-formio}

    volumes:

      - ./../../formsflow-forms/mongo_entrypoint/001_user.js:/docker-entrypoint-initdb.d/001_user.js:ro

      - ./mongodb/data/db/:/data/db/

      - ./mongodb/data/log/:/var/log/mongodb/

      - ./mongodb/mongod.conf:/etc/mongod.conf

    ports:

      - "27018:27017"

    networks:

      - formsflow


  forms-flow-web:

    image: formsflow/forms-flow-web:v5.1.0

    volumes:

      - ./configuration/config.js:/usr/share/nginx/html/config/config.js

    links:

      - forms-flow-webapi

    ports:

      - "3000:8080"

    networks:

      - formsflow


  forms-flow-forms:

    image: formsflow/forms-flow-forms:v5.1.0

    restart: always

    environment:

      DEBUG: formio:*

      NODE_CONFIG: "{\"mongo\":\"mongodb://${FORMIO_DB_USERNAME:-admin}:${FORMIO_DB_PASSWORD:-changeme}@forms-flow-forms-db:27017/${FORMIO_DB_NAME:-formio}?authMechanism=SCRAM-SHA-1&authSource=admin\"}"

      ROOT_EMAIL: ${FORMIO_ROOT_EMAIL:-admin@example.com}

      ROOT_PASSWORD: ${FORMIO_ROOT_PASSWORD:-changeme}

      FORMIO_DOMAIN: ${FORMIO_DEFAULT_PROJECT_URL}

      FORMIO_CLIENT_UI: ${FORMIO_CLIENT_UI:-false}

      FORMIO_JWT_SECRET: ${FORMIO_JWT_SECRET}

    ports:

      - "3001:3001"

    links:

      - forms-flow-forms-db

    networks:

      - formsflow


  forms-flow-bpm-db:

    image: postgres:14

    environment:

      POSTGRES_USER: ${CAMUNDA_JDBC_USER:-admin}

      POSTGRES_PASSWORD: ${CAMUNDA_JDBC_PASSWORD:-changeme}

      POSTGRES_DB: ${CAMUNDA_JDBC_DB_NAME:-formsflow-bpm}

    volumes:

      - ./postgres/camunda:/var/lib/postgresql/data 777

    ports:

      - "5432:5432"

    networks:

      - formsflow


  forms-flow-bpm:

    image: formsflow/forms-flow-bpm:v5.1.0

    restart: always

    environment:

      - KEYCLOAK_URL=${KEYCLOAK_URL}

      - KEYCLOAK_URL_REALM=${KEYCLOAK_URL_REALM:-forms-flow-ai}

      - KEYCLOAK_CLIENTID=${KEYCLOAK_BPM_CLIENT_ID:-forms-flow-bpm}

      - KEYCLOAK_CLIENTSECRET=${KEYCLOAK_BPM_CLIENT_SECRET:-e4bdbd25-1467-4f7f-b993-bc4b1944c943}

      - CAMUNDA_JDBC_URL=${CAMUNDA_JDBC_URL:-jdbc:postgresql://forms-flow-bpm-db:5432/formsflow-bpm}

      - CAMUNDA_JDBC_USER=${CAMUNDA_JDBC_USER:-admin}

      - CAMUNDA_JDBC_PASSWORD=${CAMUNDA_JDBC_PASSWORD:-changeme}

      - CAMUNDA_JDBC_DRIVER=${CAMUNDA_JDBC_DRIVER:-org.postgresql.Driver}

      - CAMUNDA_APP_ROOT_LOG_FLAG=${CAMUNDA_APP_ROOT_LOG_FLAG:-error}

      - FORMSFLOW_API_URL=${FORMSFLOW_API_URL}

      - FORMIO_URL=${FORMIO_DEFAULT_PROJECT_URL}

      - FORMIO_ROOT_EMAIL=${FORMIO_ROOT_EMAIL:-admin@example.com}

      - FORMIO_ROOT_PASSWORD=${FORMIO_ROOT_PASSWORD:-changeme}

      - APP_SECURITY_ORIGIN=${APP_SECURITY_ORIGIN:-*}

      - WEBSOCKET_SECURITY_ORIGIN=${WEBSOCKET_SECURITY_ORIGIN}

      - WEBSOCKET_MESSAGE_TYPE=${WEBSOCKET_MESSAGE_TYPE:-TASK_EVENT}

      - WEBSOCKET_ENCRYPT_KEY=${WEBSOCKET_ENCRYPT_KEY:-giert989jkwrgb@DR55}

      - DATA_BUFFER_SIZE=${DATA_BUFFER_SIZE:-2}

      - IDENTITY_PROVIDER_MAX_RESULT_SIZE=${IDENTITY_PROVIDER_MAX_RESULT_SIZE:-250}

      - DATA_ANALYSIS_URL=${DATA_ANALYSIS_URL}

      - CUSTOM_SUBMISSION_URL=${CUSTOM_SUBMISSION_URL}

      - CUSTOM_SUBMISSION_ENABLED=${CUSTOM_SUBMISSION_ENABLED:-false}

      - MULTI_TENANCY_ENABLED=${MULTI_TENANCY_ENABLED:-false}

      - FORMSFLOW_ADMIN_URL=${FORMSFLOW_ADMIN_URL:-}

      - REDIS_ENABLED=${REDIS_ENABLED:-false}

      - REDIS_HOST=${REDIS_HOST}

      - REDIS_PORT=${REDIS_PORT:-6379}

      - REDIS_PASSCODE=${REDIS_PASSCODE:-changeme}

      - SESSION_COOKIE_SECURE=${SESSION_COOKIE_SECURE:-true}

    ports:

      - "8000:8080"

    links:

      - forms-flow-bpm-db

      - keycloak

    networks:

      - formsflow


  forms-flow-webapi-db:

    image: postgres:14

    restart: always

    environment:

      POSTGRES_USER: ${FORMSFLOW_API_DB_USER:-postgres}

      POSTGRES_PASSWORD: ${FORMSFLOW_API_DB_PASSWORD:-changeme}

      POSTGRES_DB: ${FORMSFLOW_API_DB_NAME:-webapi}

    volumes:

      - ./postgres/webapi:/var/lib/postgresql/data 777

    ports:

      - "6432:5432"

    networks:

      - formsflow


  forms-flow-webapi:

    image: formsflow/forms-flow-webapi:v5.1.0

    restart: always

    links:

      - forms-flow-webapi-db

      - forms-flow-forms

    entrypoint: "/wait-for-service.sh forms-flow-webapi-db:5432 -s -- /wait-for-service.sh keycloak:8080 -s -- /wait-for-service.sh forms-flow-forms:3001 -s -- ./entrypoint.sh "

    volumes:

      - ./:/app:rw

    environment:

      INSIGHT_API_KEY: ${INSIGHT_API_KEY}

      INSIGHT_API_URL: ${INSIGHT_API_URL}

      DATABASE_URL: ${FORMSFLOW_API_DB_URL:-postgresql://postgres:changeme@forms-flow-webapi-db:5432/webapi}

      BPM_TOKEN_API: ${KEYCLOAK_URL}/auth/realms/${KEYCLOAK_URL_REALM:-forms-flow-ai}/protocol/openid-connect/token

      BPM_CLIENT_ID: ${KEYCLOAK_BPM_CLIENT_ID:-forms-flow-bpm}

      BPM_CLIENT_SECRET: ${KEYCLOAK_BPM_CLIENT_SECRET:-e4bdbd25-1467-4f7f-b993-bc4b1944c943}

      BPM_API_URL: ${BPM_API_URL}

      FORMSFLOW_API_CORS_ORIGINS: ${FORMSFLOW_API_CORS_ORIGINS:-*}

      JWT_OIDC_WELL_KNOWN_CONFIG: ${KEYCLOAK_URL}/auth/realms/${KEYCLOAK_URL_REALM:-forms-flow-ai}/.well-known/openid-configuration

      JWT_OIDC_ALGORITHMS: 'RS256'

      JWT_OIDC_JWKS_URI: ${KEYCLOAK_URL}/auth/realms/${KEYCLOAK_URL_REALM:-forms-flow-ai}/protocol/openid-connect/certs

      JWT_OIDC_ISSUER: ${KEYCLOAK_URL}/auth/realms/${KEYCLOAK_URL_REALM:-forms-flow-ai}

      JWT_OIDC_AUDIENCE: ${KEYCLOAK_WEB_CLIENT_ID:-forms-flow-web}

      JWT_OIDC_CACHING_ENABLED: 'True'

      JWT_OIDC_JWKS_CACHE_TIMEOUT: 300

      KEYCLOAK_URL: ${KEYCLOAK_URL}

      KEYCLOAK_URL_REALM: ${KEYCLOAK_URL_REALM:-forms-flow-ai}

      WEB_API_BASE_URL: ${FORMSFLOW_API_URL}

      FORMIO_URL: ${FORMIO_DEFAULT_PROJECT_URL}

      FORMIO_ROOT_EMAIL: ${FORMIO_ROOT_EMAIL:-admin@example.com}

      FORMIO_ROOT_PASSWORD: ${FORMIO_ROOT_PASSWORD:-changeme}

      CHROME_DRIVER_PATH: ${CHROME_DRIVER_PATH}

      CUSTOM_SUBMISSION_URL: ${CUSTOM_SUBMISSION_URL}

      CUSTOM_SUBMISSION_ENABLED: ${CUSTOM_SUBMISSION_ENABLED}

      FORMIO_JWT_SECRET: ${FORMIO_JWT_SECRET:---- change me now ---}

    ports:

      - "5000:5000"

    networks:

      - formsflow


  proxy:

    image: nginx:stable-alpine

    volumes:

      - ./configuration/conf.d/nginx.conf:/etc/nginx/nginx.conf

    restart: unless-stopped

    links:

      - forms-flow-bpm

      - forms-flow-web

      - forms-flow-webapi

      - forms-flow-forms

    ports:

      - "8081:8081"

    networks:

      - formsflow


volumes:

  postgres:

  mongodb:

networks:

  formsflow:

    driver: bridge

4. CONCLUSÃO

               O FormsFlow.ai é uma solução eficiente e personalizada para gerenciamento de fluxo de trabalho. Sua instalação local em Docker permite às organizações personalizar a instalação de acordo com suas necessidades específicas. A configuração do sistema é feita por meio de um painel de administração fácil de usar, que permite a definição de permissões de usuário e a criação de fluxos de trabalho personalizados. Além disso, o sistema é capaz de fornecer uma rota de acesso para os usuários, o que torna o processo de gerenciamento de fluxo de trabalho ainda mais eficiente.