Instalacion self-hosted
Esta guia te lleva de cero a una instancia de Almirant corriendo en tu maquina o servidor.
Tiempo estimado: 15-25 minutos (la mayor parte es build de imagenes Docker la primera vez).
Requisitos
- Docker 24+ y Docker Compose v2 instalados y corriendo. Si vas a correr el stack en un Mac usado como servidor por terminal, lee primero Runtime de Docker en macOS.
- 4 GB de RAM y ~10 GB de disco libre.
- Acceso al repositorio
almirant-ai/almiranten GitHub. Mientras el repo sea privado, necesitas un metodo de autenticacion git funcional (ver Paso 1). Cuando el repo pase a publico este paso sera innecesario. - Una URL publica por la que se accedera al servicio. Puede ser:
http://localhost:8080para uso local.- Un dominio propio con HTTPS.
- Una URL de Tailscale Funnel (
https://<host>.<tailnet>.ts.net). - La URL de un tunel (Cloudflare Tunnel, ngrok, etc.).
Runtime de Docker en macOS
En macOS, Docker corre dentro de una VM Linux. El "runtime" es la app que gestiona esa VM. Hay tres opciones:
| Runtime | Mejor para | Tradeoff |
|---|---|---|
| Docker Desktop | Dev en Mac con UI abierta | Pesado (~500 MB en idle), requiere session GUI activa |
| OrbStack | Dev en Mac con UI abierta | Muy rapido, menubar app — requiere session GUI activa, paid para uso comercial |
| Colima | Servidor headless | CLI puro, arranca como service de macOS — sobrevive reboots sin login GUI, gratis |
Docker Desktop y OrbStack son apps de macOS que requieren que un usuario haya hecho login en la sesion grafica. Si el Mac reinicia y nadie se sienta a desbloquearlo, el daemon de Docker queda muerto y tu instancia tampoco arranca.
Para uso server, usa 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
Verifica que responde:
docker ps # debe responder en menos de un segundo
Cambiar de runtime con datos existentes
Cambiar de OrbStack/Desktop a Colima borra los volumenes (viven dentro de la VM del runtime viejo). Si ya tienes datos importantes:
- Con el runtime viejo vivo, exporta:
pg_dumppara Postgres, snapshot manual para Redis si lo usas. - Apaga el stack:
almirant down. - Instala y arranca Colima.
- Cambia el contexto:
docker context use colima. - Vuelve a
almirant installoalmirant upgradepara crear los volumenes nuevos. - Restaura los dumps.
Si la instancia es nueva o vacia, salta directo al Paso 1.
Paso 1 — Autenticar git contra GitHub
Este paso desaparecera cuando el repo de Almirant se haga publico. Si estas leyendo esto despues de esa transicion, saltatelo.
El instalador hace git clone https://github.com/almirant-ai/almirant.git. Si el repo es privado, git pide credenciales. La forma mas limpia es 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
Verifica que el credential helper de gh quedo configurado:
git config --global --get-all credential.https://github.com.helper
# Debe mostrar: !/opt/homebrew/bin/gh auth git-credential (o similar)
Si en macOS ves errores tipo failed to get: -25308 durante el clone, tu Keychain esta bloqueado (tipico en sesiones SSH sin UI grafica). Desbloquealo:
security unlock-keychain ~/Library/Keychains/login.keychain-db
Paso 2 — Instalar el CLI
bun add -g almirant@latest
# o
npm i -g almirant
Paso 3 — Lanzar almirant install
La forma mas recomendada es pasar --public-url desde el principio con la URL exacta por la que accederas al servicio:
almirant install --public-url https://almirant.miempresa.com
almirant install baquea la URL publica en cuatro variables simultaneamente:
NEXT_PUBLIC_SITE_URL(compilada dentro del bundle del frontend)BETTER_AUTH_URLBETTER_AUTH_TRUSTED_ORIGINSCORS_ORIGIN
Si mas tarde accedes desde una URL distinta (p. ej. pusiste http://localhost:8080 pero entras por https://mimac.tailnet.ts.net), Better-Auth rechaza la peticion con Invalid origin y el registro falla.
Cambiar la URL despues requiere un rebuild del frontend. Ver Cambiar la URL publica.
El instalador:
- Comprueba requisitos (Docker + Compose v2).
- Clona
almirant-ai/almiranten~/.almirant/stack(o hace fast-forward si ya existe). - Genera
.env.productioncon secretos aleatorios si no existe. - Construye las imagenes Docker (backend, frontend, runner, db-init, shims…). La primera vez tarda 10-20 minutos.
- Arranca el stack con
docker compose up -d. - Espera a que el frontend este healthy.
- Imprime la URL final y los comandos de dia-2.
Flags importantes de install
| Flag | Cuando usarlo |
|---|---|
--public-url | Siempre que puedas. Evita tener que rebuildear despues. |
--non-interactive | Scripts de CI o aprovisionamiento automatico. |
--with-proxy | Si quieres el reverse proxy (Caddy) integrado, en lugar de exponer puertos directos. |
--with-discord | Si vas a usar el puente con Discord. |
--branch | Para fijar una version concreta (v1.2.3) en lugar de main. |
--from-dir | Instalaciones air-gapped desde un clone ya presente en disco. |
Ver la lista completa en Referencia → install.
Paso 4 — Completar el onboarding
Abre la URL que te imprimio el instalador. La primera visita te lleva a /signup.
- Si la base de datos esta vacia (primer boot limpio), el formulario funciona en modo
initial_admin_setup: el primer usuario registrado se crea con rol admin y es redirigido al wizard en/onboarding. - Si ya hay usuarios (por ejemplo porque reinstalaste reutilizando el mismo volumen de Postgres), el formulario funciona como signup normal: el usuario recien creado no es admin y va al dashboard. Si quieres forzar un primer admin limpio, ver Empezar de cero.
El wizard de /onboarding tiene tres pasos, todos con boton "Skip for now":
- Admin account — confirma que el primer administrador existe y cierra el registro abierto.
- Public URL (Tailscale) — puedes publicar la instancia con Tailscale Funnel o pegar una URL externa propia.
- GitHub App — crea una GitHub App con un manifest prerellenado o acepta credenciales ya existentes, para que los agentes puedan abrir PRs.
Al terminar, la app esta lista. El link a /onboarding queda visible en el sidebar hasta que completes todos los pasos.
Paso opcional — Proteger Postgres con Tailscale
Por defecto, Postgres vive dentro de Docker y no debe exponerse en la interfaz
publica del VPS. Si necesitas conectarte desde tu portatil con TablePlus,
DBeaver, DataGrip o psql, la forma segura es crear un acceso privado por
Tailscale.
La idea es esta:
- Tu portatil entra en tu tailnet normal de Tailscale.
- Almirant crea un nodo separado llamado, por defecto,
almirant-db. - Ese nodo escucha solo en la red privada de Tailscale y reenvia el puerto
5432al Postgres interno de Docker. - Postgres sigue sin publicarse en internet.
No publiques 5432:5432 ni abras el puerto 5432 a internet "para probar".
Eso funciona, pero es una mala base de seguridad. La base de datos debe quedar
accesible solo desde dispositivos autorizados dentro de tu tailnet.
1. Prepara tu tailnet
Primero instala Tailscale en tu portatil e inicia sesion. En el panel de Tailscale, verifica que tu maquina aparece en Machines.
Despues, en Access controls, declara un tag para el nodo de base de datos:
"tagOwners": {
"tag:almirant-db": ["autogroup:admin"]
}
Si ya tienes tagOwners, no lo reemplaces entero: anade solo la entrada
tag:almirant-db.
2. Limita quien puede llegar a Postgres
Anade una regla que permita a tu usuario acceder al nodo de base de datos solo por TCP 5432:
"grants": [
{
"src": ["[email protected]"],
"dst": ["tag:almirant-db"],
"ip": ["tcp:5432"]
}
]
Cambia [email protected] por el email con el que entras a Tailscale.
Si estas empezando con Tailscale, usa una Auth Key. El flujo con OAuth client es mejor para automatizacion avanzada, pero anade conceptos que no hacen falta para la primera configuracion.
3. Crea una Auth Key para Almirant
En Tailscale Admin:
- Ve a Keys.
- Pulsa Generate auth key.
- Usa una descripcion como
Almirant DB. - Activa el tag
tag:almirant-db. - Si tu tailnet requiere aprobacion de dispositivos, marca la key como pre-approved.
- Copia la key. Debe empezar por
tskey-auth-....
No guardes esta key en el repositorio ni la pegues en issues, logs o capturas.
4. Conecta Almirant al tailnet
En Almirant, entra como admin y ve a:
/settings/instance
En Private database access:
| Campo | Valor recomendado |
|---|---|
| Hostname | almirant-db |
| Tag | tag:almirant-db |
| Metodo | Auth key |
| Auth key | La key tskey-auth-... de Tailscale |
Pulsa Connect. Mientras este en provisioning, espera a que el estado pase a
connected.
Cuando termine, Almirant mostrara una connection string parecida a:
postgresql://...@almirant-db.<tu-tailnet>.ts.net:5432/...
Usa esa URL desde tu portatil, estando conectado a Tailscale.
5. Checklist si no conecta
Revisa en este orden:
- Tu portatil esta conectado a Tailscale.
- En Tailscale Admin aparece una maquina llamada
almirant-db. - Esa maquina tiene el tag
tag:almirant-db. - La regla de acceso permite
tcp:5432haciatag:almirant-db. - En Almirant, el estado de Private database access es
connected. - Estas usando la connection string que muestra Almirant, no el
DATABASE_URLinterno del contenedor.
Si MagicDNS no resuelve el hostname, usa temporalmente la IP Tailscale 100.x.y.z
que muestra Almirant.
Paso 5 — Conectar el CLI contra tu instancia
Hasta aqui has instalado el stack. Ahora toca configurar el CLI para que apunte a esa instancia y puedas hacer init / link en tus repos. Este paso se hace una vez por maquina desde la que vayas a usar el CLI (tu portatil, una VM de desarrollo, el servidor mismo, etc.).
5.1 — Identifica la URL del API
La URL del API es tu --public-url con /api al final:
--public-url del install | URL del 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 — Autentica el CLI
Desde la maquina donde vayas a usar el 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
Se abre el navegador contra tu instancia, autorizas la sesion, y el CLI captura una API key que guarda en ~/.almirant/config.json. La cuenta queda con ID estable y un label local que puedes renombrar.
Este paso es independiente de donde corra el stack. Si el stack vive en un servidor remoto y quieres usar el CLI desde tu portatil, solo necesitas que tu portatil pueda acceder via HTTPS a la URL del API. Si esta detras de Tailscale, asegurate de estar en el mismo tailnet; si esta tras un tunel/proxy, que el puerto sea accesible.
5.3 — Verifica la configuracion
almirant accounts list
almirant current
Deberias ver tu cuenta self-hosted listada, con API URL apuntando a tu instancia y la API key representada solo por su prefijo.
Si tienes varias cuentas (p. ej. tambien trabajas contra el SaaS de almirant.ai), ponles labels y elige cual es la activa:
almirant accounts rename 1 prod-saas
almirant accounts rename 2 local-m1pro
almirant use local-m1pro
Mas detalle en Trabajar con varias cuentas.
5.4 — Vincula un repositorio
Con la cuenta autenticada, vincular un repo a un proyecto de tu instancia es identico al flujo SaaS:
cd mi-repo
almirant link
# Si tienes varias cuentas, elige la self-hosted
# Selecciona un proyecto o crea uno nuevo
El CLI escribe .mcp.json con almirant mcp proxy --project-id ... --account .... La API key no queda en el repo; vive en ~/.almirant/config.json y el proxy la adjunta en memoria.
El flujo completo paso a paso (con verificacion desde el IDE) esta en Conectar un repositorio.
Empezar de cero
Si algo salio mal y quieres empezar con base de datos limpia (destruye todos los datos del stack local):
almirant down --volumes
almirant install --public-url https://almirant.miempresa.com
almirant down --volumes borra los volumenes de Postgres y Redis. Solo usalo en instalaciones de test o cuando estes seguro de querer perder los datos.
Errores comunes en la primera instalacion
password authentication failed for user "almirant"
Significa que el volumen de Postgres tiene un password viejo de una instalacion anterior, distinto del que acaba de generarse en .env.production. Postgres solo lee POSTGRES_PASSWORD del env en el primer boot del volumen.
Fix: borra los volumenes y reinstala (ver Empezar de cero).
Invalid origin al registrarte
La URL desde la que accedes no esta en BETTER_AUTH_TRUSTED_ORIGINS.
Fix: reinstala con --public-url igual a la URL exacta de la barra del navegador:
almirant install --public-url https://<lo-que-ves-en-tu-navegador>
Si ya tienes datos que no quieres perder, puedes cambiar la URL sin reinstalar: ver Cambiar la URL publica.
404 despues del signup
Causa mas frecuente: tu usuario no tiene rol admin (la DB ya tenia usuarios de un intento previo) y el redirect lo manda a /board, que puede fallar si no hay proyectos creados aun.
Fix: empezar de cero para que tu primer registro sea en modo initial_admin_setup.
docker ps se queda colgado / sin respuesta
El cliente Docker espera al socket del daemon. Si ese socket apunta a un runtime que no esta vivo, cuelga.
Diagnostico rapido:
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.
Fixes segun escenario:
- Docker Desktop u OrbStack instalado pero la app esta cerrada → abrir la app:
open -a OrbStack(oopen -a "Docker Desktop"). Esperar 30-60 seg, reintentardocker ps. - App arrancada pero la VM esta zombie → cerrar y volver a abrir, o
colima stop && colima startsi usas Colima. - Cambiaste de runtime y el context apunta al viejo →
docker context use colima(o el nombre correcto). - Mac usado como server y queres que sobreviva reboots → migra a Colima como service (ver Runtime de Docker en macOS).
lockfile had changes, but lockfile is frozen durante el build
RUN bun install --frozen-lockfile
error: lockfile had changes, but lockfile is frozen
Pasa cuando el repo del stack introdujo un nuevo workspace de bun y algun Dockerfile no se actualizo para copiarlo al builder context. Es un bug del stack, no de tu instalacion.
Fix: git pull el repo del stack para tomar la version mas nueva (que ya incluye el fix), y reintentar:
cd ~/.almirant/stack
git pull --ff-only origin main
almirant upgrade
Si tu version del stack es anterior al fix y no podes actualizarla, pega manualmente la linea COPY services/<workspace>/package.json ./services/<workspace>/package.json en los Dockerfiles afectados antes del bun install.
Errores de Docker con keychain en macOS
error getting credentials — err: exit status 1, out: keychain cannot be accessed aparece cuando operas por SSH en un Mac sin sesion grafica.
Fix rapido:
security unlock-keychain ~/Library/Keychains/login.keychain-db
Fix permanente (solo si operas siempre via SSH):
# Desconecta Docker del keychain
jq 'del(.credsStore, .credHelpers)' ~/.docker/config.json > ~/.docker/config.json.tmp \
&& mv ~/.docker/config.json.tmp ~/.docker/config.json
Siguiente paso
Stack corriendo, admin creado, onboarding cerrado. Para operar la instancia dia-a-dia (logs, upgrades, backups, cambios de URL), ve a Operar el stack.