Projeto

Geral

Perfil

Ações

Implantação #168

Aberta
CD EG

RI - Repositório Institucional (Dsapce)

Implantação #168: RI - Repositório Institucional (Dsapce)

Adicionado por Charles Miller de Góis Oliveira 3 meses atrás. Atualizado 9 dias atrás.

Situação:
Em Atendimento
Prioridade:
Normal
Início:
06/03/2026
Data prevista:
% Terminado:

75%

Tempo estimado:
(Total: 0:00 h)
Demandante:
Nº SOSTI:
Nº SEI:

Descrição

O repositório Institucional da Universidade do Estado do Rio Grande do Norte (UERN) é um espaço digital que reúne e organiza toda a produçao intelectual desenvolvida pela comunidade academica da instituiçao, inclusindo trabalhos de docentes, técnicos e alunos.:

Nossa missão principal é armazenar, preservar e garantir o acesso livre e online a esses conteúdos, tornando-os disponíveis para a comunidade científica e para a sociedade em geral.
Para assegurar a organização e a perenidade desse acervo, o Repositório Institucional da UERN é guiado por uma política interna de informação técnico-científica, estabelecida por meio de resoluções e normas específicas que regulamentam a submissão, a gestão e a disseminação dos materiais.


Subtarefas 4 (1 aberta3 fechadas)

Funcionalidade #50: DSPACE - Repositório Institucional (RIUERN)ResolvidaEric Diego Matozo Gonçalves Gonçalves06/03/2026

Ações
Funcionalidade #169: Implantar mecanismo de monitoramento do RINovaEric Diego Matozo Gonçalves Gonçalves25/03/2026

Ações
Bug #202: Erro 500ResolvidaEric Diego Matozo Gonçalves Gonçalves22/04/2026

Ações
Melhoria #278: DSPACE / REPOSITORIO - Contrato de Usuário FinalResolvidaEric Diego Matozo Gonçalves Gonçalves21/05/2026

Ações

CD Atualizado por Charles Miller de Góis Oliveira3 meses Ações #1

  • Subtarefa #169 adicionado

EG Atualizado por Eric Diego Matozo Gonçalves Gonçalves3 meses Ações #2

  • Situação alterado de Nova para Em Atendimento

Domínios do Repositório e Importador já acessíveis externamente.

  1. https://repositorio.apps.uern.br/home
  2. https://importador.apps.uern.br/conta/entrar/?next=/

Estudo da integração entre ambos, bem como importação de arquivos no importador, em análise.

CD Atualizado por Charles Miller de Góis Oliveira2 meses Ações #3

  • Subtarefa #50 adicionado

CD Atualizado por Charles Miller de Góis Oliveira2 meses Ações #4

  • Subtarefa #202 adicionado

CD Atualizado por Charles Miller de Góis Oliveiraaproximadamente 1 mês Ações #5

  • Subtarefa #278 adicionado

EG Atualizado por Eric Diego Matozo Gonçalves Gonçalves22 dias Ações #6

Registro de preocupação técnica e administrativa — DSpace

Antes da entrega definitiva do DSpace em produção, registro preocupação quanto ao status atual do ambiente.

Embora o sistema esteja funcional nos fluxos testados e já venha sendo utilizado pela biblioteca em alguns procedimentos, entendo que isso ainda não configura entrega definitiva, homologação final ou aceite formal da solução.

Pontos pendentes

  • Ausência, até onde se tem conhecimento, de rotina formal e validada de backup e restauração envolvendo:

    • banco de dados;
    • arquivos depositados;
    • configurações;
    • customizações realizadas.
  • Necessidade de avaliação dos acessos estranhos observados no ambiente, possivelmente bots ou tentativas de raspagem.

  • Necessidade de formalização do status atual do sistema.

Risco identificado

Sem backup e restauração previamente validados, qualquer perda de dados, indisponibilidade, problema em arquivos depositados ou inconsistência em trabalhos pode gerar cobrança institucional sobre a solução e sobre as equipes envolvidas.

Encaminhamento sugerido

Formalizar o ambiente como uso assistido/operação inicial, com pendências conhecidas, até que sejam validados os pontos críticos de backup, restauração e exposição do ambiente.

Caso a decisão seja avançar para produção plena mesmo com essas pendências, recomenda-se que essa decisão seja formalizada pela gestão, pela instituição e pelas áreas envolvidas, incluindo a biblioteca, com ciência dos riscos registrados.

EG Atualizado por Eric Diego Matozo Gonçalves Gonçalves15 dias · Editado Ações #7

Arquitetura proposta

Arquitetura mínima recomendada para organizar o ambiente DSpace com separação de responsabilidades:

VM 1 — Aplicação / Produção
- Nginx
- DSpace Angular frontend
- Tomcat / DSpace REST backend
- Solr, provisoriamente

VM 2 — Banco / Produção
- PostgreSQL 16
- Banco dspace

VM 3 — Homologação / Desenvolvimento e testes
- Ambiente para validar deploy, restore, permissões, Nginx, Tomcat, Solr e importações
- Deve usar banco próprio de teste, não o banco de produção

VM 4 — Backup
- Destino dos backups do PostgreSQL
- Backup do assetstore
- Backup das configurações
- Backup de Nginx, Tomcat e systemd
- Retenção mínima

Observação importante: a VM de backup não deve ser o único destino final se estiver no mesmo host/storage da produção. O ideal é manter cópia adicional em armazenamento externo, outro host, NAS ou storage institucional.


Frente 1 — Inventário do ambiente atual

Itens identificados

  • Backend DSpace: /dspace

  • Código/fonte instalado: /dspace/DSpace-dspace-8.1

  • Backend implantado no Tomcat:

    • /opt/tomcat/webapps/server
    • /opt/tomcat/webapps/server-boot.jar
  • Assetstore: /dspace/assetstore

    • Dono: dspace:dspace
    • Tamanho: 755M
  • Banco PostgreSQL:

    • Versão: PostgreSQL 16.14
    • Cluster: 16-main
    • Host/porta: localhost:5432
    • Banco: dspace
    • Usuário: dspace
    • Tamanho: 14 MB
  • Configurações DSpace:

    • /dspace/config
    • /dspace/config/local.cfg
    • /dspace/config/dspace.cfg
    • /dspace/config/submission-forms.xml
    • /dspace/config/item-submission.xml
    • /dspace/config/modules/authentication.cfg
  • Configurações Nginx:

    • /etc/nginx
    • /etc/nginx/sites-enabled/default
    • server_name repositorio.apps.uern.br
    • / -> http://localhost:4000
    • /server/ -> http://localhost:8080/server/
    • client_max_body_size 1G
  • Serviço backend:

    • tomcat.service
    • Origem: /etc/init.d/tomcat
    • Status: active/running
    • Porta: 8080
  • Serviço frontend:

    • dspace-ui.service
    • Unit: /etc/systemd/system/dspace-ui.service
    • Usuário: dspace
    • WorkingDirectory: /dspace-8-angular
    • ExecStart: /usr/bin/node /dspace-8-angular/dist/server/main
    • Porta: 4000
  • Customizações locais/repositórios:

    • Frontend: /home/sti/git-repos/dspace-angular-uern
    • Backend: /home/sti/git-repos/dspace-backend-uern
    • Deploy/configs: /home/sti/git-repos/dspace-deploy-uern

