- Como funciona (visão rápida)
- Cadastrar o cliente no painel
- Gerar o túnel WireGuard
- Instalar o túnel no servidor do cliente
- Criar o usuário de leitura
dsboards_ro(SQL) - Liberar o acesso no
pg_hba.conf - Preencher a conexão no cadastro
- Criar o usuário do app (convite por e-mail)
- Verificar
- 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).
.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.
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
cat /etc/os-release # distribuição + versão
uname -r # versão do kernel
- Kernel 5.x ou mais novo (Debian/Ubuntu atuais, AlmaLinux/Rocky/RHEL 8+) → siga os passos normais abaixo (WireGuard do kernel).
- CentOS 7 / RHEL 7 (kernel
3.10.x) → o kernel não tem WireGuard; pule para o bloco "CentOS 7 / RHEL 7" mais abaixo (modo usuário comwireguard-go).
.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
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
- A mensagem "Missing WireGuard kernel module. Falling back to slow userspace implementation." é esperada e OK.
- Arquitetura: os comandos são para x86_64 (confira com
uname -m); se for outra (ex.: aarch64), troque a URL do Go. - Ao colar o
.conf, garanta uma configuração por linha — ex.:EndpointePersistentKeepalivenão podem ficar na mesma linha (senão dá "Servname not supported"). - Se o
yumreclamar de mirror (CentOS 7 EOL), aponte os repositórios para ovault.centos.org. - Se o
systemctl starttravar, é porque owg0já estava no ar:wg-quick down wg0e suba de novo.
🪟 Servidor Windows
- Baixe e instale o WireGuard oficial: wireguard.com/install (instalador
.msi). - Abra o WireGuard → “Import tunnel(s) from file” / “Importar túnel de arquivo” →
selecione o
.confgerado no painel. (Dica: dê ao arquivo um nome simples, sem espaços — ex.:cliente.conf.) - Com o túnel selecionado, clique em “Activate” / “Ativar”.
- 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.
- Confirme na própria janela: Status: Active e um “Latest handshake” recente.
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.
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.
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;
- Banco certo: conecte no banco do ERP (o mesmo do campo Banco do cadastro),
não no banco
postgres. GRANT só vale dentro do banco onde é rodado. - Como
postgres(ou dono das tabelas): rodar comodsboards_ronão funciona — ele não é dono de nada. Se o própriopostgresder permission denied, confira que a sessão não está presa emSET ROLE(rodeRESET ROLE;ou abra uma nova aba de query). - Confirme:
SELECT current_database();deve ser o banco do ERP eSHOW is_superuser;deve seron.
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).
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();"
10.8.0.1 (o hub). Pode usar 10.8.0.0/16 para cobrir o hub inteiro.
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:
| Campo | Valor |
|---|---|
| Host / Servidor | O IP do túnel do cliente, ex.: 10.8.0.10 |
| Porta | 5434 (padrão Duesoft) |
| Banco | Nome do banco do ERP (nome_banco) |
| Usuário | dsboards_ro |
| Senha | A senha definida no passo 4 |
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.
- Cadastro: as duas lojas com o mesmo Host (ex.:
10.8.0.17) e mesma porta, mudando só o Banco (ex.:loja1eloja2). No seletor de IP, escolha o IP já usado no grupo "Mesmo servidor (IP já em uso)". - Túnel: gere um só (por uma das lojas) e instale esse
.confno servidor. Não gere de novo pela outra — o mesmo túnel serve as duas (tentar daria "já existe um túnel"). - No servidor: crie o
dsboards_ro+ GRANTs em cada banco e libere o hub nopg_hba.confpara os dois (uma linha por banco, ouallno lugar do banco). - No app: cada loja tem sua chave e usuários; o usuário pode ativar as duas chaves no mesmo aparelho e alternar em "Trocar servidor".
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
- Confirme no servidor do cliente:
sudo wg showmostra handshake recente. - O sincronizador roda a cada ~15 minutos. Na primeira vez para um cliente novo, ele faz o carregamento completo (cadastros + movimentação).
- Peça ao cliente para abrir/reabrir o app — os dados devem aparecer.
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:
| Sintoma | Causa provável | O 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 |
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.