Ir al contenido

De cero a un grafo de acceso de lectura/escritura

Al terminar este tutorial tendrás Olivares AI ejecutándose localmente y habrás alcanzado su artefacto central: un grafo de acceso de lectura/escritura con un resultado real de drift Permitido-vs-Observado. Aprenderás sobre el producto viéndolo funcionar — esta es una vía de aprendizaje, no una instalación de producción (para eso, consulta self-hosting).

Usamos el estate de demo incluido (--seed-demo): un pequeño conjunto sintético de agentes, identidades y recursos que fluye por el bus de eventos real exactamente como lo haría un colector pgAudit u OpenTelemetry en vivo. Todo se ejecuta en localhost.

  • Go 1.26+ (para compilar el binario), o Docker (consulta la guía de self-hosting para la vía del contenedor).
  • curl y python3 para hablar con la API desde la shell.
  • Un checkout del repositorio de Olivares AI.
  1. Compila el binario único. Desde la raíz del repositorio:

    Ventana de terminal
    task setup # install git hooks, commit tooling and web deps
    task build # compile the static binary with the web embedded (go:embed)
    ./bin/olivares version

    task build compila el bundle web, los plugins de conectores de primera parte y el binario, produciendo un único artefacto autocontenido en ./bin/olivares.

  2. Arráncalo con el estate de demo en loopback. Elige un directorio de datos nuevo para empezar limpio:

    Ventana de terminal
    DATA="$(mktemp -d)"
    ./bin/olivares serve --insecure --seed-demo \
    --listen 127.0.0.1:8901 --grpc-listen 127.0.0.1:8902 \
    --data-dir "$DATA"

    El flag --insecure sirve HTTP en texto plano sobre loopback (válido para un tutorial local; en otros casos TLS está activado por defecto). Al arrancar verás un banner de DEMO MODE con las credenciales de demo:

    demo@olivares.local / olivares-demo-estate

Deja el servidor en marcha y abre una segunda terminal.

  1. Inicia sesión con las credenciales de demo para obtener un bearer token:

    Ventana de terminal
    BASE=http://127.0.0.1:8901
    TOKEN="$(curl -sf -X POST "$BASE/v1/auth/login" \
    -H 'Content-Type: application/json' \
    -d '{"email":"demo@olivares.local","password":"olivares-demo-estate"}' \
    | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')"
  2. Resuelve el tenant de demo (los endpoints del access map están acotados por tenant):

    Ventana de terminal
    TENANT="$(curl -sf "$BASE/v1/system/orgs" -H "Authorization: Bearer $TOKEN" \
    | python3 -c 'import sys,json;[print(o["tenant_id"]) for o in json.load(sys.stdin)["items"] if o["slug"]=="demo"]')"
  3. Obtén el grafo de lectura/escritura. Este es el módulo III — el access map:

    Ventana de terminal
    curl -sf "$BASE/v1/m/accessmap/graph?limit=200" \
    -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" | python3 -m json.tool

    El estate de demo devuelve aproximadamente 20 nodos y 13 aristas — agentes, identidades, servidores MCP, modelos, proveedores y recursos, con cada arista clasificada como lectura o lectura-escritura.

  4. Obtén el drift Permitido-vs-Observado:

    Ventana de terminal
    curl -sf "$BASE/v1/m/accessmap/drift" \
    -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" | python3 -m json.tool

    Esto saca a la luz los accesos inesperados sembrados, por ejemplo:

    • un agente leyendo appdb.public.secrets al que nunca se le concedió acceso (atribuido); y
    • una identidad de pool compartido escribiendo appdb.public.logs (atribución aproximada).
  5. (Opcional) Ve el inventario sembrado completo:

    Ventana de terminal
    curl -sf "$BASE/v1/m/inventory/summary" \
    -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" | python3 -m json.tool

La UI web está embebida en el mismo binario y se sirve desde el mismo origen. Con el servidor de demo aún en marcha, abre:

http://127.0.0.1:8901

Inicia sesión con las credenciales de demo y abre la vista de access map: el grafo renderiza los mismos nodos y aristas, con la superposición de drift resaltando los accesos inesperados y los dashboards resumiendo el estate.

Qué no está ocurriendo aquí (y qué hacer a continuación)

Sección titulada «Qué no está ocurriendo aquí (y qué hacer a continuación)»
  • Los datos de demo son sintéticos y la contraseña de demo es pública — esto no es un despliegue seguro. Para uno real, sigue self-hosting: no tiene credenciales por defecto y usa un token de configuración de un solo uso.
  • Los endpoints de módulo usados arriba (/v1/m/accessmap/*, /v1/m/inventory/*) son alcanzables pero no forman parte del documento OpenAPI servido por diseño; la referencia de la API documenta la superficie REST del núcleo.
  • Para entender por qué el grafo se construye así (telemetría cooperativa cruzada con la auditoría nativa del almacén, eBPF como red de seguridad, anotaciones MCP tratadas como no confiables), lee la visión general de la arquitectura.