Instalação self-hosted
Este guia leva você do zero a uma instância do Almirant em execução na sua máquina ou servidor.
Tempo estimado: 15-25 minutos (a maior parte é a construção das imagens Docker na primeira vez).
Requisitos
- Docker 24+ e Docker Compose v2 instalados e em execução. Se você for executar o stack em um Mac usado como servidor por terminal, leia primeiro Runtime do Docker no macOS.
- 4 GB de RAM e ~10 GB de espaço livre em disco.
- Acesso ao repositório
almirant-ai/almirantno GitHub. Enquanto o repositório for privado, você precisa de um método funcional de autenticação git (veja Passo 1). Quando o repositório se tornar público, esta etapa deixará de ser necessária. - Uma URL pública pela qual o serviço será acessado. Pode ser:
http://localhost:8080para uso local.- Um domínio próprio com HTTPS.
- Uma URL do Tailscale Funnel (
https://<host>.<tailnet>.ts.net). - A URL de um túnel (Cloudflare Tunnel, ngrok etc.).
Runtime do Docker no macOS
No macOS, o Docker é executado dentro de uma VM Linux. O "runtime" é o app que gerencia essa VM. Há três opções:
| Runtime | Melhor para | Tradeoff |
|---|---|---|
| Docker Desktop | Desenvolvimento no Mac com UI aberta | Pesado (~500 MB em idle), exige sessão de GUI ativa |
| OrbStack | Desenvolvimento no Mac com UI aberta | Muito rápido, app da barra de menus — exige sessão de GUI ativa, pago para uso comercial |
| Colima | Servidor headless | Somente CLI, inicia como serviço do macOS — sobrevive a reinicializações sem login na GUI, gratuito |
Docker Desktop e OrbStack são apps do macOS que exigem que um usuário tenha feito login na sessão gráfica. Se o Mac reiniciar e ninguém desbloqueá-lo, o daemon do Docker ficará inativo e sua instância também não iniciará.
Para uso como servidor, use o Colima:
brew install colima docker docker-compose
# Sizing tipico para un Mac de 16 GB / 8 cores
colima start --cpu 4 --memory 6 --disk 40
# Que arranque solo al boot (sin necesidad de login GUI)
colima stop
brew services start colima
Verifique se ele responde:
docker ps # debe responder en menos de un segundo
Alterar o runtime com dados existentes
Mudar de OrbStack/Desktop para Colima remove os volumes (eles ficam dentro da VM do runtime antigo). Se você já tiver dados importantes:
- Com o runtime antigo em execução, exporte:
pg_dumppara o Postgres e snapshot manual para o Redis, se você o usar. - Pare o stack:
almirant down. - Instale e inicie o Colima.
- Altere o contexto:
docker context use colima. - Execute novamente
almirant installoualmirant upgradepara criar os novos volumes. - Restaure os dumps.
Se a instância for nova ou estiver vazia, vá direto para o Passo 1.
Passo 1 — Autenticar o git no GitHub
Esta etapa desaparecerá quando o repositório do Almirant se tornar público. Se você estiver lendo isto depois dessa transição, pule-a.
O instalador executa git clone https://github.com/almirant-ai/almirant.git. Se o repositório for privado, o git solicitará credenciais. A forma mais limpa é usar gh:
# Instala gh si no lo tienes
brew install gh # macOS
sudo apt install gh # Debian/Ubuntu
# Login interactivo — elige protocolo HTTPS (no SSH)
gh auth login
# GitHub.com → HTTPS → Login with a web browser
# Configura git para usar las credenciales de gh
gh auth setup-git
Verifique se o credential helper do gh foi configurado:
git config --global --get-all credential.https://github.com.helper
# Debe mostrar: !/opt/homebrew/bin/gh auth git-credential (o similar)
Se no macOS você vir erros como failed to get: -25308 durante o clone, seu Keychain está bloqueado (típico em sessões SSH sem interface gráfica). Desbloqueie-o:
security unlock-keychain ~/Library/Keychains/login.keychain-db
Passo 2 — Instalar a CLI
bun add -g almirant@latest
# o
npm i -g almirant
Passo 3 — Executar almirant install
A forma mais recomendada é passar --public-url desde o início com a URL exata pela qual você acessará o serviço:
almirant install --public-url https://almirant.miempresa.com
almirant install insere a URL pública em quatro variáveis simultaneamente:
NEXT_PUBLIC_SITE_URL(compilada no bundle do frontend)BETTER_AUTH_URLBETTER_AUTH_TRUSTED_ORIGINSCORS_ORIGIN
Se você acessar depois por uma URL diferente (por exemplo, definiu http://localhost:8080, mas acessa por https://mimac.tailnet.ts.net), o Better-Auth rejeitará a solicitação com Invalid origin e o cadastro falhará.
Alterar a URL depois exige uma reconstrução do frontend. Veja Alterar a URL pública.
O instalador:
- Verifica os requisitos (Docker + Compose v2).
- Clona
almirant-ai/almirantem~/.almirant/stack(ou faz fast-forward se já existir). - Gera
.env.productioncom segredos aleatórios, se ele não existir. - Constrói as imagens Docker (backend, frontend, runner, db-init, shims…). Na primeira vez, demora 10-20 minutos.
- Inicia o stack com
docker compose up -d. - Aguarda até que o frontend esteja healthy.
- Imprime a URL final e os comandos do dia 2.
Flags importantes de install
| Flag | Quando usar |
|---|---|
--public-url | Sempre que puder. Evita ter de reconstruir depois. |
--non-interactive | Scripts de CI ou provisionamento automático. |
--with-proxy | Se você quiser o proxy reverso integrado (Caddy), em vez de expor portas diretamente. |
--with-discord | Se você for usar a ponte com o Discord. |
--branch | Para fixar uma versão específica (v1.2.3) em vez de main. |
--from-dir | Instalações air-gapped a partir de um clone já presente em disco. |
Veja a lista completa em Referência → install.
Passo 4 — Concluir o onboarding
Abra a URL exibida pelo instalador. A primeira visita leva você a /signup.
- Se o banco de dados estiver vazio (primeira inicialização limpa), o formulário funciona no modo
initial_admin_setup: o primeiro usuário registrado é criado com a função admin e redirecionado ao assistente em/onboarding. - Se já houver usuários (por exemplo, porque você reinstalou reutilizando o mesmo volume do Postgres), o formulário funciona como um cadastro normal: o usuário recém-criado não é admin e vai para o dashboard. Se quiser forçar um primeiro admin limpo, veja Começar do zero.
O assistente de /onboarding tem três etapas, todas com o botão "Skip for now":
- Admin account — confirma que o primeiro administrador existe e fecha o cadastro aberto.
- Public URL (Tailscale) — permite publicar a instância com Tailscale Funnel ou inserir uma URL externa própria.
- GitHub App — cria uma GitHub App com um manifesto pré-preenchido ou aceita credenciais já existentes, para que os agentes possam abrir PRs.
Ao concluir, a aplicação está pronta. O link para /onboarding permanece visível na barra lateral até você concluir todas as etapas.
Etapa opcional — Proteger o Postgres com Tailscale
Por padrão, o Postgres fica dentro do Docker e não deve ser exposto na interface
pública do VPS. Se você precisar se conectar do seu laptop com TablePlus,
DBeaver, DataGrip ou psql, a forma segura é criar um acesso privado pelo
Tailscale.
A ideia é a seguinte:
- Seu laptop entra na sua tailnet normal do Tailscale.
- O Almirant cria um nó separado chamado, por padrão,
almirant-db. - Esse nó escuta somente na rede privada do Tailscale e encaminha a porta
5432para o Postgres interno do Docker. - O Postgres continua sem ser publicado na internet.
Não publique 5432:5432 nem abra a porta 5432 para a internet "só para testar".
Isso funciona, mas é uma base ruim de segurança. O banco de dados deve ficar
acessível somente por dispositivos autorizados dentro da sua tailnet.
1. Prepare sua tailnet
Primeiro, instale o Tailscale no seu laptop e inicie sessão. No painel do Tailscale, verifique se sua máquina aparece em Machines.
Depois, em Access controls, declare uma tag para o nó do banco de dados:
"tagOwners": {
"tag:almirant-db": ["autogroup:admin"]
}
Se você já tiver tagOwners, não o substitua por completo: adicione somente a entrada
tag:almirant-db.
2. Limite quem pode acessar o Postgres
Adicione uma regra que permita ao seu usuário acessar o nó do banco de dados somente por TCP 5432:
"grants": [
{
"dst": ["tag:almirant-db"],
"ip": ["tcp:5432"]
}
]
Substitua [email protected] pelo email usado para acessar o Tailscale.
Se você está começando a usar o Tailscale, use uma Auth Key. O fluxo com cliente OAuth é melhor para automação avançada, mas adiciona conceitos desnecessários para a primeira configuração.
3. Crie uma Auth Key para o Almirant
No Tailscale Admin:
- Vá até Keys.
- Clique em Generate auth key.
- Use uma descrição como
Almirant DB. - Ative a tag
tag:almirant-db. - Se sua tailnet exigir aprovação de dispositivos, marque a key como pre-approved.
- Copie a key. Ela deve começar com
tskey-auth-....
Não guarde essa key no repositório nem a cole em issues, logs ou capturas de tela.
4. Conecte o Almirant à tailnet
No Almirant, entre como admin e vá para:
/settings/instance
Em Private database access:
| Campo | Valor recomendado |
|---|---|
| Hostname | almirant-db |
| Tag | tag:almirant-db |
| Método | Auth key |
| Auth key | A key tskey-auth-... do Tailscale |
Clique em Connect. Enquanto estiver em provisioning, aguarde até que o status mude para
connected.
Quando concluir, o Almirant mostrará uma connection string semelhante a:
postgresql://...@almirant-db.<tu-tailnet>.ts.net:5432/...
Use essa URL do seu laptop, enquanto estiver conectado ao Tailscale.
5. Checklist se não conectar
Verifique nesta ordem:
- Seu laptop está conectado ao Tailscale.
- No Tailscale Admin, aparece uma máquina chamada
almirant-db. - Essa máquina tem a tag
tag:almirant-db. - A regra de acesso permite
tcp:5432paratag:almirant-db. - No Almirant, o status de Private database access é
connected. - Você está usando a connection string mostrada pelo Almirant, não a
DATABASE_URLinterna do contêiner.
Se o MagicDNS não resolver o hostname, use temporariamente o IP do Tailscale 100.x.y.z
mostrado pelo Almirant.
Passo 5 — Conectar a CLI à sua instância
Até aqui você instalou o stack. Agora é preciso configurar a CLI para apontar para essa instância e poder executar init / link nos seus repositórios. Esta etapa é feita uma vez por máquina na qual você usar a CLI (seu laptop, uma VM de desenvolvimento, o próprio servidor etc.).
5.1 — Identifique a URL da API
A URL da API é seu --public-url com /api no final:
--public-url do install | URL da API |
|---|---|
https://almirant.miempresa.com | https://almirant.miempresa.com/api |
https://<host>.<tailnet>.ts.net | https://<host>.<tailnet>.ts.net/api |
http://localhost:8080 | http://localhost:8080/api |
5.2 — Autentique a CLI
Da máquina na qual você usará a CLI:
# Instala el CLI si aun no lo tienes en esa maquina
bun add -g almirant@latest
# Login contra tu instancia self-hosted
almirant login --api-url https://almirant.miempresa.com/api
O navegador abre sua instância, você autoriza a sessão e a CLI captura uma API key que salva em ~/.almirant/config.json. A conta fica com um ID estável e um rótulo local que você pode renomear.
Esta etapa é independente de onde o stack é executado. Se o stack estiver em um servidor remoto e você quiser usar a CLI do seu laptop, basta que seu laptop possa acessar a URL da API por HTTPS. Se estiver atrás do Tailscale, certifique-se de estar na mesma tailnet; se estiver atrás de um túnel/proxy, que a porta esteja acessível.
5.3 — Verifique a configuração
almirant accounts list
almirant current
Você deverá ver sua conta self-hosted na lista, com API URL apontando para sua instância e a API key representada apenas pelo prefixo.
Se você tiver várias contas (por exemplo, também trabalha com o SaaS de almirant.ai), dê rótulos a elas e escolha qual está ativa:
almirant accounts rename 1 prod-saas
almirant accounts rename 2 local-m1pro
almirant use local-m1pro
Mais detalhes em Trabalhar com várias contas.
5.4 — Vincule um repositório
Com a conta autenticada, vincular um repositório a um projeto da sua instância é idêntico ao fluxo SaaS:
cd mi-repo
almirant link
# Si tienes varias cuentas, elige la self-hosted
# Selecciona un proyecto o crea uno nuevo
A CLI grava .mcp.json com almirant mcp proxy --project-id ... --account .... A API key não fica no repositório; ela fica em ~/.almirant/config.json e o proxy a anexa em memória.
O fluxo completo passo a passo (com verificação pelo IDE) está em Conectar um repositório.
Começar do zero
Se algo der errado e você quiser começar com um banco de dados limpo (destrói todos os dados do stack local):
almirant down --volumes
almirant install --public-url https://almirant.miempresa.com
almirant down --volumes remove os volumes do Postgres e do Redis. Use-o somente em instalações de teste ou quando tiver certeza de que deseja perder os dados.
Erros comuns na primeira instalação
password authentication failed for user "almirant"
Isso significa que o volume do Postgres tem uma senha antiga de uma instalação anterior, diferente da que acabou de ser gerada em .env.production. O Postgres só lê POSTGRES_PASSWORD do env na primeira inicialização do volume.
Correção: remova os volumes e reinstale (veja Começar do zero).
Invalid origin ao se cadastrar
A URL pela qual você acessa não está em BETTER_AUTH_TRUSTED_ORIGINS.
Correção: reinstale com --public-url igual à URL exata da barra do navegador:
almirant install --public-url https://<lo-que-ves-en-tu-navegador>
Se você já tiver dados que não quer perder, é possível alterar a URL sem reinstalar: veja Alterar a URL pública.
404 após o signup
Causa mais comum: seu usuário não tem a função admin (o banco de dados já tinha usuários de uma tentativa anterior) e o redirecionamento o envia para /board, que pode falhar se ainda não houver projetos criados.
Correção: comece do zero para que seu primeiro cadastro esteja no modo initial_admin_setup.
docker ps trava / não responde
O cliente Docker espera pelo socket do daemon. Se esse socket apontar para um runtime que não está em execução, ele trava.
Diagnóstico rápido:
docker context ls
# Mira que context tiene el `*` y a que socket apunta.
ls -la /var/run/docker.sock 2>&1
ls -la ~/.docker/run/docker.sock 2>&1
ls -la ~/.orbstack/run/docker.sock 2>&1
# El socket del context activo tiene que existir y tener permiso de escritura.
pgrep -lf -i 'OrbStack|Docker Desktop|colima' | head -5
# Tiene que aparecer al menos uno.
Correções conforme o cenário:
- Docker Desktop ou OrbStack instalado, mas o app está fechado → abra o app:
open -a OrbStack(ouopen -a "Docker Desktop"). Aguarde 30-60 s e tentedocker psnovamente. - App iniciado, mas a VM está travada → feche e abra novamente ou execute
colima stop && colima startse usar Colima. - Você mudou de runtime e o context aponta para o antigo →
docker context use colima(ou o nome correto). - Mac usado como servidor e você quer que sobreviva a reinicializações → migre para o Colima como serviço (veja Runtime do Docker no macOS).
lockfile had changes, but lockfile is frozen durante o build
RUN bun install --frozen-lockfile
error: lockfile had changes, but lockfile is frozen
Isso acontece quando o repositório do stack introduziu um novo workspace bun e algum Dockerfile não foi atualizado para copiá-lo para o contexto do builder. É um bug do stack, não da sua instalação.
Correção: execute git pull no repositório do stack para obter a versão mais recente (que já inclui a correção) e tente novamente:
cd ~/.almirant/stack
git pull --ff-only origin main
almirant upgrade
Se sua versão do stack for anterior à correção e você não puder atualizá-la, adicione manualmente a linha COPY services/<workspace>/package.json ./services/<workspace>/package.json nos Dockerfiles afetados antes de bun install.
Erros do Docker com Keychain no macOS
error getting credentials — err: exit status 1, out: keychain cannot be accessed aparece quando você opera por SSH em um Mac sem sessão gráfica.
Correção rápida:
security unlock-keychain ~/Library/Keychains/login.keychain-db
Correção permanente (somente se você sempre operar por SSH):
# Desconecta Docker del keychain
jq 'del(.credsStore, .credHelpers)' ~/.docker/config.json > ~/.docker/config.json.tmp \
&& mv ~/.docker/config.json.tmp ~/.docker/config.json
Próxima etapa
Stack em execução, admin criado, onboarding concluído. Para operar a instância no dia a dia (logs, upgrades, backups, alterações de URL), vá para Operar o stack.