Frente 2 — Backup completo

Objetivo: criar uma cópia recuperável dos componentes essenciais do DSpace antes de qualquer alteração em permissões, Tomcat, portas, Nginx ou serviços.

2.1 Backup imediato do PostgreSQL

  • Identificar nome da base, usuário e versão do PostgreSQL

    • Banco: dspace
    • Usuário: dspace
    • Versão: PostgreSQL 16.14
    • Host/porta: localhost:5432
  • Criar backup lógico com pg_dump

  • Criar backup dos objetos globais com pg_dumpall --globals-only

  • Validar se o dump foi gerado sem erro

  • Validar leitura do dump com pg_restore -l

  • Gerar checksum dos arquivos

  • Registrar comando usado, data, horário, tamanho do arquivo e local de armazenamento

  • Copiar backup para destino externo à VM de aplicação

Observação: o pg_dump será usado como backup inicial/manual por ser simples, direto e adequado para uma primeira camada de segurança antes das correções.


2.2 Avaliar implantação do pgBackRest

  • Avaliar uso do pgBackRest para rotina permanente de backup do PostgreSQL
  • Definir se o pgBackRest será executado a partir da VM do banco ou integrado à VM de backup
  • Definir repositório de backup
  • Definir política de retenção
  • Avaliar arquivamento de WAL
  • Documentar procedimento de restore
  • Testar restore em ambiente separado

Observação: o pgBackRest é recomendado para uma estratégia mais robusta de backup do PostgreSQL, especialmente para backup físico, retenção e recuperação por ponto no tempo. Ele não substitui o backup do assetstore nem das configurações do DSpace.


2.3 Backup do assetstore

  • Identificar caminho real do assetstore:

    • /dspace/assetstore
  • Criar backup completo do diretório

  • Preservar permissões, donos e timestamps

  • Registrar tamanho total e quantidade aproximada de arquivos

  • Copiar backup para a VM de backup

  • Copiar backup para destino externo adicional, se disponível

Observação: o assetstore é obrigatório no backup porque contém os arquivos depositados no DSpace, como PDFs e demais binários.


2.4 Backup das configurações do DSpace

  • Criar backup de /dspace/config
  • Incluir local.cfg
  • Incluir dspace.cfg
  • Incluir submission-forms.xml
  • Incluir item-submission.xml
  • Incluir modules/authentication.cfg
  • Incluir configurações de metadados, autenticação, Solr, logs, submissão e demais customizações locais
  • Preservar permissões originais
  • Copiar backup para a VM de backup

2.5 Backup do frontend Angular

  • Criar backup de /dspace-8-angular/config

  • Criar backup do dist atualmente em produção

  • Registrar versão/commit do código usado no frontend, se disponível

  • Registrar origem do código:

    • /home/sti/git-repos/dspace-angular-uern
  • Copiar backup para a VM de backup


2.6 Backup do Tomcat

  • Criar backup de /opt/tomcat/conf

  • Criar backup de /opt/tomcat/webapps

  • Incluir:

    • /opt/tomcat/webapps/server
    • /opt/tomcat/webapps/server-boot.jar
  • Registrar ownership e permissões atuais de /opt/tomcat

  • Registrar versão do Tomcat e Java

  • Copiar backup para a VM de backup


2.7 Backup do Nginx

  • Criar backup de /etc/nginx
  • Criar backup de /etc/nginx/sites-enabled/default
  • Registrar configuração ativa com nginx -T
  • Validar configuração com nginx -t
  • Copiar backup para a VM de backup

2.8 Backup dos serviços systemd/init

  • Criar backup da definição do serviço tomcat.service
  • Criar backup de /etc/init.d/tomcat
  • Criar backup da unit do frontend dspace-ui.service
  • Criar backup da unit do Solr, se existir
  • Registrar saída de systemctl cat para cada serviço
  • Copiar backup para a VM de backup

2.9 Destino do backup

  • Definir local temporário do backup na VM de aplicação
  • Definir VM de backup como destino principal
  • Definir destino externo adicional, se possível
  • Garantir que o backup não fique apenas no mesmo disco/servidor da produção
  • Restringir acesso aos arquivos de backup, pois podem conter senhas e dados sensíveis

Arquitetura esperada:

VM Aplicação -> VM Backup -> Storage externo/outro host
VM Banco     -> VM Backup -> Storage externo/outro host

2.10 Retenção mínima

  • Definir retenção mínima dos backups manuais

  • Definir retenção da rotina permanente

  • Separar política para:

    • banco PostgreSQL
    • assetstore
    • configurações
    • Nginx
    • Tomcat
    • systemd
    • frontend
  • Documentar quem é responsável por verificar a execução dos backups

Sugestão inicial de retenção mínima:

Backups manuais críticos: manter até conclusão das correções
Backup diário: 7 dias
Backup semanal: 4 semanas
Backup mensal: 3 a 6 meses

Essa retenção deve ser validada com a política institucional.


2.11 Validação mínima

  • Confirmar que os arquivos foram gerados
  • Confirmar tamanho plausível dos backups
  • Listar conteúdo dos arquivos compactados
  • Testar leitura dos arquivos
  • Validar dump do PostgreSQL com pg_restore -l
  • Validar checksums
  • Testar restore do banco em ambiente separado
  • Registrar limitações caso o restore completo ainda não tenha sido testado

Frente 3 — Restore validado

Objetivo: provar que o backup é recuperável antes de corrigir os riscos de produção.

Arquitetura alvo desta frente:

VM 3 — Homologação / Testes

