Memorax on-premise — guia do operador

O Memorax on-premise roda o Memorax na sua própria infraestrutura. Seus dados e o acesso ao seu código nunca ficam sob controle de um SaaS: a instância é single-tenant (uma organização), e a IA usa a sua própria chave (BYOK) — o fornecedor nunca tem acesso permanente ao seu git.

Este guia leva você de zero a usando: instalar → licenciar → configurar → primeiro acesso, e depois atualizar, diagnosticar e operar.


1. Requisitos

HTTPS é fortemente recomendado. Em HTTP puro o cookie de sessão cai para SameSite=Lax (login só pelo navegador) e você perde a proteção de transporte. Sirva a instância atrás de um proxy TLS.


2. Instalação

Mais rápido — uma linha (baixa o bundle e instala):

curl -fsSL https://memoraxapp.com.br/get-onprem.sh | EXTERNAL_URL=https://memorax.suaempresa.com.br bash

Ou, passo a passo (baixa o bundle e roda o instalador — você fica com os arquivos para operar depois):

git clone https://github.com/memoraxapp/memorax-onprem.git
cd memorax-onprem
EXTERNAL_URL=https://memorax.suaempresa.com.br ./install.sh

(Alternativa sem git: baixe o .tar.gz em github.com/memoraxapp/memorax-onprem e extraia.)

Fixe a versão com MEMORAX_VERSION=v0.1.0 (env) para uma instalação reprodutível; o default é latest.

O install.sh:

  1. verifica Docker/Compose/openssl/curl;
  2. na 1ª vez, gera um .env com secrets aleatórios (BETTER_AUTH_SECRET, ENCRYPTION_KEY, senha do Postgres, credenciais do MinIO, WORKER_INTERNAL_TOKEN) — é idempotente: reexecuções preservam os secrets;
  3. puxa as imagens da versão pedida do registry público (MEMORAX_VERSION, default latest) — você não precisa do código-fonte;
  4. sobe a stack (perfil bundled: web + worker + Postgres/pgvector + Redis + MinIO embutidos).

Ao terminar, acesse a EXTERNAL_URL. Fixe uma versão no .env (ex.: MEMORAX_VERSION=v0.1.0) para reprodutibilidade — o latest é conveniente, mas muda com o tempo.


3. Primeiro acesso (o operador)

O primeiro usuário a logar vira o operador da instância (administrador). Os demais fazem auto-join na organização única.


4. Licença

A instância verifica a licença offline (sem rede — nada é enviado à Memorax). Sem licença válida ela degrada: leitura, busca e chat seguem funcionando, mas novas ingestões e a geração de documentação ficam bloqueadas.

Para ativar (ou renovar), escolha um caminho:

A. Pelo Admin (recomendado — sem reiniciar). Em Admin → cartão "Licença da instância", cole o blob recebido da Memorax no campo e salve. A licença passa a valer na hora no web e em ≤60s no worker — nenhum restart necessário.

B. Pela env. Cole o blob em MEMORAX_LICENSE no .env e reinicie:

docker compose --profile bundled up -d --force-recreate web worker

O blob salvo pelo Admin vence a env (a env fica como fallback). O estado da licença (Ativa / Expirada / Inválida / Ausente) aparece no mesmo cartão do Admin, com a validade. Ao expirar, você recebe um aviso; renove pelo mesmo processo.


5. Configuração

Tudo é feito no .env (reinicie os serviços afetados depois de mudar). As chaves principais:

5.1 IA (BYOK)

A IA usa a sua chave — a instância não fala com nenhum SaaS da Memorax para isso.

OPENAI_API_KEY=...        # embeddings exigem OpenAI OU OpenRouter
ANTHROPIC_API_KEY=...
OPENROUTER_API_KEY=...
EMBEDDING_MODEL=text-embedding-3-small

Você também pode configurar as chaves depois de subir, em Admin → Modelos.

5.2 E-mail (link mágico, convites)

Sem transporte, o link mágico sai só no log (bom para o 1º acesso). Para envio real:

EMAIL_TRANSPORT=resend            # ou: smtp
EMAIL_FROM=memorax@suaempresa.com.br
# Resend:
RESEND_API_KEY=...
# SMTP (relay interno):
SMTP_HOST=...
SMTP_PORT=587
SMTP_USER=...
SMTP_PASS=...
SMTP_SECURE=false                 # true para TLS implícito (porta 465)

5.3 Métodos de login

AUTH_MAGIC_LINK_ENABLED=true      # link mágico (precisa de transporte de e-mail)
AUTH_PASSWORD_ENABLED=false       # e-mail + senha local

Ligue os que fizer sentido (pelo menos um). Trocar exige reiniciar o web.

Com a senha local ligada, a tela de login mostra "Esqueci minha senha": o usuário recebe um link por e-mail e escolhe a nova senha. Depende do transporte de e-mail da seção 5.2 estar configurado — sem transporte, o link não sai e a única recuperação é o operador trocar a senha pelo banco.

5.4 Postgres / Redis / S3 gerenciados (externos)

Para usar serviços gerenciados em vez dos embutidos:

  1. no .env, aponte DATABASE_URL (garanta a extensão vector no banco — o Postgres embutido já a traz), REDIS_URL e S3_ENDPOINT/AWS_*/S3_BUCKET para os externos;
  2. suba sem o perfil bundled: docker compose up -d.
  3. defina MEMORAX_BACKUP=off (o backup/PITR do banco passa a ser sua responsabilidade).

6. Usar o Memorax

Depois de licenciada e com uma chave de IA, a instância funciona como o Memorax que você conhece: ingerir fontes, documentar repositórios de código, chat com a wiki, sweep, etc.

Publicar uma wiki como site de documentação: publique um espaço pela UI; no on-prem a publicação é servida por caminho, em EXTERNAL_URL/publicado/{projeto}/... (público ou protegido, conforme você escolher).


7. Atualização

A atualização é orquestrada e com rede de proteção (há um breve downtime durante a migração — priorizamos segurança sobre zero-downtime):

MEMORAX_VERSION=v0.2.0 ./upgrade.sh

O upgrade.sh: puxa a nova versão → para o app → faz backup (pg_dump; pulável só no modo externo com PITR) → roda a migração dedicada → sobe os serviços novos → health-check. Se o health-check falhar, restaura o banco do backup e volta à versão anterior, e aborta.

A instância avisa o operador quando há uma versão nova disponível (banner; desligável com MEMORAX_UPDATE_CHECK=off — nenhuma chamada de saída é feita então).


8. Diagnóstico (para o suporte)

./diagnose.sh

Gera um arquivo local e redigido (diagnose-<data>.txt) com status dos serviços, versões, config sem secrets (senhas/chaves/tokens mascarados) e um trecho dos logs. Nada é enviado automaticamente — você revisa e manda para o suporte se quiser.


9. Backup e restauração


10. Troubleshooting / FAQ

SintomaCausa provávelAção
Login não completa / redireciona erradoEXTERNAL_URL não bate com o endereço real (atrás do proxy)Ajuste EXTERNAL_URL para a URL que os usuários acessam e reinicie o web.
Cookie de sessão não persisteServindo em HTTP puroUse HTTPS atrás de um proxy TLS.
Link mágico não chegaSem EMAIL_TRANSPORT configuradoConfigure Resend/SMTP (§5.2), ou pegue o link no log do web.
Novas ingestões/geração bloqueadasLicença ausente/expirada (degrade)Configure uma licença válida pelo Admin ou pela env (§4).
Migração falha no Postgres externo: vector ausenteSem privilégio para criar a extensãoPré-crie no banco (como superuser): CREATE EXTENSION vector;
Conflito de porta ao subirPortas 3000/9000/9001 em usoDefina WEB_PORT/MINIO_PORT/MINIO_CONSOLE_PORT no .env.
Upgrade abortou e reverteuHealth-check não passouVeja docker compose logs web; corrija e rode o upgrade.sh de novo.

Logs:

docker compose --profile bundled logs -f web       # servidor
docker compose --profile bundled logs -f worker    # filas (ingestão, sweep, etc.)

Suporte: rode ./diagnose.sh e envie o arquivo gerado (já redigido) junto da descrição do problema.


Notas