Duesoft Sistemas

Roteiro de Implantação — DSBoards

Passo a passo para colocar um novo cliente no ar

Para quem é este documento: o funcionário da Duesoft responsável por implantar o DSBoards num cliente novo. Siga os passos na ordem. Ao final, o app do cliente mostra os dados automaticamente (o sincronizador roda a cada ~15 minutos).
Etapas
  1. Como funciona (visão rápida)
  2. Cadastrar o cliente no painel
  3. Gerar o túnel WireGuard
  4. Instalar o túnel no servidor do cliente
  5. Criar o usuário de leitura dsboards_ro (SQL)
  6. Liberar o acesso no pg_hba.conf
  7. Preencher a conexão no cadastro
  8. Criar o usuário do app (convite por e-mail)
  9. Verificar
  10. Solução de problemas (app zerado)

0Como funciona (visão rápida)

O ERP de cada cliente fica na rede do cliente. Um túnel WireGuard liga o servidor do cliente ao nosso servidor (o hub, IP 10.8.0.1). Pelo túnel, o sincronizador lê o banco do cliente (com um usuário somente leitura) e copia os dados para a nuvem. O app do cliente lê da nuvem — nunca direto do ERP.

Cada cliente recebe um IP próprio dentro do túnel, sempre na faixa 10.8.0.x.

1Cadastrar o cliente no painel

No painel administrativo → aba Clientes → Novo cliente. Preencha o nome/identificação. Os dados de conexão (host, banco, usuário, senha) serão preenchidos no passo 6, depois que o túnel e o usuário do ERP existirem.

2Gerar o túnel WireGuard

No detalhe do cliente, clique em “Gerar túnel WireGuard”. O painel cria a configuração, registra o cliente no hub e mostra o arquivo .conf para baixar. Anote o IP do túnel gerado (algo como 10.8.0.10).

⚠️ Não regere o túnel depois de instalar Cada clique em “Gerar/Regenerar” cria chaves novas. Se você regerar depois de já ter instalado o .conf no cliente, as chaves dos dois lados deixam de bater e o túnel para de fechar handshake. Gere uma vez, instale esse arquivo, e pronto. Só regere se for reinstalar do zero — e aí reinstale o .conf novo no cliente.

3Instalar o túnel no servidor do cliente

No servidor do cliente (onde roda o Postgres do ERP), instale o WireGuard, importe o .conf gerado no painel, ative o túnel e confirme o handshake. Siga o bloco do sistema operacional do servidor.

⚠️ Confira o Address do .conf Dentro do arquivo, na seção [Interface], o Address tem que ser o IP do túnel na faixa 10.8.0.x (ex.: Address = 10.8.0.10/32). Nunca deve ser o IP da rede local do cliente (tipo 10.0.0.10 ou 192.168.x.x).

🐧 Servidor Linux

💡 Antes de tudo: descubra a versão do Linux Isso decide o caminho a seguir. Rode no servidor do cliente:
cat /etc/os-release     # distribuição + versão
uname -r                # versão do kernel
⚡ Jeito mais fácil: instalador pronto (direto da VPS) Para servidores com kernel 5.x ou mais novo (NÃO serve para CentOS 7), há um instalador que faz tudo (instala o WireGuard, sobe o túnel como serviço e encaminha a porta do Postgres do ERP). Baixe-o direto na máquina do cliente e rode com o .conf gerado no painel:
# baixar o instalador direto da VPS
curl -fsSLO https://apidsboards.duesoft.com.br/client-setup-linux.sh

# ERP na MESMA máquina (padrão 127.0.0.1:5434):
sudo bash client-setup-linux.sh --conf SEU_CLIENTE.client.conf

# ERP em outra máquina/porta da rede local:
sudo bash client-setup-linux.sh --conf SEU_CLIENTE.client.conf --erp-host 192.168.0.4 --erp-port 5434
Se preferir (ou para entender o que ele faz), os passos manuais estão logo abaixo.

Instale o WireGuard (conforme a distribuição):

# Debian / Ubuntu
sudo apt update && sudo apt install -y wireguard