Itens

  • Criar VM de homologação/testes
  • Instalar dependências necessárias
  • Restaurar banco PostgreSQL em banco de teste
  • Restaurar assetstore
  • Restaurar configurações do DSpace
  • Restaurar configurações do frontend
  • Restaurar configurações do Tomcat
  • Restaurar configurações do Nginx
  • Subir backend
  • Subir frontend
  • Subir Nginx
  • Validar login
  • Validar busca
  • Validar acesso a item
  • Validar abertura/download de PDF
  • Validar importação
  • Validar permissões
  • Registrar problemas encontrados no restore

Observação: a VM de homologação não deve apontar para o banco de produção.


Frente 4 — Deploy controlado

Objetivo: formalizar como alterações saem dos repositórios Git e chegam à produção, reduzindo risco de erro manual.

Itens

  • Documentar deploy atual do frontend
  • Documentar deploy atual do backend
  • Documentar deploy atual do Nginx
  • Documentar ownership correto dos diretórios de produção
  • Criar procedimento de rollback do frontend
  • Criar procedimento de rollback do backend
  • Criar procedimento de rollback do Nginx
  • Testar deploy primeiro na VM de homologação
  • Só aplicar em produção após validação

Fluxo alvo

Git/repositório -> build em ambiente controlado -> homologação -> produção

Repositórios identificados

Frontend: /home/sti/git-repos/dspace-angular-uern
Backend:  /home/sti/git-repos/dspace-backend-uern
Deploy:   /home/sti/git-repos/dspace-deploy-uern

Frente 5 — Evolução de arquitetura

Objetivo: sair do modelo improvisado e caminhar para uma arquitetura mais segura, testável e recuperável.

5.1 Separação de VMs

  • Avaliar separação do banco em VM própria
  • Definir VM de aplicação
  • Definir VM de banco
  • Definir VM de homologação/testes
  • Definir VM de backup
  • Definir regras de rede entre as VMs
  • Definir política de acesso administrativo

Arquitetura alvo:

VM Aplicação
- Nginx
- Frontend Angular
- Tomcat / Backend DSpace
- Solr, inicialmente

VM Banco
- PostgreSQL
- Acesso liberado apenas para VM Aplicação e VM Backup

VM Homologação/Testes
- Ambiente isolado para restore, deploy e validações
- Banco próprio de teste

VM Backup
- Recebe backups do banco, assetstore e configurações
- Deve replicar para storage externo ou outro host

5.2 Rede e exposição

  • Garantir que somente 80 e 443 fiquem expostas publicamente
  • Restringir Tomcat 8080 para acesso interno/local
  • Restringir Solr 8983 para acesso interno/local
  • Restringir PostgreSQL 5432 para IPs autorizados
  • Configurar redirect global HTTP -> HTTPS
  • Revisar firewall entre as VMs

Fluxo esperado:

Usuário externo -> Nginx 443 -> Frontend/Backend
Nginx -> localhost:4000
Nginx -> localhost:8080/server/
Backend -> PostgreSQL
Backend -> Solr
Backup -> PostgreSQL/arquivos, conforme política definida

5.3 Backup permanente

  • Avaliar pgBackRest para PostgreSQL
  • Definir rotina de backup do assetstore
  • Definir rotina de backup das configurações
  • Definir retenção
  • Definir cópia externa
  • Criar rotina de verificação periódica
  • Agendar teste de restore

5.4 Containerização

  • Avaliar containerização somente depois de backup e restore validados
  • Avaliar Docker/Compose para homologação antes de produção
  • Não iniciar containerização antes de corrigir backup, deploy e permissões básicas

Observação: containerização pode ajudar, mas não deve ser usada como atalho para esconder problema de backup, permissão ou arquitetura.


5.5 CI/CD

  • Avaliar pipeline de build do frontend
  • Avaliar pipeline de build do backend
  • Avaliar deploy automatizado em homologação
  • Avaliar promoção manual para produção
  • Exigir rollback documentado antes de automatizar produção

5.6 Monitoramento e logs

  • Avaliar monitoramento de disponibilidade
  • Avaliar monitoramento de uso de disco
  • Avaliar monitoramento do PostgreSQL
  • Avaliar monitoramento do Tomcat
  • Avaliar monitoramento do Solr
  • Avaliar centralização de logs
  • Definir alertas mínimos

Alertas mínimos recomendados:

Disco cheio
Serviço Tomcat parado
Serviço dspace-ui parado
Serviço PostgreSQL parado
Serviço Solr parado
Erro 5xx no Nginx
Falha de backup
Certificado TLS próximo do vencimento

Frente 6 — Correção dos riscos pendentes pós-backup

Esta frente só deve iniciar após backup completo e validação mínima.

Bloco A — Tomcat e permissões do backend

Resolve:

1. Tomcat rodando como root
2. /opt/tomcat pertencendo ao usuário sti
3. Logs do DSpace como root:root
4. local.cfg com senha e permissão 0644
  • Criar usuário dedicado para Tomcat, se necessário
  • Ajustar serviço do Tomcat
  • Revisar ownership de /opt/tomcat
  • Revisar permissões de /dspace/config/local.cfg
  • Validar inicialização do backend
  • Validar geração de logs com usuário correto

Bloco B — Restrição de portas internas

Resolve:

6. Tomcat exposto em *:8080
7. Solr exposto em *:8983
  • Validar proxy do Nginx para o Tomcat
  • Validar configuração do DSpace para o Solr
  • Restringir 8080
  • Restringir 8983
  • Validar frontend
  • Validar REST API
  • Validar busca/indexação

Bloco C — Frontend e HTTPS

Resolve:

5. config.yml do frontend como root:root
8. porta 80 sem redirect global para HTTPS
  • Ajustar ownership de /dspace-8-angular/config/config.yml
  • Validar serviço dspace-ui
  • Configurar redirect HTTP -> HTTPS
  • Validar acesso externo
  • Validar login e navegação

EG Atualizado por Eric Diego Matozo Gonçalves Gonçalves9 dias Ações #8

Segue um .md completo para salvar no repo de deploy, por exemplo:

docs/hml-replicacao-producao-dspace-2026-06-16.md

Replicação do Ambiente de Produção DSpace 8.1 para HML

1. Objetivo

Este documento registra o procedimento executado para montar um ambiente de homologação do DSpace 8.1 a partir do ambiente de produção.

