SEI

De Wiki - Prefeitura do Município de São Paulo
Revisão de 11h01min de 3 de julho de 2017 por D841157 (Discussão | contribs) (memcached)

Ir para: navegação, pesquisa

O Sistema Eletrônico de Informações ou simplesmente SEI, é o sistema responsável pelo gerenciamento dos processos administrativos eletrônicos da Prefeitura do Município de São Paulo e que serve de base para a implantação do Processo Eletrônico. Foi desenvolvido pelo Tribunal Regional Federal da 4ª Região (TRF4).

Instalação do SEI/SIP com vagrant

A instalação do SEI/SIP com vagrant provê uma máquina Linux “enxuta” e virtualizada capaz de provisionar ambientes docker modularizados para cada componente do sistema. As instruções abaixo foram baseadas no manual constante no Portal do Software Público [1] e devem ser seguidas para obter esse ambiente.

Pré-requisitos para instalação no windows

Instalar:

Na instalação do git no Windows, recomenda-se que se instale o “git bash”, e todos os comandos sejam realizados neste ambiente.

Configuração do proxy

Antes de baixar o box do vagrant, certifique-se de que as variáveis de ambiente http_proxy e https_proxy estejam devidamente configurados para o servidor proxy. No caso, estando sob a SMIT, utilize os seguintes comandos:

export http_proxy=username:senha@10.10.193.25:3128
export https_proxy=username:senha@10.10.193.25:3128

Inicializando o ambiente

No diretório do código do SEI, rode o seguinte comando:

vagrant init processoeletronico/sei-3.0.0

O comando acima cria um arquivo de configuração “Vagrantfile” no diretório do código do SEI. Esse arquivo define que a box processoeletronico/sei-3.0.0 será baixada em https://atlas.hashicorp.com/processoeletronico/boxes/sei-3.0.0 e utilizada para prover a máquina virtual. Em seguida basta subir a máquina pelo comando:

vagrant up

Se o vagrant indicar que não subiu a máquina virtual devido a possíveis conflitos de redirecionamento de porta, basta utilizar o comando:

vagrant reload

Configuração do proxy do apt

Outro problema pode ocorrer nesta última etapa. Nesta fase final, alguns pacotes deveriam ser instalados dentro da máquina virtual, entretanto, pode ser que não o sejam devido a problemas de configuração de proxy no "apt":

Reading package lists...
Building dependency tree...
Reading state information...
dkms is already the newest version.
The following packages were automatically installed and are no longer required:
  acl at-spi2-core colord dconf-gsettings-backend dconf-service fontconfig
  fontconfig-config fonts-dejavu-core hicolor-icon-theme libasound2
  libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0
  libavahi-client3 libavahi-common-data libavahi-common3 libcairo-gobject2
  libcairo2 libcanberra-gtk3-0 libcanberra-gtk3-module libcanberra0 libcolord1
  libcolorhug1 libcups2 libdatrie1 libdconf1 libdrm-intel1 libdrm-nouveau2
  libdrm-radeon1 libexif12 libfontconfig1 libfontenc1 libgd3
  libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common libgl1-mesa-dri libgl1-mesa-glx
  libglapi-mesa libgphoto2-6 libgphoto2-l10n libgphoto2-port10 libgraphite2-3
  libgtk-3-0 libgtk-3-bin libgtk-3-common libgudev-1.0-0 libgusb2
  libharfbuzz0b libice6 libieee1284-3 libjasper1 libjbig0 libjpeg-turbo8
  libjpeg8 liblcms2-2 libllvm3.4 libnotify-bin libnotify4 libogg0
  libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpciaccess0
  libpixman-1-0 libsane libsane-common libsm6 libtdb1 libthai-data libthai0
  libtiff5 libtxc-dxtn-s2tc0 libv4l-0 libv4lconvert0 libvorbis0a
  libvorbisfile3 libvpx1 libwayland-client0 libwayland-cursor0 libx11-xcb1
  libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0
  libxcb-render0 libxcb-shm0 libxcb-sync1 libxcomposite1 libxcursor1
  libxdamage1 libxfixes3 libxfont1 libxi6 libxinerama1 libxkbcommon0
  libxkbfile1 libxmu6 libxpm4 libxrandr2 libxrender1 libxshmfence1 libxt6
  libxtst6 libxxf86vm1 notification-daemon sound-theme-freedesktop x11-common
  x11-xkb-utils xfonts-base xfonts-encodings xfonts-utils xserver-common
  xserver-xorg-core
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
  linux-headers-3.13.0-105 linux-headers-3.13.0-105-generic

