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.
- 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.homologexistente (o script puxaPOSTGRES_PASSWORD/CERTBOT_EMAILdele) — ou passe via flags.
Conceito: o que define o tenant
| Peça | Onde | Observaçã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 depoisEle 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_acmeno Postgres do host; - renderiza
.env.acme(chmod 600) com portas alocadas, domínios pela convenção, secrets gerados (openssl),HSBR_RUN_SEED=1eHSBR_LICENSE_KEY=REPLACE_WITH_LICENSE_KEY_FROM_ADMIN_UI.
Convenções (10 portas por grupo, --base-port N):
| Item | Valor | Exemplo (--base-port 4110) |
|---|---|---|
| hsbr-back | N+1 · <grupo>-api.<suffix> | 4111 · acme-api.hasarbrasil.com.br |
| hsbr-front | N+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>
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):
- Tenant → novo (nome, CNPJ, e-mail de contato).
- 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. - 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ção | Comando |
|---|---|---|
| 1 | Provisionar | ./scripts/new-group.sh <grupo> --base-port N |
| 2 | DNS | A-records <grupo>-api.<suffix> e <grupo>.<suffix> |
| 3 | Licença | admin UI → tenant + licença → key no .env.<grupo> |
| 4 | Subir | ./scripts/up-hsbr.sh --env <grupo> |
| 5 | Nginx + TLS | sudo ./scripts/setup-nginx.sh --env <grupo> --certbot |
| 6 | Testar | /api/health, /license/status, login |
| 7 | Seed off | HSBR_RUN_SEED=0 → up-hsbr.sh --env <grupo> --no-build |