O objetivo foi criar uma HML funcional, próxima da produção, contendo:

  • Backend DSpace 8.1;
  • Frontend Angular DSpace;
  • PostgreSQL restaurado;
  • Assetstore restaurado;
  • Solr configurado;
  • Nginx como proxy reverso;
  • Tomcat para o backend;
  • Serviço systemd para o frontend;
  • Tema institucional RIUERN;
  • Idioma pt-BR;
  • Importação via interface;
  • Validação de busca, OAI, bitstream/PDF e item importado.

A HML ficou disponível em:

http://192.168.2.117/

Backend REST:

http://192.168.2.117/server

Banco HML:

192.168.2.174:5432/dspace

2. Premissas e decisões técnicas

2.1 Produção não foi copiada cegamente

Durante a comparação com produção, foi identificado que o Tomcat/backend DSpace em produção roda como root.

Isso explica por que, em produção, vários diretórios pertencem a dspace:dspace, mas o backend consegue escrever mesmo assim: root consegue ignorar as restrições normais de permissão.

Na HML, optou-se por um modelo mais correto:

Backend/Tomcat: tomcat
Frontend/Node: dspace
Solr: solr
Arquivos DSpace: dspace:dspace
tomcat pertence ao grupo dspace

Essa decisão evita rodar Tomcat como root.

2.2 Modelo de permissões adotado na HML

Os diretórios de runtime do DSpace precisam permitir escrita pelo grupo dspace, já que o Tomcat roda como tomcat, mas pertence ao grupo dspace.

Diretórios runtime principais:

/dspace/assetstore
/dspace/imports
/dspace/exports
/dspace/upload
/dspace/temp
/dspace/var
/dspace/log

Permissão final adotada:

/dspace            dspace:dspace 755
/dspace/assetstore dspace:dspace 2770
/dspace/imports    dspace:dspace 2770
/dspace/exports    dspace:dspace 2770
/dspace/upload     dspace:dspace 2770
/dspace/temp       dspace:dspace 2770
/dspace/var        dspace:dspace 2770
/dspace/log        dspace:dspace 2770

O 2 em 2770 ativa o setgid, garantindo que arquivos e diretórios criados dentro deles mantenham o grupo dspace.


3. Inventário inicial da produção

Antes da montagem da HML, foram identificados no ambiente de produção:

Backend DSpace: /dspace
Código/fonte instalado: /dspace/DSpace-dspace-8.1
Backend implantado no Tomcat:
/opt/tomcat/webapps/server
/opt/tomcat/webapps/server-boot.jar

Assetstore: /dspace/assetstore
Banco PostgreSQL: PostgreSQL 16.14
Frontend Angular: /dspace-8-angular
Solr: 8.11.4
Nginx: proxy reverso

Também foram identificadas configurações relevantes:

dspace.dir=/dspace

assetstore.dir = ${dspace.dir}/assetstore
assetstore.index.primary = 0

org.dspace.app.itemexport.work.dir = ${dspace.dir}/exports
org.dspace.app.itemexport.download.dir = ${dspace.dir}/exports/download

org.dspace.app.batchitemimport.work.dir = ${dspace.dir}/imports

upload.temp.dir = ${dspace.dir}/upload

report.dir = ${dspace.dir}/reports/
log.report.dir = ${dspace.dir}/log

Outros diretórios citados em configuração:

/dspace/sitemaps
/dspace/handle-server
/dspace/var/oai
/dspace/ctqueues

4. Backup e artefatos vindos da produção

Foram considerados/restaurados os seguintes artefatos:

dspace_assetstore_2026-06-15_081953.tar.gz
dspace_configs_clean_2026-06-15_081953.tar.gz
SHA256SUMS_2026-06-15_081953.txt
restore-configs-2026-06-15_081953

A HML recebeu:

  • banco PostgreSQL restaurado;
  • /dspace/assetstore;
  • configurações base do DSpace;
  • repositórios Git do backend, frontend e deploy;
  • configurações Solr versionadas no repo de deploy.

5. Instalação das dependências na HML

5.1 Java, Maven, Ant e Nginx

Validação final:

java -version
javac -version
mvn -version
ant -version
nginx -v
systemctl status nginx --no-pager

Resultado validado:

OpenJDK 17.0.19
javac 17.0.19
Apache Maven 3.8.7
Apache Ant 1.10.14
nginx 1.24.0

5.2 Node, npm e Yarn

Validação final:

node -v
npm -v
yarn -v
which node
which npm
which yarn

Resultado validado:

node: v20.20.2
npm: 11.4.2
yarn: 1.22.22

/usr/bin/node
/usr/bin/npm
/usr/bin/yarn

6. Instalação do Tomcat

6.1 Download

Foi baixado o Tomcat 10.1.42:

cd /tmp
wget https://archive.apache.org/dist/tomcat/tomcat-10/v10.1.42/bin/apache-tomcat-10.1.42.tar.gz

Validação:

ls -lh /tmp/apache-tomcat-10.1.42.tar.gz

6.2 Extração

sudo mkdir -p /opt/tomcat
sudo tar -xzf /tmp/apache-tomcat-10.1.42.tar.gz -C /opt/tomcat --strip-components=1
sudo chown -R tomcat:tomcat /opt/tomcat
sudo sh -c 'chmod +x /opt/tomcat/bin/*.sh'

Validação:

sudo -u tomcat /opt/tomcat/bin/version.sh

Resultado validado:

Server version: Apache Tomcat/10.1.42
JVM Version: 17.0.19

6.3 Serviço systemd do Tomcat

Foi criado:

/etc/systemd/system/tomcat.service

Exemplo do serviço:

[Unit]
Description=Apache Tomcat 10.1.42
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat

Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx2048M -Djava.awt.headless=true'
Environment='JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

Restart=on-failure

[Install]
WantedBy=multi-user.target

Ativação:

sudo systemctl daemon-reload
sudo systemctl enable --now tomcat

Validação:

systemctl status tomcat --no-pager -l
sudo ss -lntp | grep 8080
curl -I http://localhost:8080

7. Instalação do Solr

7.1 Download

Foi usado Solr 8.11.4:

ls -lh /tmp/solr-8.11.4.tgz
tar -tzf /tmp/solr-8.11.4.tgz | head -n 20

7.2 Diretórios

sudo mkdir -p /var/solr/data /var/solr/logs
sudo chown -R solr:solr /var/solr

7.3 Serviço systemd do Solr

Foi criado:

/etc/systemd/system/solr.service

O serviço aponta para:

/opt/solr/bin/solr start -p 8983 -s /var/solr/data