Para resolver este problema, após a mensagem acima ser impressa e a instalação não progredir, feche o vagrant com ctrl^c. Neste ponto, a máquina virtual encontra-se em funcionamento, entretanto, a instalação do SEI ainda não está concluída. Acesse a máquina por ssh:

vagrant ssh

Logue como root para alterar arquivos de configuração no diretório de sistema /etc/apt.

sudo su

Altere, ou crie o arquivo apt.conf

vim /etc/apt/apt.conf

Acrescente as seguintes linhas de configuração do proxy:

Acquire::http::Proxy "http://usuário:senha@10.10.193.25:3128";
Acquire::https::Proxy "https://usuário:senha@10.10.193.25:3128";

Saia da sessão ssh aberta e carregue novamente a máquina virtual:

vagrant reload

Neste ponto acesse http://localhost/sei, e verifique se o SEI está funcionando devidamente.

Componentes de software auxiliares

O processo de instalação do SEI levanta serviços que podem ou não ser acessados pelo browser. Eles devem estar disponíveis após a conclusão dos passos da sessão acima.

==> default: Starting smtp
==> default: Starting jod
==> default: Starting mysql
==> default: Starting solr
==> default: Starting memcached
==> default: Starting httpd

A classe abaixo, contida em "sei/config", define em quais locais os serviços levantados serão acessados. A classe é implementada utilizando o padrão de projeto "Singleton", evitando-se que mais de uma instância exista em um mesmo momento de execução.

class ConfiguracaoSEI extends InfraConfiguracao  {

 	private static $instance = null;

 	public static function getInstance(){
 	  if (ConfiguracaoSEI::$instance == null) {
 	    ConfiguracaoSEI::$instance = new ConfiguracaoSEI();
 	  }
 	  return ConfiguracaoSEI::$instance;
 	}

 	public function getArrConfiguracoes(){
 	  return array(

 	      'SEI' => array(
 	          'URL' => 'http://[Servidor PHP]/sei',
 	          'Producao' => true,
 	          'RepositorioArquivos' => '/dados'),

 	      'PaginaSEI' => array(
 	          'NomeSistema' => 'SEI',
 	          'NomeSistemaComplemento' => '',
 	          'LogoMenu' => ''),
 	       
 	      'SessaoSEI' => array(
 	          'SiglaOrgaoSistema' => 'ABC',
 	          'SiglaSistema' => 'SEI',
 	          'PaginaLogin' => 'http://[Servidor PHP]/sip/login.php',
 	          'SipWsdl' => 'http://[Servidor PHP]/sip/controlador_ws.php?servico=wsdl',
 	          'https' => false),
 	       
 	      'BancoSEI'  => array(
 	          'Servidor' => '[servidor BD]',
 	          'Porta' => '',
 	          'Banco' => '',
 	          'Usuario' => '',
 	          'Senha' => '',
 	          'Tipo' => ''), //MySql, SqlServer ou Oracle

				'CacheSEI' => array('Servidor' => '[Servidor Memcache]',
					                	'Porta' => '11211'),

 	      'JODConverter' => array('Servidor' => 'http://[Servidor JODConverter]:8080/converter/service'),

 	      'Edoc' => array('Servidor' => 'http://[Servidor .NET]'),
 	       
 	      'Solr' => array(
 	          'Servidor' => 'http://[Servidor Solr]:8080/solr',
 	          'CoreProtocolos' => 'sei-protocolos',
 	          'CoreBasesConhecimento' => 'sei-bases-conhecimento',
 	          'CorePublicacoes' => 'sei-publicacoes'),

				'HostWebService' => array(
						'Edoc' => array('[Servidor .NET]'),
						'Sip' => array('[Servidor PHP]'), //Referências (IP e nome na rede) de todas as máquinas que executam o SIP.
						'Publicacao' => array(), //Referências (IP e nome na rede) das máquinas de veículos de publicação externos cadastrados no SEI.
						'Ouvidoria' => array(), //Referências (IP e nome na rede) da máquina que hospeda o formulário de Ouvidoria personalizado. Se utilizar o formulário padrão do SEI, então configurar com as máquinas dos nós de aplicação do SEI.
				),
 	       
 	      'InfraMail' => array(
						'Tipo' => '1', //1 = sendmail (neste caso não é necessário configurar os atributos abaixo), 2 = SMTP
						'Servidor' => '[Servidor E-Mail]',
						'Porta' => '25',
						'Codificacao' => '8bit', //8bit, 7bit, binary, base64, quoted-printable
						'MaxDestinatarios' => 999, //numero maximo de destinatarios por mensagem
						'MaxTamAnexosMb' => 999, //tamanho maximo dos anexos em Mb por mensagem
						'Seguranca' => 'TLS', //TLS, SSL ou vazio
						'Autenticar' => false, //se true então informar Usuario e Senha
						'Usuario' => 'aaa',
						'Senha' => 'aaa',
						'Protegido' => '' //campo usado em desenvolvimento, se tiver um email preenchido entao todos os emails enviados terao o destinatario ignorado e substituído por este valor (evita envio incorreto de email)
				)
 	  );
 	}
}

