Guia de instalação do STSDATA NexaOrch
O pacote stsagent-bundle-<versão>.tar.gz contém a aplicação já compilada, em imagens de container
prontas, mais o script manage.sh, que cobre tanto uma instalação nova quanto a atualização de uma
existente. Não há código-fonte aqui dentro e nada é compilado no servidor.
O que vem no pacote
| Item | Para que serve |
|---|---|
images/ |
Imagens da UI e do Worker, carregadas pelo Podman |
manage.sh |
O instalador e atualizador — rode com sudo |
tools-bin/ |
Ferramentas de operação já compiladas (instalador, troca de conexão, migração de provider, redefinição de senha). Todas alcançáveis pelo manage.sh; você não precisa chamar os binários direto |
docker-compose.prod.yml, version.txt |
Definição dos containers e a versão deste pacote |
agent-windows/ |
O instalador do Automation Agent para Windows desta versão. O manage.sh o deixa em /opt/nexaorch/agent-windows/, e o administrador o copia de lá para o servidor Windows — nunca baixa por navegador. O procedimento está no manual do administrador, seção Workers |
Pré-requisitos
- Um servidor Linux de 64 bits com
bash,curl,rsynce Podman (podman+podman compose). O comando de instalação muda conforme a distribuição — veja a seção seguinte. - Distribuições cobertas por este guia: Debian e Ubuntu; RHEL, Fedora, Rocky Linux e AlmaLinux; SUSE Linux Enterprise e openSUSE.
- Não precisa de .NET no servidor — nem SDK, nem runtime. A aplicação roda dentro das imagens, e as ferramentas de operação são self-contained.
- Espaço em disco: o pacote tem cerca de 1,2 GB e a extração ocupa outro tanto. Reserve ~3 GB livres na pasta onde for extrair.
- O
manage.shprecisa de root: rode sempre comsudo. - 🛑 Um banco de dados já criado, com usuário e senha próprios — o instalador não cria banco nem usuário, e ler e gravar não basta: o NexaOrch aplica as migrations sozinho no primeiro start. Veja Banco de dados: o que preparar antes.
Banco de dados: o que preparar antes
🛑 O instalador não cria o banco, nem o usuário. Ele pede os dados de conexão de um banco que já existe. Se o banco também for rodar em container, suba-o à parte antes (por exemplo via Podman) e aponte o instalador para ele.
Antes de rodar o manage.sh install, prepare três coisas:
- o banco — no Oracle, o usuário/schema; no Firebird, o arquivo
.fdb; - um usuário dedicado ao NexaOrch, com senha;
- os privilégios desse usuário sobre esse banco.
Por que ler e gravar não basta
No primeiro start, e a cada atualização, o NexaOrch aplica as migrations sozinho. Não é opcional e não tem botão: é o passo que cria e evolui o esquema. Estas são as operações que ele executa, levantadas das migrations do próprio produto:
| operação | quando aparece |
|---|---|
CREATE TABLE, DROP TABLE |
criação do esquema e remoção de tabelas que saíram do produto |
ADD COLUMN, DROP COLUMN, ALTER COLUMN |
evolução do esquema entre versões |
RENAME TABLE, RENAME COLUMN |
renomeações |
CREATE INDEX, DROP INDEX |
índices |
ADD FOREIGN KEY, DROP FOREIGN KEY |
integridade referencial |
SELECT, INSERT, UPDATE, DELETE |
uso normal do produto |
⚠️ Um usuário só com SELECT/INSERT/UPDATE/DELETE instala e quebra no primeiro start. O erro vem
de dentro da migration e fala do objeto que ela tentou criar — não do privilégio que faltou.
O privilégio, por fornecedor
Substitua nexaorchdb e nexaorchusr pelos nomes que você vai usar. Execute como administrador do
banco, antes da instalação.
- PostgreSQL — o caminho mais simples é o usuário ser dono do banco:
CREATE DATABASE nexaorchdb OWNER nexaorchusr;(ou, se o banco já existe,ALTER DATABASE nexaorchdb OWNER TO nexaorchusr;). ⚠️ No PostgreSQL 15 ou mais novo isso deixou de ser detalhe: o schemapublicnão dá maisCREATEa todo usuário. Sem ser dono, o usuário conecta, lê — e falha ao criar a primeira tabela. - MySQL / MariaDB —
GRANT ALL PRIVILEGES ON nexaorchdb.* TO 'nexaorchusr'@'%';seguido deFLUSH PRIVILEGES;. ⚠️ A primeira migration executaALTER DATABASE … CHARACTER SET utf8mb4, que é privilégio sobre o banco, não sobre tabela. Um grant montado só com verbos de tabela passa na conexão e falha na primeira migration. - SQL Server — crie o login e o usuário no banco e dê
db_owner; se preferir separar,db_ddladmin+db_datareader+db_datawritercobrem as operações da tabela acima. - Oracle — não há “banco” para criar: cria-se o usuário/schema. Ele precisa de
CREATE SESSION,CREATE TABLEeCREATE SEQUENCE(as chaves primárias são colunas de identidade, que no Oracle nascem apoiadas numa sequence interna) — e de cota no tablespace:ALTER USER nexaorchusr QUOTA UNLIMITED ON users;. 🛑 Faltando a cota, a criação da primeira tabela falha comORA-01950mesmo com todos os privilégios acima concedidos. É o tropeço mais comum aqui. - Firebird — o banco é um arquivo. Crie o
.fdbconectando como o usuário do NexaOrch, para que ele fique dono do banco: quem não é dono nemSYSDBAconecta e lê, mas não altera metadados — e migration é alteração de metadado.
Confira antes de instalar, não durante
Teste a conexão do próprio servidor onde o NexaOrch vai rodar, com o cliente nativo do banco e com o mesmo usuário e senha que você vai informar ao instalador:
- PostgreSQL —
psql -h <host> -p 5432 -U nexaorchusr -d nexaorchdb -c "select 1" - MySQL / MariaDB —
mysql -h <host> -P 3306 -u nexaorchusr -p nexaorchdb -e "select 1" - SQL Server —
sqlcmd -S <host>,1433 -U nexaorchusr -P <senha> -d nexaorchdb -Q "select 1" - Oracle —
sqlplus nexaorchusr/<senha>@<host>:1521/<service-name> - Firebird —
isql-fb -u nexaorchusr -p <senha> <host>/3050:/caminho/nexaorchdb.fdb
⚠️ No Oracle, o campo “Banco de dados” do instalador é o service name, não um nome de catálogo como nos outros fornecedores. É o mesmo valor que vai depois da barra no comando acima.
💡 O teste acima prova credencial e alcance. Ele não prova privilégio de DDL — para isso,
CREATE TABLE teste_nexaorch (id INT); DROP TABLE teste_nexaorch; com o mesmo usuário responde em
dois comandos o que a migration só responderia no primeiro start.
💡 O instalador refaz esse teste de DDL sozinho, como sexta etapa da conferência de banco, e apaga a tabela em seguida. Fazê-lo aqui serve para descobrir antes, sem depender de chegar até lá com o assistente inteiro respondido.
Pré-requisitos por distribuição
Vá direto ao bloco da família da sua distribuição; não é preciso ler os outros. Cada bloco traz o comando de instalação, a verificação de que ficou pronto e o que confirmar antes de seguir.
⚠️ Faça a verificação antes de continuar. Um pré-requisito que falta em silêncio reaparece três passos adiante, com um erro que não menciona o passo que faltou.
Debian, Ubuntu e derivados
sudo apt update
sudo apt install podman podman-compose uidmap
Confirme que ficou pronto:
podman --version
podman compose version
command -v newuidmap newgidmap
- SELinux: não se aplica — esta família usa AppArmor.
- Rootless: o pacote
uidmaptraz onewuidmap/newgidmap, de que o Worker precisa para subir sem privilégio. Se ocommand -vacima não responder os dois caminhos, o container não sobe. - Firewall (
ufw): libere a porta pela qual a tela será acessada. Os padrões são 8081 (HTTPS) e 8080 (HTTP); se você escolher outras na instalação, libere as que escolheu — são portas do host, e podem ser mudadas.
RHEL, Fedora, Rocky Linux e AlmaLinux
Este bloco vale para a família inteira: se você está em Rocky Linux ou em AlmaLinux, é aqui.
sudo dnf install podman podman-compose shadow-utils
⚠️ Em RHEL, Rocky e Alma o podman-compose costuma não estar no repositório base. Se o
comando acima não o encontrar, habilite o EPEL e repita:
sudo dnf install epel-release
Confirme que ficou pronto:
podman --version
podman compose version
command -v newuidmap newgidmap
🛑 SELinux — confira antes de seguir. Só esta família vem com SELinux ativo por padrão:
getenforce
-
Enforcingé o esperado, e é o modo para o qual o produto está preparado: os volumes dos containers são montados com relabel automático. -
PermissiveouDisabledsignifica que o SELinux não está barrando nada. A instalação funciona — mas, se você está testando o produto, um resultado assim invalida a verificação do relabel: o teste passaria mesmo se houvesse defeito ali. -
Rootless: o
shadow-utilstraz onewuidmap/newgidmap. -
Firewall (
firewalld): libere a porta pela qual a tela será acessada. Os padrões são 8081 (HTTPS) e 8080 (HTTP); se você escolher outras na instalação, libere as que escolheu — são portas do host, e podem ser mudadas.
SUSE Linux Enterprise e openSUSE
sudo zypper install podman podman-compose shadow
Confirme que ficou pronto:
podman --version
podman compose version
command -v newuidmap newgidmap
- SELinux: não se aplica na configuração padrão — esta família usa AppArmor.
- Rootless: o pacote
shadowtraz onewuidmap/newgidmap. - Firewall (
firewalld): libere a porta pela qual a tela será acessada. Os padrões são 8081 (HTTPS) e 8080 (HTTP); se você escolher outras na instalação, libere as que escolheu — são portas do host, e podem ser mudadas.
O que este guia não faz. Ele diz o que o NexaOrch precisa que exista na máquina e como conferir que existe. Configurar o firewall, criar contas ou ajustar faixas de
subuid/subgida fundo é administração do servidor, e continua com quem cuida dele.
Instalação nova
Use este caminho se o servidor ainda não tem uma instalação do NexaOrch.
Extraia o pacote em qualquer pasta — não precisa ser o destino final, porque a instalação vai para
/opt/nexaorch:
⚠️ Servidor que já tem uma instalação anterior a esta versão continua com o nome antigo. Até esta versão, a conta de serviço, a pasta e os containers se chamavam
stsagent,/opt/stsagentestsagent_ui_1/stsagent_worker_1. Nada disso é renomeado: umupdatemantém os nomes que a instalação já tem, de propósito. Este guia usa os nomes NOVOS; se a sua instalação é anterior, troquenexaorchporstsagentnos caminhos. Para conferir sem adivinhar:sudo ./manage.sh runtime-names.
tar -xzf stsagent-bundle-<versão>.tar.gz
cd stsagent-bundle-<versão>
Rode o instalador:
sudo ./manage.sh install
O assistente pergunta tudo que falta para colocar o sistema no ar:
- Banco de dados — os dados de conexão de um banco já existente (host, porta, nome, usuário, senha). O assistente não sobe um banco novo por você: se quiser rodar o banco também em container, suba-o à parte (por exemplo via Podman) antes de rodar o instalador, e aponte para ele aqui.
- Conta de administrador — senha gerada automaticamente ou digitada. Não existe senha padrão: ou você a define aqui, ou o sistema a pede no primeiro acesso à tela (veja Primeiro acesso).
- Empresa, notificação por e-mail (SMTP), execução e integração com IA (Ollama) — as mesmas seções da tela Configurações, já gravadas no banco antes do primeiro login.
- Pastas do host — dados do Worker, downloads públicos, chaves SSH, transferência de arquivos e backups.
- Subir sozinho após reboot — opcionalmente, uma unit
systemd. Veja Subir sozinho depois de um reboot.
Ao final, dois containers (ui e worker) sobem via podman compose, todos isolados sob uma conta de
serviço dedicada — nexaorch por padrão, e não o usuário que rodou o comando.
Quando a instalação termina, não há nada para rodar depois: os containers já estão no ar e a
última linha da tela traz o endereço de acesso. Em especial, não chame podman compose à mão — no
servidor ele não funciona com o ambiente do seu usuário, pelo motivo que a seção Falar com o compose
sem o manage.sh, no fim deste guia, explica.
Certificado HTTPS
Este pacote não traz certificado. Numa instalação nova, o manage.sh gera um autoassinado no
próprio servidor, com senha aleatória: cada instalação fica com a sua chave, e nada secreto trafega
pela página de downloads, que é pública.
Ele serve para subir o sistema e conferir que tudo responde. Não serve como certificado de produção, e o navegador vai avisar. Para trocar por um certificado próprio, sem reinstalar:
sudo ./manage.sh set-certificate --pfx meu-certificado.pfx --password SENHA
sudo ./manage.sh set-certificate --crt meu.crt --key minha.key
sudo ./manage.sh set-certificate --self-signed --hosts 10.0.0.180,nexaorch.local
Reinstalando por cima: a senha do certificado que já existe
Numa reinstalação, o certificado que já está no servidor não é substituído: a instalação reaproveita o arquivo e a senha que estão lá, sem perguntar nada.
Ela só pergunta “Password for the existing certificate” quando a senha guardada no .env
não abre o arquivo — o caso de quem trocou o .pfx à mão sem atualizar o .env. Essa senha não foi
escolhida por você: é aleatória, gerada na instalação anterior, e fica no .env da instalação.
sudo grep HTTPS_CERT_PASSWORD /opt/nexaorch/.env
Se ninguém tiver essa senha, peça para trocar o certificado: a instalação gera um autoassinado novo ali mesmo, no servidor, com o IP e o nome desta máquina no campo SAN — arquivo e senha gravados juntos — e segue até o fim.
Se a instalação já estiver rodando, o mesmo se resolve sem reinstalar nada:
sudo /opt/nexaorch/manage.sh set-certificate --self-signed --hosts 10.0.0.180,nexaorch.local
Atualização
Use este caminho se o servidor já tem uma instalação rodando e você quer levá-la a esta versão.
Copie o pacote para o servidor e extraia:
tar -xzf stsagent-bundle-<versão>.tar.gz
cd stsagent-bundle-<versão>
Rode o update de dentro da pasta extraída — é dela que saem as imagens desta versão:
sudo ./manage.sh update
O update não refaz as perguntas de banco, SMTP, empresa, execução e Ollama, não toca nos
bancos já provisionados e preserva .env, certificado e as pastas de dados do Worker. Ele só carrega
as imagens novas e recria os containers. Migrations de banco pendentes rodam sozinhas no boot da UI.
Voltar à versão anterior
Antes de recriar os containers, o script marca as imagens em uso com a tag :previous. Se a versão
nova não subir corretamente:
sudo /opt/nexaorch/manage.sh rollback
Volta para as imagens anteriores, sem precisar do pacote antigo.
Subir sozinho depois de um reboot
A instalação oferece gravar uma unit systemd que sobe os containers no boot. Se você recusou na
hora e mudou de ideia, ou quer desligar depois, não precisa editar /etc/systemd/system à mão:
sudo /opt/nexaorch/manage.sh enable-boot
sudo /opt/nexaorch/manage.sh disable-boot
Por que isto importa mais do que parece. A unit grava quais serviços este host sobe. Sem essa informação ela faria
compose up -dpuro e subiria todos os serviços do arquivo — inclusive a UI num host que só deveria rodar o Worker, tomando portas que ali pertencem a outra coisa. O deploy sempre respeitou o recorte de serviços; era o boot que não respeitava, e o problema só aparecia depois de um reboot, longe da mudança que o causou.
Host só de Worker
Um servidor pode rodar apenas o Automation Agent, sem o Portal — é o arranjo comum quando a execução precisa acontecer perto de um banco ou de um compartilhamento de arquivos, e o Portal vive em outro lugar.
Esse recorte fica gravado no próprio host, em STS_SERVICES dentro do .env da instalação. Isso
é o que faz uma chamada manual (up, rollback, switch-connection) continuar sabendo que aquele
host não tem UI — antes, cada invocação manual voltava ao padrão “ui worker” e ia procurar uma imagem
que nunca foi enviada para lá.
Licença da instalação
O NexaOrch é licenciado por instalação. Não existe código por Automation Agent: o pacote licencia todos eles.
| Conceito | O que é |
|---|---|
| Licença da instalação | Um arquivo .lic que diz o que esta instalação comprou. Não se digita em lugar nenhum — é importado em Configurações → Licença |
| Agents incluídos | Quantos Automation Agents o pacote comprado inclui. Vem dentro do próprio .lic, assinado |
Como se obtém o arquivo .lic
O código desta instalação não é informado por você: o próprio NexaOrch o gera na primeira vez que
sobe, e o exibe em Configurações → Licença, num formato como LIC-FQCH-EGS0-J2GC-GSHQ.
Instalações criadas antes de agosto de 2026 exibem o mesmo código com o prefixo NEXA-, e continuam
assim para sempre — não há nada a atualizar. O prefixo faz parte do código: copie sempre o que a
tela mostra, inteiro. LIC-ABCD-… e NEXA-ABCD-… são instalações diferentes.
- Instale — nada é bloqueado sem licença.
- Abra Configurações → Licença e copie o código da instalação, com o prefixo.
- Informe esse código ao comprar ou renovar.
- Você recebe de volta um arquivo
.licamarrado a ele: é válido nesta instalação e em nenhuma outra. - Importe o arquivo na mesma tela. Não precisa reinstalar nem parar nada.
O manage.sh install não pergunta nada de licença. Instalar sem licença é o caminho normal —
é assim que funcionam avaliações, provas de conceito e laboratórios.
Os Agents se licenciam sozinhos
O .lic diz quantos Agents você comprou, e eles ocupam as vagas por ordem de chegada, sem nenhuma
configuração em cada servidor. Importou a licença, os Agents que já existem ficam conformes na hora.
Um Agent instalado depois pega uma vaga livre sozinho, no primeiro minuto em que subir.
Precisa de mais um Agent: não existe licença avulsa. Você compra a ampliação e recebe um .lic
novo desta mesma instalação, agora com mais Agents incluídos. Importe-o na mesma tela — comprar,
renovar e ampliar são o mesmo gesto.
Quando falta vaga: enquanto nenhuma licença tiver sido importada, nada acontece. Havendo licença, um Agent além do número incluído não pega trabalho novo; as execuções em andamento terminam normalmente e os demais Agents não são afetados. A validação é feita no próprio servidor — o NexaOrch nunca precisa de internet para conferir uma licença.
Avaliação e modo restrito
Uma instalação nova nasce com 15 dias de avaliação, com o produto completo: nada é amputado durante o trial, porque produto amputado não permite avaliar. O aviso na tela começa a partir do 10º dia.
| Situação | O que acontece |
|---|---|
| Trial correndo | Produto completo. Aviso na tela a partir do 10º dia |
| Trial vencido | Modo restrito a partir do 16º dia — o trial não tem tolerância |
| Licença vencida | 7 dias de tolerância antes do modo restrito |
| Sem licença nunca importada | Nada é bloqueado |
A tolerância de 7 dias existe por um motivo operacional: o NexaOrch roda carga noturna. Uma licença que expira à meia-noite com corte imediato significa carga que não roda, sem ninguém acordado para importar um arquivo — e o cliente descobre às 8h com o BI vazio, exatamente no dia em que estava renovando.
No modo restrito a escrita é negada e a interface fica em leitura. Processos, histórico e conexões continuam onde estão; importar a licença destrava na hora.
Instalações que já existiam antes do regime de trial não entram em avaliação: a data de criação nasce vazia nelas, e vazio significa “sem trial”, não “trial começando agora”. O regime vale para quem nasce nele.
Publicação: direta ou atrás de proxy reverso
O NexaOrch funciona dos dois jeitos, escolhido por configuração e trocável depois, sem reinstalar.
Modo direto (padrão)
O próprio sistema serve HTTPS, com o certificado em /opt/nexaorch/https/aspnetapp.pfx. O acesso é
por IP.
A instalação gera esse certificado já com o IP e o nome desta máquina no campo SAN — ou seja, o endereço confere. Mesmo assim o navegador avisa, porque ele é autoassinado: ninguém além do próprio servidor o reconhece como emissor. São coisas diferentes, e só a segunda sobra:
- Endereço errado → resolvido pela instalação, ou reemita com
--hosts - Emissor desconhecido → resolvido importando o certificado
Se o servidor mudar de IP ou de nome, reemita:
sudo /opt/nexaorch/manage.sh set-certificate --self-signed
sudo /opt/nexaorch/manage.sh set-certificate --self-signed --hosts 10.0.0.180,nexaorch.local
Como tirar o aviso do navegador
A instalação deixa o certificado público em /opt/nexaorch/https/aspnetapp.crt. Distribua esse
arquivo — ele não contém chave privada; não envie o .pfx — e importe-o como autoridade
confiável nas máquinas que acessam o sistema.
- Windows, máquina a máquina:
certlm.msc→ Autoridades de Certificação Raiz Confiáveis → Certificados → importar oaspnetapp.crt. - Windows, domínio inteiro (recomendado quando houver AD): Política de Grupo → Configuração do Computador → Políticas → Configurações do Windows → Configurações de Segurança → Políticas de Chave Pública → Autoridades de Certificação Raiz Confiáveis → Importar.
- Firefox usa o armazenamento próprio dele: Configurações → Privacidade e Segurança → Certificados → Ver certificados → Autoridades → Importar.
Se você tem uma CA corporativa, o caminho melhor é emitir por ela — as máquinas do domínio já confiam nessa CA, e não há nada a distribuir:
sudo /opt/nexaorch/manage.sh set-certificate --pfx /caminho/cert.pfx --password '<senha>'
sudo /opt/nexaorch/manage.sh set-certificate --crt /caminho/cert.crt --key /caminho/cert.key
Modo atrás de proxy reverso (recomendado quando há nome DNS)
Um nginx termina o TLS com um certificado emitido para o nome e encaminha HTTP para o NexaOrch. É o arranjo que elimina o aviso do navegador sem instalar nada nas máquinas dos usuários — certificado de CA pública só existe para nome, nunca para IP privado.
sudo /opt/nexaorch/manage.sh set-proxy-mode --proxy 10.0.0.5
sudo /opt/nexaorch/manage.sh set-proxy-mode --proxy 10.0.1.0/24
sudo /opt/nexaorch/manage.sh set-proxy-mode --proxy off
O IP informado é o do proxy. Sem ele o sistema ignora os cabeçalhos X-Forwarded-*, e o
resultado é laço de redirecionamento e login que nunca completa. Nesse modo o sistema passa a escutar
só HTTP na 8080.
O trecho entre o proxy e o sistema é em texto claro. Quando o nginx está em outro servidor, esse trecho atravessa a rede — e o cookie de autenticação vai nele. É o mesmo arranjo usado por Gitea, pgAdmin e a maioria das aplicações atrás de proxy, e é aceitável quando os dois estão na mesma rede confiável. Duas providências não são opcionais: libere a 8080 no firewall apenas para o IP do proxy, e mantenha proxy e sistema na mesma VLAN, nunca com a internet ou uma rede de visitantes no meio.
Exemplo de configuração — os três ajustes marcados são exigência deste sistema, não formalidade:
server {
listen 443 ssl;
server_name nexaorch.cliente.com.br;
ssl_certificate /etc/letsencrypt/live/nexaorch.cliente.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nexaorch.cliente.com.br/privkey.pem;
# o import de pacote aceita 11 MB; o default do nginx é 1 MB
client_max_body_size 12m;
location / {
proxy_pass http://10.0.0.180:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# sem esta linha: laço de redirecionamento
proxy_set_header X-Forwarded-Proto $scheme;
# sem esta linha (ou com um valor curto): "a tela travou" nas telas de prévia — veja abaixo
proxy_read_timeout 300s;
}
location /downloads/ {
proxy_pass http://10.0.0.180:8080;
# a página pública serve o pacote de ~1,2 GB
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
🛑 O timeout do proxy e as telas de prévia (a tela que “trava”)
O proxy_read_timeout do exemplo acima não é formalidade: quatro telas do sistema mandam o
servidor abrir uma conexão com um banco de dados de terceiros e ler dele antes de responder. Numa
tabela grande — muitas linhas e, principalmente, muitas colunas — isso passa fácil dos 60 segundos
que o nginx aceita esperar por padrão.
As rotas, pelo nome:
| botão, na tela | rota |
|---|---|
| Ler campos da origem (painel DataSync) | POST /SharedCommands/Edit?handler=TestSourceExtract |
| Pré-visualizar origem e destino do DataSync | POST /SharedCommands/Edit?handler=PreviewDataSyncSource e ...=PreviewDataSyncTarget |
Testar destino (prova CREATE/DROP numa tabela de sonda) |
POST /SharedCommands/Edit?handler=TestDestDdl |
| Testar de um comando ou etapa SQL | POST /SharedCommands/Edit?handler=TestCommandSql e POST /Jobs/Step/...?handler=TestStepSql |
⚠️ Não adianta criar um location para essas rotas. O ?handler= é query string, e o
location do nginx casa só o caminho — por isso o ajuste vai no location /, como no exemplo, e
vale para o sistema inteiro. Se você preferir separar, o recorte possível é por página
(/SharedCommands/Edit e /Jobs/Step), nunca por handler.
O que acontece sem o ajuste — e é isto que você precisa reconhecer depois. O nginx desiste antes de o sistema responder e devolve a página de erro 504 dele. A tela esperava JSON, recebe HTML, e o que aparece para o operador é algo como:
SyntaxError: Unexpected token '<', "<html> <h"... is not valid JSON
🛑 Nada nessa mensagem aponta para o proxy. Quem opera relata “a tela travou” ou “deu erro de
JavaScript”, e o problema é procurado no sistema, no banco, no navegador — nunca no nginx. Se você
está vendo esse erro só nas telas de prévia e só com tabelas grandes, o suspeito é este
parâmetro, e a confirmação está no error.log do nginx (upstream timed out).
300s é ponto de partida, não medida. Se a leitura da origem legitimamente demora mais que isso, o número sobe; se você prefere que o operador receba o erro rápido, ele desce — mas então a prévia de tabela grande deixa de funcionar, e essa é a escolha que está sendo feita.
⚠️ Instalação que já está no ar. A linha entrou neste guia depois de a maioria das instalações
existentes ser configurada — o arquivo que está rodando hoje pode não tê-la. Confira o
location / do seu server, acrescente a linha se faltar, e recarregue com nginx -t && systemctl reload nginx. Nada no sistema precisa ser reiniciado.
Primeiro acesso
Quando a instalação é feita pelo assistente (manage.sh install), a conta de administrador e os
dados da empresa já são gravados ali, e você entra direto na tela de login.
Uma base que não passou pelo assistente — por exemplo, ao apontar a aplicação para um banco novo
com switch-connection, ou ao restaurar um backup numa base limpa — abre no primeiro acesso: a
própria tela pede a senha do administrador (se ainda não houver nenhum) e, em seguida, os dados da
empresa. Ao final ela mostra o código desta instalação, que é o que você informa à STSDATA para
licenciar. O mesmo código fica sempre disponível em Configurações › Licença.
Preencher os dados da empresa é obrigatório: é esse passo que dá identidade à instalação.
Quando a conexão com o banco falha
Vale para todas as distribuições. Os blocos por família, mais abaixo, trazem só o que muda: firewall, SELinux e nome do serviço.
💡 Comece pelo que o instalador já respondeu
Se a falha aconteceu durante a instalação, não comece testando à mão: o instalador já fez o diagnóstico e já escreveu tudo. Ele confere o banco em seis etapas — o nome resolve, a porta aceita TCP, o servidor completa o protocolo, a credencial é aceita, a base é alcançável, e o usuário cria e apaga uma tabela:
[OK] host 'db.exemplo.local' resolves (10.0.0.7)
[OK] port 5432 accepts TCP
[FAILED] credentials accepted for user 'nexaorchusr'
no pg_hba.conf entry for host "10.0.0.7", user "nexaorchusr"
-> PostgreSQL refused this origin (pg_hba.conf), not the password. ...
[SKIPPED] database 'nexaorchdb' is reachable
- a etapa que reprova diz a causa e o que verificar; as seguintes saem como
[SKIPPED], e nunca em branco; - ele escreve um log em arquivo e imprime o caminho na tela, inclusive quando tudo passa. ⚠️ Esse log nunca contém a senha, nem o tamanho dela;
- 🛑 ele imprime como qual usuário do sistema operacional está conectando. O instalador roda como
a conta de serviço, não como quem digitou o comando — e com
peerouidentnopg_hba.confé esse o nome que o banco vê. É por isso que «testei no DBeaver e funciona» pode ser verdade enquanto o instalador falha.
Duas ações respondem sem mudar nada, e são o começo de qualquer conferência:
sudo ./manage.sh runtime-names # conta de serviço, pasta e prefixo dos containers desta máquina
sudo ./manage.sh pg-hba-path # onde está o pg_hba.conf (pergunta ao servidor primeiro)
O resto desta seção vale para o que o instalador não alcança: o que acontece depois que ele termina, e o teste manual, quando você quer separar «o banco recusa» de «o NexaOrch recusa».
🛑 O banco está “no mesmo servidor”? Então localhost não serve
O NexaOrch roda dentro de um container. Lá dentro, localhost é o próprio container — não o
servidor. Apontar a connection string para localhost com o banco instalado no host dá “conexão
recusada” mesmo com o banco no ar e a credencial certa, e é o engano mais comum desta instalação.
Use, no lugar de localhost:
host.containers.internal, nas versões de Podman que a publicam; ou- o IP do servidor na rede (o mesmo que você usaria de outra máquina).
💡 Confirme com sudo ./manage.sh logs ui --lines 50 logo depois de subir: o erro de conexão
aparece ali, com o host que ele realmente tentou.
Os quatro desfechos, e o que cada um quer dizer
Teste do servidor, com o cliente nativo (comandos na seção Banco de dados: o que preparar antes). O que voltar diz onde está o problema:
| o que acontece | o que é | onde mexer |
|---|---|---|
| o nome não resolve | DNS ou /etc/hosts |
use o IP para confirmar |
| conexão recusada, ou fica pendurado até o timeout | porta fechada, serviço parado, ou o localhost de cima |
firewall e serviço — veja o bloco da sua distribuição |
| autenticação falha | usuário, senha, ou o host de origem não é aceito | no MySQL, o 'usuario'@'host' do grant; no PostgreSQL, o pg_hba.conf |
| conecta, mas a instalação falha depois | credencial certa e privilégio faltando | a seção de privilégios acima |
⚠️ O quarto é o que não parece problema de conexão. A conexão funcionou; o que faltou foi
CREATE TABLE. Se o teste de conexão passa e a instalação quebra em seguida, comece por ali.
💡 Onde fica o pg_hba.conf — pergunte ao servidor, não à distribuição
O caminho muda por família, e a lista envelhece. O próprio PostgreSQL responde:
sudo -u postgres psql -tAc 'SHOW hba_file'
Os caminhos por família, para quando o servidor não estiver no ar:
| família | onde o pg_hba.conf costuma estar |
|---|---|
| Debian, Ubuntu | /etc/postgresql/<versão>/main/pg_hba.conf |
| RHEL, Fedora, Rocky, Alma | /var/lib/pgsql/data/pg_hba.conf |
| SUSE, openSUSE | /var/lib/pgsql/data/pg_hba.conf |
💡 O instalador tenta abrir esse arquivo sozinho para a rede do Podman, e diz na tela o que fez. Se
ele não achar o arquivo, avisa em vez de ficar calado — e sudo ./manage.sh pg-hba-path mostra
onde ele procurou.
Debian, Ubuntu e derivados
- Firewall:
sudo ufw status. Se estiver ativo, libere a porta do banco para o servidor — por exemplosudo ufw allow from <ip-do-servidor> to any port 5432 proto tcp. - Serviço do banco, quando é local:
systemctl status postgresql(oumysql,mariadb,firebird). - PostgreSQL local: por padrão ele escuta só em
localhost. Para aceitar o container, ajustelisten_addressesnopostgresql.confe acrescente a linha correspondente nopg_hba.conf.
RHEL, Fedora, Rocky Linux e AlmaLinux
- Firewall:
sudo firewall-cmd --list-all. Para liberar:sudo firewall-cmd --add-port=5432/tcp --permanent && sudo firewall-cmd --reload. - SELinux: com o SELinux em
enforcing, a saída de um container para um serviço do host pode ser negada. Confira comgetsebool -a | grep container_connecte vejasudo ausearch -m avc -ts recentdepois de uma tentativa — umdeniedali aponta o caminho. - Serviço do banco, quando é local:
systemctl status postgresql(oumariadb).
SUSE Linux Enterprise e openSUSE
- Firewall:
sudo firewall-cmd --list-all— o SUSE usafirewalldnas versões atuais. Mesmos comandos do bloco anterior. - SELinux/AppArmor: o SUSE usa AppArmor por padrão; se ele estiver ativo para o Podman,
sudo aa-statusmostra os perfis em modoenforce. - Serviço do banco, quando é local:
systemctl status postgresql(oumariadb).
Se nada acima explicar
Junte estas saídas antes de abrir chamado — elas respondem, juntas, quase toda pergunta que o suporte faria:
sudo ./manage.sh version
sudo ./manage.sh logs ui --lines 200
⚠️ Não cole a saída de comandos do podman rodados à mão: o compose ecoa a linha inteira do
podman run, com a senha do banco e a do certificado em texto claro. O manage.sh filtra;
comando solto, não.
Perdeu a senha de administrador
O sistema não tem “esqueci minha senha”, e não há como criar um administrador novo num banco que já tem usuários. Se o único administrador perde a senha — ou fica travado por tentativas erradas — o caminho de volta é este comando, no próprio servidor:
sudo /opt/nexaorch/manage.sh reset-password --list
sudo /opt/nexaorch/manage.sh reset-password --user admin
sudo /opt/nexaorch/manage.sh reset-password --user admin --password 'NovaSenha@2026'
| Forma | O que faz |
|---|---|
--list |
Lista os usuários, com papéis e quem está travado |
--user <nome> |
Sem --password, apenas mostra a situação: nada é alterado |
--user + --password |
Redefine a senha e destrava a conta |
A senha nova precisa ter no mínimo 10 caracteres e ao menos um que não seja letra nem número — a mesma regra da tela de usuários. Se não passar, o comando recusa e não altera nada.
Omitindo --password o comando pergunta no terminal, sem mostrar o que você digita. Prefira essa
forma: o que vai na linha de comando fica visível para os outros usuários da máquina, via ps.
Ao redefinir, as sessões abertas daquele usuário caem. Um usuário inativo continua sem conseguir entrar mesmo com a senha nova — reative-o pela tela de usuários. Um usuário na Lixeira precisa ser restaurado primeiro; o comando avisa quando é esse o caso.
Outros comandos
sudo /opt/nexaorch/manage.sh version # versão instalada e estado dos containers
sudo /opt/nexaorch/manage.sh logs ui # log do container da UI
sudo /opt/nexaorch/manage.sh logs worker # log do container do Worker
sudo /opt/nexaorch/manage.sh up # (re)sobe os containers já carregados
sudo /opt/nexaorch/manage.sh down # PARA a instalação (não desinstala)
sudo /opt/nexaorch/manage.sh down worker # para só o Worker (a UI continua no ar)
Parar a instalação
sudo /opt/nexaorch/manage.sh down # para tudo
sudo /opt/nexaorch/manage.sh down worker # para só o Worker
sudo /opt/nexaorch/manage.sh down ui # para só a UI
down para; não desinstala. Nenhum volume e nenhum dado são removidos — para remover a
instalação existe o uninstall. No fim, o comando lista o que ficou de pé.
Quando o boot automático está ligado, um down sem argumento para pela unit do systemd, e não
por fora dela: assim o systemd não fica achando que a aplicação continua no ar. Parar só um serviço
não mexe na unit — depois de um reboot ele sobe de novo (use disable-boot se não for isso que você
quer).
Falar com o compose sem o manage.sh
Se precisar chamar o podman compose direto, ele não funciona com o ambiente do seu usuário:
este servidor tem o plugin compose do Docker instalado, e o comando tenta um socket que a conta de
serviço não expõe, falhando com failed to connect to the docker API at unix:///run/user/<uid>/podman/podman.sock. A invocação correta é:
sudo -u nexaorch env \
XDG_RUNTIME_DIR=/run/user/$(id -u nexaorch) \
HOME=/opt/nexaorch \
PODMAN_COMPOSE_PROVIDER=podman-compose \
podman compose -p nexaorch -f /opt/nexaorch/docker-compose.prod.yml ps
O manage.sh já faz exatamente isso internamente — prefira ele sempre que houver um comando pronto.
Trocar o banco de lugar
sudo /opt/nexaorch/manage.sh switch-connection --provider <P> --connection '<string>'
Aponta a instalação para outro banco. Não migra dado nenhum — use quando o banco continua sendo o mesmo, mas mudou de IP, porta ou senha.
Migrar para outro fornecedor de banco
sudo /opt/nexaorch/manage.sh migrate-provider
Copia os dados desta instalação para outro banco (por exemplo, Firebird → PostgreSQL). Interativo: pergunta origem e destino, e a origem só é lida, nunca alterada.
Para os containers antes de copiar e os deixa parados ao final — com o Automation Agent no ar a origem seria alvo móvel, e uma execução que comece depois da cópia da tabela dela não chegaria ao destino.
Não reaponta a instalação. Ao terminar, rode o switch-connection para passar a usar o banco
novo, ou up para voltar ao de hoje.
Remover a instalação
sudo /opt/nexaorch/manage.sh uninstall
Remove esta instalação: containers, imagens, a rede e a conta de serviço, nessa ordem — invertê-la trava a máquina. E pergunta antes de remover pasta de dados que esteja fora do diretório de instalação.
🛑 O banco de dados NÃO é tocado. Nada em
uninstallapaga dados: as definições de Job, o histórico de execuções, as conexões, as credenciais cifradas e os usuários continuam onde estão. O próprio comando avisa isso na tela, antes de pedir confirmação.É o comportamento desejado na maioria dos casos — reinstalar por cima reencontra tudo. Se você quer mesmo descartar os dados, isso é um passo à parte, no fim deste guia: Remover também o banco de dados.
Ajuste os caminhos se STS_INSTALL_DIR foi customizado na instalação original.
Remover também o banco de dados
Esta seção está fora da sequência de instalação de propósito, e nada aqui é necessário para
remover o produto: o uninstall já resolveu isso e não tocou no banco. Leia esta parte apenas se
a decisão for descartar os dados.
🛑 Não há volta
Apagar o banco é a ação mais destrutiva ligada a este produto. Não existe desfazer, e não existe lixeira. O que se perde:
- as definições de Job e suas etapas — todo o trabalho de quem montou as automações;
- o histórico de execuções, com logs e estatísticas;
- as conexões e as credenciais cifradas;
- os usuários, papéis e permissões;
- a licença importada e a identidade desta instalação.
⚠️ Um detalhe que costuma pegar: o usuário que a aplicação usa normalmente não tem permissão para criar banco. Quem apaga geralmente não consegue recriar sozinho — vai precisar de alguém com privilégio de administração no servidor de banco. Confirme isso antes, não depois.
O comando, por fornecedor
Os comandos abaixo estão em texto, e não em bloco de código, de propósito: eles não devem ser
copiados de enfiada, junto com os comandos de instalação. Digite o seu, substituindo
<nome-do-banco> pelo nome real — que está em DEFAULT_CONNECTION_STRING, no arquivo .env da
instalação, antes de você remover a instalação.
- MySQL / MariaDB — conecte com
mysql -u <admin> -pe execute:DROP DATABASE <nome-do-banco>; - PostgreSQL — conecte com
psql -U <admin>e execute:DROP DATABASE <nome-do-banco>; - SQL Server — conecte com
sqlcmd -S <host> -U <admin>e execute:DROP DATABASE <nome-do-banco>; - Oracle — não se apaga um “banco”: remove-se o usuário/schema, com
DROP USER <usuario> CASCADE;executado por alguém com privilégio de DBA. - Firebird — não há
DROP DATABASEremoto: o banco é um arquivo. Pare o serviço e apague o.fdbindicado na connection string (por padrão/opt/firebird/data/nexaorchdb.fdb).
⚠️ Antes de qualquer um deles, um backup resolve o arrependimento que o DROP não resolve.