Pular para o conteúdo principal

Adicionar um novo tenant (grupo)

Cada tenant (grupo comercial) é um deploy isolado do H1 Tech: 1 tenant = 1 arquivo .env.<grupo> + 1 banco ga6_<grupo> + 1 license key. Não há multi-tenancy dentro de uma instância — para servir outro cliente, você provisiona outro grupo (próprias portas, domínios, banco e licença), todos apontando para o mesmo license server compartilhado.

O script DevOps/docker/scripts/new-group.sh automatiza a parte chata (criar o banco, alocar portas, gerar secrets e renderizar o .env.<grupo>). Ele não sobe containers nem mexe em DNS/Nginx — isso fica nos passos seguintes, para você revisar antes.

Pré-requisitos
  • Rodando no VPS, dentro de DevOps/docker/.
  • O license server compartilhado já de pé (você vai criar a licença nele).
  • Acesso ao DNS do domínio para criar os A-records.
  • Postgres do host acessível e um .env.homolog existente (o script puxa POSTGRES_PASSWORD / CERTBOT_EMAIL dele) — ou passe via flags.

Conceito: o que define o tenant

PeçaOndeObservação
H1_ENV=<grupo>.env.<grupo>vira o --project-name do compose (isola os containers)
HSBR_DB_NAME=ga6_<grupo>.env.<grupo>banco dedicado no Postgres do host
HSBR_ADMIN_EMPRESA=<grupo>.env.<grupo>nome do tenant e prefixo das tabelas de EPC (ex.: <grupo>etiquetas)
HSBR_LICENSE_KEY=<uuid>.env.<grupo>a licença criada no admin UI (liga este deploy ao tenant da licença)
HSBR_ADMIN_EMPRESA é difícil de mudar depois

Ele vira o prefixo de tabelas dinâmicas criadas no seed (ex.: <empresa>etiquetas, <empresa>etiqueta2). Escolha o nome final do grupo antes do primeiro boot com seed.

Passo a passo

1. Provisionar o grupo (new-group.sh)

Veja o plano primeiro com --dry-run, depois rode de verdade:

cd DevOps/docker

# pré-visualiza (não cria nada)
./scripts/new-group.sh acme --base-port 4110 --dry-run

# cria o banco + .env.acme
./scripts/new-group.sh acme \
--base-port 4110 \
--domain-suffix hasarbrasil.com.br \
--license-public-url https://license.hasarbrasil.com.br \
--admin-email admin@acme.com.br

O que ele faz:

  • valida que o grupo ainda não existe (env, banco, portas livres);
  • cria o banco ga6_acme no Postgres do host;
  • renderiza .env.acme (chmod 600) com portas alocadas, domínios pela convenção, secrets gerados (openssl), HSBR_RUN_SEED=1 e HSBR_LICENSE_KEY=REPLACE_WITH_LICENSE_KEY_FROM_ADMIN_UI.

Convenções (10 portas por grupo, --base-port N):

ItemValorExemplo (--base-port 4110)
hsbr-backN+1 · <grupo>-api.<suffix>4111 · acme-api.hasarbrasil.com.br
hsbr-frontN+2 · <grupo>.<suffix>4112 · acme.hasarbrasil.com.br

Flags úteis: --admin-empresa NAME (default <grupo>), --license-url (URL que o back consome; default = a pública), --postgres-password, --certbot-email. Veja ./scripts/new-group.sh --help.

2. Criar os A-records no DNS

Aponte os dois domínios para o IP público do VPS antes do certbot (validação HTTP-01):

acme-api.hasarbrasil.com.br   →  <IP do VPS>
acme.hasarbrasil.com.br → <IP do VPS>
Ainda sem DNS?

Dá para testar o tenant por IP:porta (nginx com vhosts por porta, containers em loopback) e migrar para domínio+TLS depois — veja Sem DNS: acesso por IP:porta. Pule este passo e o passo 5 por enquanto.

3. Criar o tenant + a licença no admin UI

No license server compartilhado (https://license.hasarbrasil.com.br):

  1. Tenant → novo (nome, CNPJ, e-mail de contato).
  2. Licença → nova: escolha o tenant, o produto (HSBR_ASSETS, HSBR_ALL1, …), o tipo (online / offline / hybrid), os limites e a validade. Copie a license key (UUID) gerada.
  3. Cole a key em .env.acme:
HSBR_LICENSE_KEY=e70ed266-1e26-4405-8e14-efee4f439c1f

Detalhes de modos, produtos e enforcement: veja Licenciamento.

4. Subir os containers do grupo

./scripts/up-hsbr.sh --env acme
# (equivalente simples: ./scripts/deploy-stack.sh acme)

No primeiro boot, com HSBR_RUN_SEED=1, o back roda migrate deploy + seed (cria o admin, status, níveis, ZPL e as tabelas de EPC <empresa>…) e ativa a licença contra o license server.

5. Publicar no Nginx + emitir TLS

sudo ./scripts/setup-nginx.sh --env acme --certbot

6. Testar

curl https://acme-api.hasarbrasil.com.br/api/health
curl https://acme-api.hasarbrasil.com.br/license/status # active: true

Login no front em https://acme.hasarbrasil.com.br com o HSBR_ADMIN_EMAIL / senha gerada (impressos pelo new-group.sh).

7. Desligar o seed

Depois do primeiro boot verde, evite re-seed (que sobrescreveria dados):

# em .env.acme:  HSBR_RUN_SEED=0
./scripts/up-hsbr.sh --env acme --no-build

Como migrations e seed rodam (e quando re-semear): veja Migrations e Seed.

Variante SQL Server

new-group.sh gera um .env Postgres. Para rodar o tenant em SQL Server, edite o .env.<grupo> gerado e troque o bloco de banco por DB_ENGINE=sqlserver + as vars DB_MSSQL_*, suba o banco com ./scripts/db-sqlserver.sh --env <grupo> e faça o deploy com ./scripts/deploy-stack.sh <grupo> (que aplica o override -sqlserver automaticamente). O passo a passo completo do banco — em qualquer engine, e com as opções container/externo/tudo-de-uma-vez — está em Banco de dados do deploy.

Resumo

#AçãoComando
1Provisionar./scripts/new-group.sh <grupo> --base-port N
2DNSA-records <grupo>-api.<suffix> e <grupo>.<suffix>
3Licençaadmin UI → tenant + licença → key no .env.<grupo>
4Subir./scripts/up-hsbr.sh --env <grupo>
5Nginx + TLSsudo ./scripts/setup-nginx.sh --env <grupo> --certbot
6Testar/api/health, /license/status, login
7Seed offHSBR_RUN_SEED=0up-hsbr.sh --env <grupo> --no-build