Smtp

Roda na porta 1080 do servidor. Possível acessar pelo endereço http://localhost:1080 .

Ao acessar o endereço acima, nota-se que ali um servidor de MailCacther [2] está em funcionamento. Trata-se de um servidor de e-mail simples que recebe mensagens enviadas a ele, e as disponibiliza em uma interface web.

Seu uso no SEI é destinado apenas a debug dos serviços de e-mail.

JODConverter

Roda na porta 8080 do servidor. Possível acessar pelo endereço http://localhost:8080 .

A aplicação JODConverter (Java opendocument converter, [3] ) tem como propósito converter documentos entre diferentes formatos office.

No SEI, esta ferramenta é utilizada para gerar PDF’s de processos tendo arquivos texto como entrada. A figura abaixo, extraída da interface web do serviço, exemplifica sua funcionalidade.

Funcionamento do JODConverter

Mysql

Roda na porta 3306 do servidor.

Trata-se do servidor de banco de dados utilizado tanto para o SEI quanto para SIP. É possível verificar se o servidor está respondendo através da porta 3306 no browser. Essa abordagem, entretanto, é insuficiente uma vez que retorna uma página ininteligível.

Para verificar corretamente a conexão com o servidor de banco de dados do SEI, recomenda-se utilizar um cliente SQL local como o SQuirreL [4] . A figura abaixo, mostra a tela de configuração de um “alias” do SQuirreL para se conectar ao banco em http://localhost:3396 .

Configuração do SQuirreL


Se o servidor estiver funcionando devidamente, os esquemas do banco de dados devem ser listados conforme a figura abaixo.

Esquema do Banco de Dados pelo SQuirreL

Solr

Utilização do Solr

Roda na porta 8983 do servidor. O acesso a tela de administração do Solr pode ser realizado pelo endereço http://localhost:8983.

Solr [5] é uma plataforma escrita em java destinada a busca e indexação de texto dentro das aplicações.

Na figura ao lado, extraída da tela de administração, nota-se que o Solr é utilizado em três contextos do SEI: busca na base de conhecimento, busca protocolo, e busca de publicação.

Nas considerações gerais do manual do SEI [6] , o Solr busca termos tanto em metadados de processos e documentos bem como no teor dos documentos (seja em pdf, doc, etc).

memcached

Interpretador de comandos do memcached

Roda na porta 11211 do servidor.

De acordo com o artigo "Aplicando o memcached para aumentar o desempenho do site" [7], memcached é um sistema para armazenamento em memória de dados carregados de outros locais. Em aplicações web é comumente utilizado para manter na RAM páginas ou elementos de página que frequentemente são acessados.