# RHEL / AlmaLinux / Rocky / Fedora / CentOS
sudo dnf install -y wireguard-tools

Copie o .conf como wg0.conf, suba o túnel (e deixe subir no boot) e confirme:

sudo cp cliente.conf /etc/wireguard/wg0.conf
sudo systemctl enable --now wg-quick@wg0
sudo wg show            # tem que aparecer "latest handshake: ..." recente
💡 CentOS 7 / RHEL 7 (ou kernel antigo, sem WireGuard no kernel) Em sistemas antigos o kernel não traz o WireGuard e o pacote kmod-wireguard pode não existir (os repositórios do CentOS 7 estão fora do ar — EOL). Sintomas: modprobe wireguard → "Module wireguard not found", ou o wg-quick up falha com "Operation not supported / Protocol not supported". Solução: WireGuard em modo usuário (wireguard-go) — não usa módulo de kernel; o wg-quick cai sozinho nele quando acha o binário no PATH.

Passo a passo (CentOS 7 / RHEL 7), como root:

# 1) ferramentas do WireGuard (via EPEL)
yum install -y epel-release
yum install -y wireguard-tools

# 2) instalar o Go (baixado direto do site — não depende de repositório)
cd /tmp
curl -LO https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz

# 3) compilar o wireguard-go (espelho no GitHub) e pôr no PATH
cd /tmp
curl -L -o wg-go.tar.gz https://github.com/WireGuard/wireguard-go/archive/refs/heads/master.tar.gz
tar xzf wg-go.tar.gz
cd wireguard-go-*/
/usr/local/go/bin/go build -o /usr/bin/wireguard-go

# 4) instalar o .conf e subir (cai sozinho no modo usuário)
cp cliente.conf /etc/wireguard/wg0.conf
chmod 600 /etc/wireguard/wg0.conf
systemctl enable --now wg-quick@wg0
wg show          # tem que aparecer "latest handshake: ..." recente
💡 Observações do modo usuário (CentOS 7)

🪟 Servidor Windows

  1. Baixe e instale o WireGuard oficial: wireguard.com/install (instalador .msi).
  2. Abra o WireGuard → “Import tunnel(s) from file” / “Importar túnel de arquivo” → selecione o .conf gerado no painel. (Dica: dê ao arquivo um nome simples, sem espaços — ex.: cliente.conf.)
  3. Com o túnel selecionado, clique em “Activate” / “Ativar”.
  4. Ao ativar, o WireGuard registra o túnel como serviço do Windows, que sobe sozinho no boot — não precisa configurar mais nada para persistir.
  5. Confirme na própria janela: Status: Active e um “Latest handshake” recente.
💡 Sem handshake? (Linux ou Windows) Se ficar em latest handshake: (none), quase sempre é o firewall do cliente bloqueando a saída UDP na porta 51820 até o IP público do hub. Libere a saída UDP e confirme que o Endpoint no .conf aponta para o nosso servidor.
💡 Windows + firewall do Postgres No Windows, além do túnel, o Firewall do Windows precisa permitir a conexão de entrada TCP na porta do Postgres (padrão 5434) vinda da rede do túnel (10.8.0.0/16). Sem isso, o túnel sobe mas a nuvem não consegue ler o banco. Veja também os passos 5 e 6.

4Criar o usuário de leitura dsboards_ro (SQL)

No Postgres do ERP do cliente (não na nuvem!), crie um usuário somente leitura. Conecte como superusuário (ex.: postgres) e, importante, no próprio banco do ERP (o mesmo do campo Banco do cadastro) — não no banco postgres.

💡 Vire root uma vez só com sudo -i Para não repetir sudo em cada comando, abra uma sessão de root no início e trabalhe nela:
sudo -i        # pede a senha uma vez; o prompt passa a terminar em "#"
Daí em diante, onde o roteiro mostrar sudo -u postgres ... você pode usar só -u postgres (ex.: su - postgres para abrir o psql). Ao terminar, saia com exit.

No terminal do servidor, abra o psql já conectado ao banco do ERP, na porta padrão 5434 (troque <banco> pelo nome do banco do ERP):