7.4 Problema inicial

Na primeira tentativa, o Solr falhou:

Solr home directory /var/solr/data must contain a solr.xml file!

Foi necessário garantir a estrutura correta do Solr home antes de subir o serviço.

7.5 Validação final

systemctl status solr --no-pager -l
sudo ss -lntp | grep 8983
curl -I http://localhost:8983/solr/

Resultado validado:

Solr ativo na porta 8983
HTTP/1.1 200 OK

8. Configurações Solr do DSpace

8.1 Origem das configurações

Na produção havia:

/dspace/solr
/dspace/solr/search
/dspace/solr/oai
/dspace/solr/authority
/dspace/solr/statistics
/dspace/solr/qaevent
/dspace/solr/suggestion

Com arquivos:

schema.xml
solrconfig.xml
protwords.txt
stopwords.txt
synonyms.txt
core.properties

8.2 Versionamento no repo de deploy

As configurações foram copiadas para o repo:

/home/sti/git-repos/dspace-deploy-uern/solr

Commit realizado:

Versiona configurações Solr do DSpace

Arquivos versionados:

solr/authority/conf/protwords.txt
solr/authority/conf/schema.xml
solr/authority/conf/solrconfig.xml
solr/authority/conf/stopwords.txt
solr/authority/conf/synonyms.txt
solr/authority/core.properties

solr/oai/conf/protwords.txt
solr/oai/conf/schema.xml
solr/oai/conf/solrconfig.xml
solr/oai/conf/stopwords.txt
solr/oai/conf/synonyms.txt
solr/oai/core.properties

solr/qaevent/conf/protwords.txt
solr/qaevent/conf/schema.xml
solr/qaevent/conf/solrconfig.xml
solr/qaevent/conf/stopwords.txt
solr/qaevent/conf/synonyms.txt
solr/qaevent/core.properties

solr/search/conf/protwords.txt
solr/search/conf/schema.xml
solr/search/conf/solrconfig.xml
solr/search/conf/stopwords.txt
solr/search/conf/synonyms.txt
solr/search/core.properties

solr/statistics/conf/protwords.txt
solr/statistics/conf/schema.xml
solr/statistics/conf/solrconfig.xml
solr/statistics/conf/stopwords.txt
solr/statistics/conf/synonyms.txt
solr/statistics/core.properties

solr/suggestion/conf/protwords.txt
solr/suggestion/conf/schema.xml
solr/suggestion/conf/solrconfig.xml
solr/suggestion/conf/stopwords.txt
solr/suggestion/conf/synonyms.txt
solr/suggestion/core.properties

8.3 Cores Solr validados

Após copiar os cores para /var/solr/data, a validação mostrou:

curl -s "http://localhost:8983/solr/admin/cores?action=STATUS&wt=json" | python3 -m json.tool

Cores presentes:

authority
oai
qaevent
search
statistics
suggestion

9. Backend DSpace

9.1 Repositório backend

Repositório usado na HML:

/home/sti/git-repos/dspace-backend-uern

Código instalado em:

/dspace/DSpace-dspace-8.1

Validação:

sudo ls -ld /dspace/DSpace-dspace-8.1
sudo ls -lh /dspace/DSpace-dspace-8.1/pom.xml
sudo -u dspace bash -lc 'cd /dspace/DSpace-dspace-8.1 && git status && git log --oneline -n 3'

9.2 Classes Solr do módulo OAI

Foi identificado que o .gitignore estava ignorando diretórios com nome solr em qualquer profundidade por causa da entrada:

solr/

Isso ignorava indevidamente:

dspace-oai/src/main/java/org/dspace/xoai/solr
dspace-oai/src/main/java/org/dspace/xoai/services/api/solr
dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr

O .gitignore foi ajustado para ignorar apenas o Solr runtime na raiz:

/solr/

Foram versionadas as classes:

dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrSearch.java
dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java
dspace-oai/src/main/java/org/dspace/xoai/solr/exceptions/DSpaceSolrException.java
dspace-oai/src/main/java/org/dspace/xoai/solr/exceptions/DSpaceSolrIndexerException.java
dspace-oai/src/main/java/org/dspace/xoai/solr/exceptions/SolrSearchEmptyException.java
dspace-oai/src/main/java/org/dspace/xoai/services/api/solr/SolrQueryResolver.java
dspace-oai/src/main/java/org/dspace/xoai/services/api/solr/SolrServerResolver.java
dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java
dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java

Commit:

Versiona classes Solr do módulo OAI

9.3 Sincronização do repo para /dspace/DSpace-dspace-8.1

sudo rsync -a --delete /home/sti/git-repos/dspace-backend-uern/ /dspace/DSpace-dspace-8.1/
sudo chown -R dspace:dspace /dspace/DSpace-dspace-8.1

Validação:

sudo -u dspace bash -lc '
cd /dspace/DSpace-dspace-8.1
git status
git log --oneline -n 3
'

9.4 Build do backend

sudo -u dspace bash -lc '
cd /dspace/DSpace-dspace-8.1
mvn package
'

Resultado:

BUILD SUCCESS
Total time: 02:34 min

Módulos com sucesso:

DSpace Parent Project
DSpace Services Framework
DSpace Kernel
DSpace Addon Modules
DSpace Kernel Additions and Local Customizations
DSpace IIIF
DSpace OAI-PMH
DSpace RDF
DSpace SWORD
DSpace SWORD v2
DSpace Server Webapp
DSpace Server Webapp:: Tomcat deployable WAR
DSpace Server Webapp:: Executable JAR
DSpace Assembly and Configuration

9.5 Installer gerado

Validação:

sudo -u dspace bash -lc '
cd /dspace/DSpace-dspace-8.1
ls -lh dspace/target/
ls -ld dspace/target/dspace-installer
find dspace/target/dspace-installer -maxdepth 2 -type f | sort | head -n 80
'

Installer:

/dspace/DSpace-dspace-8.1/dspace/target/dspace-installer

9.6 Ant update

Primeira execução falhou porque o installer não continha o diretório solr:

/dspace/DSpace-dspace-8.1/dspace/target/dspace-installer/solr does not exist

Correção aplicada:

sudo -u dspace bash -lc '
cd /dspace/DSpace-dspace-8.1/dspace/target/dspace-installer
mkdir -p solr
rsync -a --delete /dspace/solr/ solr/
find solr -maxdepth 3 -type f | sort
du -sh solr
'

Depois:

sudo -u dspace bash -lc '
cd /dspace/DSpace-dspace-8.1/dspace/target/dspace-installer
ant update
'

Resultado:

BUILD SUCCESSFUL

O Ant validou conexão com o banco:

Database Type: postgres
Database URL: jdbc:postgresql://192.168.2.174:5432/dspace
Database Schema: public
Database Username: dspace
Database Software: PostgreSQL version 16.14
pgcrypto installed/up-to-date: true

9.7 Configuração HML do backend

Arquivo:

/dspace/config/local.cfg

Valores validados:

dspace.server.url = http://192.168.2.117/server
dspace.server.ssr.url = http://localhost:8080/server
dspace.ui.url = http://192.168.2.117
db.url = jdbc:postgresql://192.168.2.174:5432/dspace
db.username = dspace

Não registrar senha do banco em documentação.

9.8 Implantação no Tomcat

O build gerou:

/dspace/webapps/server
/dspace/webapps/server-boot.jar

Cópia para Tomcat:

sudo systemctl stop tomcat

sudo rm -rf /opt/tomcat/webapps/*

sudo rsync -a /dspace/webapps/server/ /opt/tomcat/webapps/server/
sudo cp /dspace/webapps/server-boot.jar /opt/tomcat/webapps/server-boot.jar
sudo chown -R tomcat:tomcat /opt/tomcat/webapps

sudo systemctl start tomcat

Validação:

curl -I --max-time 20 http://localhost:8080/server/
curl -s --max-time 20 http://localhost:8080/server/api | head

Também foi testado por IP:

curl -s http://192.168.2.117:8080/server/api | grep -E "dspaceUI|dspaceServer|dspaceVersion"

Resultado correto:

"dspaceUI" : "http://192.168.2.117"
"dspaceServer" : "http://192.168.2.117/server"
"dspaceVersion" : "DSpace 8.1"

10. Nginx

10.1 Problema com backup em sites-enabled

Foi criado backup dentro de:

/etc/nginx/sites-enabled/

Isso causou erro:

duplicate default server for 0.0.0.0:80

Correção:

sudo rm -f /etc/nginx/sites-enabled/default.bak.*

Regra definida:

Não salvar backups dentro de /etc/nginx/sites-enabled.

10.2 Configuração final do Nginx

Arquivo:

/etc/nginx/sites-available/default

Conteúdo usado:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name 192.168.2.117;

    client_max_body_size 1G;

    location /server/ {
        proxy_pass http://localhost:8080/server/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }

    location / {
        proxy_pass http://localhost:4000/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }
}

Aplicação:

sudo nginx -t
sudo systemctl reload nginx

Validação:

curl -I --max-time 20 http://192.168.2.117/ | head -n 5
curl -s --max-time 20 http://192.168.2.117/ | grep -i "<title" | head
curl -s --max-time 20 http://192.168.2.117/server/api | grep -E "dspaceUI|dspaceServer|dspaceVersion"

Resultado:

HTTP/1.1 200 OK
<title>Repositório DSpace :: Início</title>
"dspaceUI" : "http://192.168.2.117"
"dspaceServer" : "http://192.168.2.117/server"
"dspaceVersion" : "DSpace 8.1"

11. Frontend Angular

11.1 Repositório

Repositório:

/home/sti/git-repos/dspace-angular-uern

Validação inicial:

cd /home/sti/git-repos/dspace-angular-uern

git status
git log --oneline -n 5

node -v
npm -v
yarn -v

Commit validado:

Ajusta tela de termos de usuário final

11.2 Configuração do Angular

Foi criado:

config/config.yml

A partir de:

config/config.example.yml

Com ajustes principais:

ui:
  ssl: false
  host: localhost
  port: 4000
  nameSpace: /
rest:
  ssl: false
  host: 192.168.2.117
  port: 80
  nameSpace: /server
  ssrBaseUrl: http://localhost:8080/server

11.3 Tema RIUERN

O tema existia no código:

src/themes/RIUERN

Mas o config.yml estava usando:

themes:
  - name: dspace

Foi alterado para:

themes:
  - name: RIUERN

11.4 Idioma pt-BR

A configuração inicialmente estava com:

defaultLanguage: en

E todos os idiomas ativos.

Foi ajustado para:

defaultLanguage: pt-BR

E lista reduzida:

languages:
  - code: pt-BR
    label: Português do Brasil
    active: true

Validação posterior:

curl -s --max-time 20 http://192.168.2.117/ | grep -iE "<html|<title" | head

Resultado:

<html lang="pt-BR">
<title>Repositório DSpace :: Início</title>

11.5 Instalação de dependências

Como node_modules estava ausente:

cd /home/sti/git-repos/dspace-angular-uern
yarn install --frozen-lockfile

11.6 Build do frontend

Primeira tentativa falhou com erro de memória Node:

FATAL ERROR: Ineffective mark-compacts near heap limit
Allocation failed - JavaScript heap out of memory

Correção:

export NODE_OPTIONS="--max-old-space-size=4096"
yarn run build:prod

Script usado:

yarn run build:prod

Que executa:

NODE_ENV=production yarn run build:ssr
ng build --configuration production
ng run dspace-angular:server:production

11.7 Deploy do frontend

Diretório final:

/dspace-8-angular

Cópia:

sudo mkdir -p /dspace-8-angular
sudo rsync -a --delete /home/sti/git-repos/dspace-angular-uern/dist/ /dspace-8-angular/dist/
sudo rsync -a /home/sti/git-repos/dspace-angular-uern/config/ /dspace-8-angular/config/
sudo chown -R dspace:dspace /dspace-8-angular

11.8 Serviço systemd do frontend

Arquivo:

/etc/systemd/system/dspace-ui.service

Conteúdo:

[Unit]
Description=DSpace Angular UI
After=network.target tomcat.service
Wants=tomcat.service

[Service]
Type=simple
User=dspace
Group=dspace
WorkingDirectory=/dspace-8-angular
Environment=NODE_ENV=production
Environment=NODE_OPTIONS=--max-old-space-size=4096
ExecStart=/usr/bin/node /dspace-8-angular/dist/server/main
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Ativação:

sudo systemctl daemon-reload
sudo systemctl enable --now dspace-ui

Validação:

systemctl is-active dspace-ui
sudo ss -lntp | grep 4000
curl -I --max-time 20 http://localhost:4000/ | head -n 5
curl -s --max-time 20 http://localhost:4000/ | grep -i "<title" | head

Resultado:

active
LISTEN 127.0.0.1:4000
HTTP/1.1 200 OK
<title>DSpace Repository :: Home</title>

Depois, após idioma e tema:

<title>Repositório DSpace :: Início</title>

12. Permissões runtime corrigidas na HML

12.1 Problema com bitstream/PDF

Ao tentar abrir PDF inicialmente, apareceu erro 500 no navegador.

O teste direto do bitstream depois mostrou que o arquivo existia:

curl -L --max-time 60 \
  "http://192.168.2.117/server/api/core/bitstreams/263840b4-422a-4dec-a9d2-83ab0b931faa/content" \
  -o /tmp/teste-bitstream.pdf

ls -lh /tmp/teste-bitstream.pdf
file /tmp/teste-bitstream.pdf
md5sum /tmp/teste-bitstream.pdf

Resultado:

PDF document, version 1.7, 134 page(s)
MD5: b6aec76beb73a7323bf4f0b615eb8aea

O checksum bateu com o informado pela API.

12.2 Problema de escrita no assetstore

A importação via interface gerou erro:

DSBitStoreService.put(...)
java.io.IOException: No such file or directory

Causa: o backend via Tomcat precisava escrever no assetstore, mas o Tomcat rodava como tomcat, enquanto o assetstore era dspace:dspace.

Correção adotada:

sudo usermod -aG dspace tomcat
sudo chown -R dspace:dspace /dspace/assetstore
sudo find /dspace/assetstore -type d -exec chmod 2770 {} \;
sudo find /dspace/assetstore -type f -exec chmod 660 {} \;
sudo systemctl restart tomcat

12.3 Problema de escrita em /dspace/imports

A importação depois falhou com:

Caused by: java.nio.file.AccessDeniedException: /dspace/imports

Correção aplicada:

sudo mkdir -p /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log
sudo chown -R dspace:dspace /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log
sudo chmod 2770 /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log
sudo usermod -aG dspace tomcat
sudo systemctl restart tomcat

Estado final validado:

uid=999(tomcat) gid=988(tomcat) groups=988(tomcat),110(dspace)

drwxr-xr-x /dspace
drwxrws--- /dspace/assetstore
drwxrws--- /dspace/exports
drwxrws--- /dspace/imports
drwxrws--- /dspace/log
drwxrws--- /dspace/temp
drwxrws--- /dspace/upload
drwxrws--- /dspace/var

13. Indexação Solr e OAI

13.1 Primeira indexação

Antes da indexação:

search: 0
oai: 0
statistics: 12

Comandos:

sudo -u dspace /dspace/bin/dspace index-discovery -b
sudo -u dspace /dspace/bin/dspace oai import

Resultado inicial:

search: 376
oai: 38
statistics: 12

13.2 Após importação

Depois de importação pela interface e nova indexação:

sudo -u dspace /dspace/bin/dspace index-discovery -b
sudo -u dspace /dspace/bin/dspace oai import

Resultado:

search: 377
oai: 39
statistics: 38

Validação:

curl -s "http://localhost:8983/solr/search/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/oai/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/statistics/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound

14. Importação via interface

14.1 Importação testada

Foi usada a interface:

/admin/batch-import

ZIP usado:

ProducoesAcademicasUERN_16_06_2026_08_01.zip

Parâmetros registrados em log:

--add
--zip ProducoesAcademicasUERN_16_06_2026_08_01.zip
-v true

14.2 Erros encontrados

Primeiro erro:

java.io.IOException: No such file or directory
DSBitStoreService.put(...)

Causa: escrita no assetstore.

Segundo erro:

AccessDeniedException: /dspace/imports

Causa: Tomcat sem permissão efetiva de escrita em /dspace/imports.

14.3 Correção

Modelo final:

tomcat no grupo dspace
runtime dirs com dspace:dspace e 2770
assetstore dirs 2770
assetstore files 660

14.4 Resultado final

Depois da correção:

  • importação funcionou;
  • item importado ficou visível na UI;
  • reindexação refletiu o item no Solr;
  • OAI subiu para 39.

15. Validação funcional final

15.1 Serviços

Comando:

systemctl is-active nginx tomcat solr dspace-ui

Resultado:

active
active
active
active

15.2 Backend

Comando:

curl -s --max-time 20 http://192.168.2.117/server/api | grep -E "dspaceUI|dspaceServer|dspaceVersion"

Resultado:

"dspaceUI" : "http://192.168.2.117"
"dspaceServer" : "http://192.168.2.117/server"
"dspaceVersion" : "DSpace 8.1"

15.3 Frontend

Comando:

curl -s --max-time 20 http://192.168.2.117/ | grep -iE "<html|<title" | head

Resultado:

<!DOCTYPE html><html data-critters-container="" lang="pt-BR"><head>
<title>Repositório DSpace :: Início</title>

15.4 Permissões

Comando:

id tomcat
sudo ls -ld /dspace /dspace/assetstore /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log

Resultado:

uid=999(tomcat) gid=988(tomcat) groups=988(tomcat),110(dspace)

drwxr-xr-x  /dspace
drwxrws---  /dspace/assetstore
drwxrws---  /dspace/exports
drwxrws---  /dspace/imports
drwxrws---  /dspace/log
drwxrws---  /dspace/temp
drwxrws---  /dspace/upload
drwxrws---  /dspace/var

15.5 Solr

Resultado final:

search:     377
oai:        39
statistics: 38

15.6 UI

Foram validados manualmente:

  • home;
  • busca;
  • visualização de item;
  • visualização de PDF/bitstream;
  • item importado pela interface.

16. Arquivo de evidência

Foi gerado log de validação na HML:

{
echo "===== DATA ====="
date

echo
echo "===== SERVIÇOS ====="
systemctl is-active nginx tomcat solr dspace-ui

echo
echo "===== URLS ====="
curl -s --max-time 20 http://192.168.2.117/server/api | grep -E "dspaceUI|dspaceServer|dspaceVersion"
curl -s --max-time 20 http://192.168.2.117/ | grep -iE "<html|<title" | head

echo
echo "===== PERMISSÕES ====="
id tomcat
sudo ls -ld /dspace /dspace/assetstore /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log

echo
echo "===== SOLR ====="
curl -s "http://localhost:8983/solr/search/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/oai/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/statistics/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
} | tee ~/validacao-hml-dspace-$(date +%F_%H%M%S).log

Resultado registrado:

Data: Tue Jun 16 11:20:22 UTC 2026

Serviços:
nginx: active
tomcat: active
solr: active
dspace-ui: active

Backend:
dspaceUI = http://192.168.2.117
dspaceServer = http://192.168.2.117/server
dspaceVersion = DSpace 8.1

Frontend:
lang = pt-BR
title = Repositório DSpace :: Início

Solr:
search numFound = 377
oai numFound = 39
statistics numFound = 38

17. Estado final da HML

A HML está funcional no fluxo básico:

[OK] Serviços ativos
[OK] Frontend acessível
[OK] Backend acessível
[OK] Tema RIUERN aplicado
[OK] Idioma pt-BR aplicado
[OK] Banco restaurado
[OK] Assetstore restaurado
[OK] Solr configurado
[OK] Solr reindexado
[OK] OAI reindexado
[OK] PDF/bitstream validado
[OK] Importação via interface funcionando
[OK] Item importado visível pela UI
[OK] Tomcat sem root
[OK] Permissões runtime ajustadas

18. Diferenças relevantes entre produção e HML

Produção

Tomcat/backend roda como root
Usuário tomcat inexistente
/dspace pertence a dspace:dspace
assetstore 750
imports 775

HML

Tomcat/backend roda como tomcat
tomcat pertence ao grupo dspace
/dspace pertence a dspace:dspace
assetstore 2770
imports 2770
runtime dirs 2770

Conclusão

A HML não replica o problema de segurança da produção. Ela mantém o backend com usuário dedicado e resolve escrita por grupo.

Esse modelo deve ser considerado como referência para futura correção da produção, mas somente com:

  • backup validado;
  • janela de manutenção;
  • plano de rollback;
  • testes de importação;
  • testes de bitstream;
  • testes de login;
  • testes de indexação.

19. Pendências

19.1 DNS e HTTPS

A HML ainda usa HTTP por IP:

http://192.168.2.117/

Por isso o navegador indica conexão não segura.

Para homologação ampla, o correto é:

https://nome-dns-interno/

Exemplo futuro:

https://repositorio-hml.uern.br/

ou domínio interno equivalente.

Será necessário:

  • DNS interno;
  • certificado TLS válido;
  • Nginx na porta 443;
  • ajuste de dspace.server.url;
  • ajuste de dspace.ui.url;
  • rebuild do frontend se a URL mudar.

19.2 Versionamento no repo de deploy

Devem ser versionados ou documentados:

  • configuração Nginx HML;
  • serviço tomcat.service;
  • serviço solr.service;
  • serviço dspace-ui.service;
  • permissões runtime;
  • config Solr;
  • config Angular HML, sem expor segredos;
  • checklist de reindexação;
  • checklist de validação.

19.3 Produção

Não alterar produção agora.

A produção roda Tomcat como root, o que é risco alto. A correção deve ser tratada como frente própria:

Frente futura: remover Tomcat root da produção

Essa frente exige:

  • snapshot/backup;
  • restauração testada;
  • janela de manutenção;
  • ajuste de permissões;
  • troca de usuário do serviço;
  • testes completos.

20. Comandos úteis para retomada

Ver serviços

systemctl is-active nginx tomcat solr dspace-ui

Ver API backend

curl -s --max-time 20 http://192.168.2.117/server/api | grep -E "dspaceUI|dspaceServer|dspaceVersion"

Ver frontend

curl -s --max-time 20 http://192.168.2.117/ | grep -iE "<html|<title" | head

Reindexar Discovery

sudo -u dspace /dspace/bin/dspace index-discovery -b

Reindexar OAI

sudo -u dspace /dspace/bin/dspace oai import

Ver contagens Solr

curl -s "http://localhost:8983/solr/search/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/oai/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound
curl -s "http://localhost:8983/solr/statistics/select?q=*:*&rows=0&wt=json" | python3 -m json.tool | grep numFound

Ver permissões principais

id tomcat
sudo ls -ld /dspace /dspace/assetstore /dspace/imports /dspace/exports /dspace/upload /dspace/temp /dspace/var /dspace/log

Ver log do DSpace

sudo tail -n 200 /dspace/log/dspace.log

Ver erros recentes

sudo tail -n 300 /dspace/log/dspace.log | grep -iE "ERROR|Exception|AccessDenied|No such file|Cannot create batch" -C 5

Ver log do Tomcat

sudo tail -n 200 /opt/tomcat/logs/catalina.out

Reiniciar frontend

sudo systemctl restart dspace-ui

Reiniciar backend

sudo systemctl restart tomcat

Reiniciar Solr

sudo systemctl restart solr

Recarregar Nginx

sudo nginx -t && sudo systemctl reload nginx

21. Checklist final de replicação

Para replicar novamente produção em HML, seguir esta ordem:

1. Inventariar produção.
2. Fazer backup de banco, assetstore e configs.
3. Restaurar banco em VM DB HML.
4. Restaurar assetstore em VM app HML.
5. Restaurar configs DSpace.
6. Ajustar local.cfg para IPs/URLs HML.
7. Instalar Java, Maven, Ant, Node, npm, Yarn.
8. Instalar Tomcat como usuário tomcat.
9. Instalar Solr como usuário solr.
10. Copiar/configurar cores Solr do DSpace.
11. Buildar backend.
12. Rodar ant update.
13. Copiar /dspace/webapps/server para /opt/tomcat/webapps/server.
14. Subir Tomcat.
15. Validar /server/api.
16. Configurar Angular config.yml.
17. Ativar tema RIUERN.
18. Ativar defaultLanguage pt-BR.
19. Buildar frontend com NODE_OPTIONS.
20. Copiar dist/config para /dspace-8-angular.
21. Criar serviço dspace-ui.
22. Configurar Nginx.
23. Ajustar permissões runtime.
24. Reindexar Discovery.
25. Reindexar OAI.
26. Testar busca.
27. Testar item.
28. Testar PDF.
29. Testar importação.
30. Reindexar após importação.
31. Registrar evidência final.

22. Conclusão

A replicação da produção para HML foi concluída com sucesso.

A HML está funcional e validada para:

  • navegação;
  • busca;
  • visualização de item;
  • visualização de PDF;
  • importação;
  • indexação;
  • OAI;
  • tema institucional;
  • idioma português brasileiro.

O ambiente HML está tecnicamente mais seguro que a produção no ponto do Tomcat, pois não executa o backend como root.

Antes de homologação ampla com usuários, ainda é necessário resolver DNS/HTTPS.

Ações

Exportar para PDF Atom