Empresa fictícia para gravar o vídeo antes do qLLM. Silos reais no Rancher Desktop (k3s), console tipo vitrine + esteira de aprovação, GitOps local (Gitea + Argo CD). Sem TLS e sem GitHub.
Scripts em scripts/windows (PowerShell) e scripts/linux (bash). Cada um tem variantes Rancher Desktop (nerdctl → k8s.io) e Docker.
Rancher Desktop ligado (k3s) ou outro cluster com kubectl, mais nerdctl e/ou docker.
No Linux, após clonar: chmod +x scripts/linux/*.sh
Sem hosts, use o port-forward (URLs em 127.0.0.1).
.\scripts\windows\add-hosts.ps1 # elevadosudo ./scripts/linux/add-hosts.sh127.0.0.1 console.northline.local
127.0.0.1 erp.northline.local
127.0.0.1 kafka.northline.local
127.0.0.1 gitea.northline.local
127.0.0.1 argocd.northline.local
127.0.0.1 qllm.northline.local
127.0.0.1 mcp.northline.local
.\scripts\windows\bootstrap.ps1
.\scripts\windows\build-images-rancher.ps1
.\scripts\windows\push-gitops.ps1
kubectl apply -f deploy\bootstrap\application.yaml.\scripts\windows\bootstrap.ps1
.\scripts\windows\build-images-docker.ps1
.\scripts\windows\push-gitops.ps1
kubectl apply -f deploy\bootstrap\application.yaml./scripts/linux/bootstrap.sh
./scripts/linux/build-images-rancher.sh
./scripts/linux/push-gitops.sh
kubectl apply -f deploy/bootstrap/application.yaml./scripts/linux/bootstrap.sh
./scripts/linux/build-images-docker.sh
./scripts/linux/push-gitops.sh
kubectl apply -f deploy/bootstrap/application.yamlO chat usa OpenAI por padrão (langchain_openai.ChatOpenAI). Sem chave válida o widget não funciona.
- Copie o exemplo se ainda não tiver o arquivo:
secrets/openai.env.example→secrets/openai.env - Preencha
OPENAI_API_KEY=com uma chave da OpenAI (e opcionalmenteOPENAI_MODEL) - Aplique o secret e reinicie o console:
.\scripts\windows\apply-openai-secret.ps1./scripts/linux/apply-openai-secret.shPara trocar a chave depois: edite de novo secrets/openai.env e rode o mesmo script apply-openai-secret.
Para outro provedor (Anthropic, Azure, etc.): altere o cliente LLM em apps/console/chat.py (hoje é ChatOpenAI), rebuild da imagem console e restart do pod.
Acesso sem hosts:
.\scripts\windows\port-forward.ps1./scripts/linux/port-forward.sh| Port-forward | URL |
|---|---|
| console | http://127.0.0.1:18080 |
| argocd | http://127.0.0.1:18081 |
| erp | http://127.0.0.1:18082/inventory |
| kafka | http://127.0.0.1:18083 |
| qllm | http://127.0.0.1:18088/v1/health |
| mcp | http://127.0.0.1:18089/mcp |
| gitea | http://127.0.0.1:33000 (gitops / gitops) |
Argo admin — senha:
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}")))kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d; echoImagens locais: northline-erp:local, northline-console:local, northline-jobs:local, qllm-smalldemo:local (imagePullPolicy: IfNotPresent).
No Rancher Desktop, o k3s só enxerga imagens no namespace k8s.io do containerd:
| Runtime | Script Windows | Script Linux |
|---|---|---|
| Rancher / nerdctl | .\scripts\windows\rebuild-rancher.ps1 |
./scripts/linux/rebuild-rancher.sh |
| Docker (+ load k8s.io se nerdctl existir) | .\scripts\windows\rebuild-docker.ps1 |
./scripts/linux/rebuild-docker.sh |
Só build (sem restart):
| Runtime | Windows | Linux |
|---|---|---|
| Rancher | build-images-rancher.ps1 |
build-images-rancher.sh |
| Docker | build-images-docker.ps1 |
build-images-docker.sh |
nerdctl --namespace k8s.io build -t northline-erp:local apps/erp
nerdctl --namespace k8s.io build -t northline-console:local apps/console
nerdctl --namespace k8s.io build -t northline-jobs:local apps/jobs
nerdctl --namespace k8s.io build -t qllm-smalldemo:local qllm-smalldemodocker build -t northline-erp:local apps/erp
docker build -t northline-console:local apps/console
docker build -t northline-jobs:local apps/jobs
docker build -t qllm-smalldemo:local qllm-smalldemo
for img in northline-erp:local northline-console:local northline-jobs:local qllm-smalldemo:local; do
tar="/tmp/${img//:/-}.tar"
docker save "$img" -o "$tar"
nerdctl --namespace k8s.io load -i "$tar"
doneSó Docker (sem nerdctl) só funciona se o kubectl usar o mesmo runtime que o docker. No Rancher Desktop, use a variante Rancher.
# nerdctl
nerdctl --namespace k8s.io build -t northline-console:local apps/console
kubectl -n northline delete pod -l app=console
# docker (+ load no Rancher)
docker build -t northline-console:local apps/console
docker save northline-console:local -o /tmp/northline-console-local.tar
nerdctl --namespace k8s.io load -i /tmp/northline-console-local.tar
kubectl -n northline delete pod -l app=consoleDepois de editar deploy/gitops:
.\scripts\windows\push-gitops.ps1
kubectl -n argocd annotate application northline argocd.argoproj.io/refresh=hard --overwrite./scripts/linux/push-gitops.sh
kubectl -n argocd annotate application northline argocd.argoproj.io/refresh=hard --overwriteSe os pods estiverem em 0 réplicas (Rancher dormiu):
kubectl -n northline scale deploy --all --replicas=1
kubectl -n northline scale sts --all --replicas=1
kubectl -n argocd scale deploy --all --replicas=1Ou rode o port-forward (ele já faz o scale).
Status rápido:
.\scripts\windows\status.ps1./scripts/linux/status.shcust_042 Marina Costa tem 3 pedidos (ord_9001 notebook ainda em FINANCE_REVIEW, ord_9002 mouse e ord_9003 headset já aprovados). cust_007 Paulo Mendes também compra mais de uma vez. Ticket âncora: tkt_77.
Imagem qllm-smalldemo:local, Application Argo northline. Chat do console: LangChain + HTTP do qLLM (how_to_use_me / describe_catalog / execute_sql).