sudo -u postgres psql -p 5434 -d <banco>

Prefere pgAdmin? Conecte como postgres no banco do ERP (porta 5434) e rode o SQL abaixo numa aba de query.

Comece sempre com a sessão limpa e confira onde está (evita o erro permission denied por sessão presa ou banco errado):

RESET ROLE;                   -- desfaz qualquer SET ROLE anterior
SELECT current_database();    -- precisa ser o BANCO DO ERP, não "postgres"
SHOW is_superuser;            -- precisa ser "on"

Confirmado isso, crie o usuário e as permissões (troque <banco> pelo nome do banco do ERP e defina uma senha forte):

-- Usuário de leitura do DSBoards
CREATE USER dsboards_ro WITH PASSWORD 'TROQUE_POR_UMA_SENHA_FORTE';

-- Só pode ler, nunca gravar (trava extra de segurança)
ALTER ROLE dsboards_ro SET default_transaction_read_only = on;

-- Permissões de leitura no banco do ERP
GRANT CONNECT ON DATABASE <banco> TO dsboards_ro;
GRANT USAGE ON SCHEMA public TO dsboards_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO dsboards_ro;

-- Garante leitura também nas tabelas criadas no futuro
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO dsboards_ro;
⚠️ Três detalhes que fazem o GRANT falhar
💡 Se o ERP usar outro schema Se as tabelas do ERP não estiverem no schema public, repita os comandos GRANT USAGE, GRANT SELECT ... IN SCHEMA e ALTER DEFAULT PRIVILEGES para o schema correto.

5Liberar o acesso no pg_hba.conf

Criar o usuário não basta: o Postgres também precisa autorizar a origem da conexão. O sincronizador chega pelo túnel com o IP de origem 10.8.0.1 (o hub).

Primeiro, descubra onde está o pg_hba.conf em uso. Pergunte ao próprio Postgres, forçando a porta 5434 (padrão Duesoft) — assim você acerta a instância do ERP e não outra que exista no servidor:

sudo -u postgres psql -p 5434 -c "SHOW hba_file;"

Se o psql não conectar, procure no disco: sudo find / -name pg_hba.conf 2>/dev/null

Abra exatamente esse arquivo num editor de texto. O caminho costuma ser algo como /var/lib/pgsql/data/pg_hba.conf ou /etc/postgresql/<versão>/main/pg_hba.conf — use o que o SHOW hba_file; retornou. Com o nano (mais simples):

sudo nano /caminho/do/pg_hba.conf

No nano: role até perto das outras linhas host, cole a linha abaixo, salve com Ctrl+O e Enter, e saia com Ctrl+X. Prefere o vi/vim? sudo vi /caminho/do/pg_hba.conf (aperte i para editar, Esc e :wq para salvar e sair).

💡 Não tem editor instalado? Se nano não existir (command not found), instale conforme a distribuição:
# Debian / Ubuntu
sudo apt-get update && sudo apt-get install -y nano

# CentOS 7 / RHEL 7 (yum)
sudo yum install -y nano

# RHEL 8+ / Rocky / Alma / Fedora (dnf)
sudo dnf install -y nano
O vi já vem na maioria dos servidores Linux, então ele é a alternativa caso não dê para instalar o nano.

Adicione esta linha antes das regras genéricas:

# DSBoards — leitura pela nuvem via WireGuard
host    <banco>    dsboards_ro    10.8.0.1/32    scram-sha-256

Depois, recarregue a configuração (não precisa reiniciar) — também na porta 5434:

sudo -u postgres psql -p 5434 -c "SELECT pg_reload_conf();"
⚠️ Libere o HUB, não o seu PC Se você testar com o pgAdmin do seu computador, a origem é o IP do seu PC — e uma regra só para ele não faz o sync funcionar. O que importa é liberar a origem 10.8.0.1 (o hub). Pode usar 10.8.0.0/16 para cobrir o hub inteiro.
💡 Postgres escutando no túnel O Postgres do cliente precisa aceitar conexões pela interface do túnel. Em postgresql.conf, garanta listen_addresses = '*' (ou inclua o IP do túnel) e a porta padrão port = 5434. Atenção: mudar listen_addresses ou port exige reiniciar o serviço (sudo systemctl restart postgresql), não só recarregar.