O sistema é mantido em um servidor que pode ser acessado por vários clientes. Dessa maneira, a interface para a utilização de seus recursos se dá pela rede.

Não é possível visualizar o funcionamento do Memcached pelo browser. Para tal, deve-se acessar a máquina na qual o SEI está sendo executado e verificar pela linha de comando se há resposta do memcached. No caso da instalação com vagrant, deve-se acessar a máquina virtual por ssh e então fazer a verificação, conforme figura a direita:

httpd

Roda na porta 80 do servidor.

Aplicação Deamon encarregada de servir a requisições http da web.

Macro arquitetura do SEI/SIP

As informações expostas a seguir foram baseadas na documentação de desenvolvimento de módulos do SEI [8] .

Infra

DTO

O SEI/SIP implementa o padrão de projeto DTO (Data Transfer Object). De acordo com Martin Flower, [9] trata-se de uma abordagem para encapsulamento de dados em uma camada com o intuito de serem enviados a uma camada subjacente. A intenção dessa abordagem é reduzir o número de chamadas para a transferência de dados entre camadas, uma vez que, em se tratando de objetos remotos, cada chamada pode custar caro ao processamento.

Arquitetura em Camadas

De acordo com com a documentação oficial, as três camadas que compõem o sistema são:

Cliente

  • Interação com o usuário ou outros sistemas
  • Validações simples que não necessitem acesso à dados

RN

  • Controle de transação
  • Validação de permissões
  • Auditoria

Validação das regras de negócio

BD

  • Persistência
  • Recuperação de dados"

As três camadas são implementadas por classes abstratas, quais são, respectivamente: InfraPagina, InfraRN, InfraBD. Abaixo segue-se uma tabela com uma breve definição de cada uma:

InfraPagina InfraRN InfraBD
Monta o esqueleto da página com seus elementos gráficos. Empacota um conjunto de funcionalidades que devem estar contidas em várias atividades do sistema, como: validação de permissões, validação de regras etc. Realiza o acesso as bases de dados.

Para cada nova funcionalidade em que se deve acessar/recuperar páginas, acessar o banco, validar permissões, etc, deve-se implementar cada uma dessas classes abstratas para o contexto específico.

Comunicação inter camadas

Conforme preconizado pelo DTO, a comunicação entre as camadas dessa arquitetura deve ocorrer por intermédio de um objeto que encapsula todos os dados de interesse do destinatário. O objeto em questão, deve ser uma instância de uma classe que implementa a classe abstrata InfraDTO.

Exemplo: Impressão de documentos de processo

A situação a seguir exemplifica a arquitetura definida nesta sessão.

Na tela de acompanhamento do processo, selecione um documento:

Procedimento trabalhar.png


Depois, requisite a impressão.


Documento imprimir web.png


O diagrama de objetos correspondente a essa situação é representada abaixo:


Sei.jpg

De acordo com o código executado, no arquivo "documento_imprimir.php", inicialmente um objeto DocumentoDTO é instanciado para que seja verificado se o documento a ser impresso existe. A verificação é realizada dentro da classe DocumentoDB instanciada pela classe DocumentoRN (que também realiza outras verificações).

Caso o documento não tenha sido gerado externamente ao SEI, mas internamente, um objeto EditorDTO será instanciado e passado a uma instância de EditorRN. Em seguida, uma versão html deste documento é retornada e disponibilizada para impressão.

SIP

SEI

Referências:

Predefinição:Reflist
  1. Sei com Vagrant
  2. MailCatcher
  3. JODConverter
  4. [http://squirrel-sql.sourceforge.net/ SQuirreL
  5. [http://lucene.apache.org/solr/ Solr
  6. [https://softwarepublico.gov.br/social/sei/manuais/manual-de-instalacao/1.-consideracoes-gerais Considerações gerais - Manual do Sei
  7. [https://www.ibm.com/developerworks/br/opensource/library/os-memcached/index.html Memcached
  8. Módulos - Versão 3.0
  9. [4] Data Transfer Object, Martin Fowler