6Preencher a conexão no cadastro

Volte ao painel → cliente → e preencha os dados de conexão:

CampoValor
Host / ServidorO IP do túnel do cliente, ex.: 10.8.0.10
Porta5434 (padrão Duesoft)
BancoNome do banco do ERP (nome_banco)
Usuáriodsboards_ro
SenhaA senha definida no passo 4
⚠️ O erro mais comum: host errado O Host tem que ser o IP do túnel (10.8.0.x) — nunca o IP da rede local do ERP (10.0.0.x / 192.168.x.x). O IP da LAN não passa pelo túnel: a nuvem tentaria alcançá-lo pela internet e falharia, deixando o app zerado.
💡 Exceção: cliente com VÁRIAS LOJAS/BANCOS no MESMO servidor Cada loja/banco é um cliente (tenant) separado no painel — mas o IP do túnel identifica o SERVIDOR, não o banco. Então, se as lojas estão no mesmo servidor, elas compartilham o mesmo IP e um único túnel; a diferença entre elas é só o Banco.

7Criar o usuário do app (convite por e-mail)

No detalhe do cliente → Novo usuário. Marque “Enviar convite por e-mail” e informe o e-mail do usuário. O sistema envia, para o próprio usuário: a chave de ativação, o login e um link para ele criar a própria senha no primeiro acesso — você não precisa definir senha. Se o cliente ainda não tiver uma chave ativa, o convite gera uma automaticamente.

8Verificar

  1. Confirme no servidor do cliente: sudo wg show mostra handshake recente.
  2. O sincronizador roda a cada ~15 minutos. Na primeira vez para um cliente novo, ele faz o carregamento completo (cadastros + movimentação).
  3. Peça ao cliente para abrir/reabrir o app — os dados devem aparecer.
✔ Pronto Com o túnel no ar, o dsboards_ro criado, o pg_hba liberando 10.8.0.1 e o host do cadastro apontando para o IP do túnel, o cliente entra em produção sozinho no próximo ciclo do sync.

9Solução de problemas (app zerado)

O cliente entra no app e vê os menus, mas sem dados? A ativação está OK — o problema é a sincronização não estar alcançando o ERP. Confira, nesta ordem:

SintomaCausa provávelO que fazer
App abre, tudo zerado Host do cadastro é o IP da LAN (10.0.0.x) Trocar o Host para o IP do túnel (10.8.0.x) — passo 6
wg show sem handshake Túnel do cliente não conectou (firewall UDP 51820 / chaves desalinhadas) Liberar UDP de saída; reinstalar o .conf mais recente — passo 3
no pg_hba.conf entry Origem 10.8.0.1 não liberada Adicionar a linha do hub e recarregar — passo 5
password authentication failed Senha do dsboards_ro diferente da do cadastro Acertar a senha nos dois lados
role dsboards_ro does not exist Usuário não criado (ou em outro banco) Rodar o SQL no banco correto — passo 4
permission denied for table … (no GRANT ou no sync) GRANTs não aplicados: rodados no banco postgres, como dsboards_ro, ou com uma sessão “presa” em SET ROLE Rodar os GRANT do passo 4 no banco do ERP, como postgres (ou o dono das tabelas), em sessão limpa (RESET ROLE / nova aba de query)
invalid input syntax for type integer: "" O ERP tem string vazia em uma coluna que na nuvem é numérica Já tratado pelo sincronizador (converte ""→nulo). Se aparecer em cliente novo, avisar a equipe de desenvolvimento
💡 Teste rápido de rede (feito pela equipe de infra) Do nosso servidor (hub), ping 10.8.0.x e um teste na porta 5434 do IP do túnel confirmam se o caminho está aberto. Se o ping responde e a porta abre, o sync vai conseguir ler — falta só o host do cadastro estar certo.
Duesoft Sistemas · DSBoards — Roteiro de Implantação · uso interno