Ir al contenido

Agente de servidor

El agente es un contenedor liviano que corre en tu servidor y le cuenta al CRM qué pasa adentro:

  • cada minuto, el estado de los contenedores (reinicios, CPU, memoria) y el disco y la memoria del servidor;
  • cuando un contenedor se cae, las últimas 200 líneas de su log, que quedan en el incidente;
  • a pedido (desde la web o tu asistente de IA), las últimas líneas del log de un contenedor;
  • las acciones remotas que habilites: reiniciar un contenedor o liberar espacio. Por defecto, ninguna.

Con disco o memoria arriba del 90 % durante 5 minutos, o un contenedor reiniciándose en bucle, el CRM abre un incidente.

No abre puertos: solo hace conexiones salientes al CRM por HTTPS. Sin el agente, todo lo demás de Operación funciona igual.

  • Un servidor Linux con Docker y Docker Compose.
  • Salida a internet por HTTPS hacia el CRM.
  1. En el CRM, entrá a Operación, abrí el despliegue y, en Servidor, tocá Instalar el agente. Copiá el .env del agente que muestra: el token se ve una sola vez.

  2. En el servidor, creá una carpeta nueva (por ejemplo, ~/crm-agent) y guardá ahí el .env.

  3. Al lado, guardá este docker-compose.yml:

    docker-compose.yml
    # Agente de servidor del CRM (RF-219, RF-220). Instrucciones: README.md.
    #
    # 1. En el CRM: Operación → el despliegue → Servidor → "Instalar el agente". Copiá el
    # .env que muestra (el token se ve una sola vez) al lado de este archivo.
    # 2. docker compose pull && docker compose up -d
    # (baja la imagen publicada; para construirla desde el código: docker compose up -d --build)
    #
    # Dos contenedores en una red propia sin salida a internet:
    # - docker-proxy: el único que toca el socket de Docker, y solo deja pasar lo que usa el
    # agente (listar, estadísticas, logs, eventos). Nunca la configuración de un contenedor,
    # que es donde están sus variables de entorno con claves.
    # - crm-agent: habla con el proxy y, por la red por defecto, con el CRM. No abre puertos.
    name: crm-agent
    services:
    crm-agent:
    # P-26: publicada por .github/workflows/agent-image.yml. ":1" sigue las versiones 1.x.
    image: ghcr.io/santicanu/crm-agent:1
    build: .
    restart: unless-stopped
    env_file: .env
    environment:
    DOCKER_HOST: tcp://docker-proxy:2375
    depends_on:
    - docker-proxy
    networks:
    - docker-proxy
    - outbound
    read_only: true
    cap_drop: [ALL]
    security_opt: ["no-new-privileges:true"]
    mem_limit: 96m
    cpus: 0.25
    pids_limit: 64
    docker-proxy:
    image: wollomatic/socket-proxy:1.13.2
    restart: unless-stopped
    # Necesita leer el socket: el grupo dueño de /var/run/docker.sock en el servidor
    # (`stat -c %g /var/run/docker.sock`; suele ser 999 o 998). En Docker Desktop, 0.
    user: "65534:${DOCKER_GID:-999}"
    command:
    - "-loglevel=WARN"
    - "-listenip=0.0.0.0"
    - "-allowfrom=crm-agent"
    - "-allowGET=(/v1\\.[0-9]+)?/(_ping|version|containers/json|containers/[0-9a-f]{12,64}/(stats|logs)|events)"
    - "-allowHEAD=(/v1\\.[0-9]+)?/_ping"
    # RF-220: para que las acciones habilitadas en CRM_AGENT_ACTIONS funcionen, descomentá
    # la línea de abajo. Deja pasar solo reiniciar un contenedor y borrar imágenes sin uso.
    # - "-allowPOST=(/v1\\.[0-9]+)?/(containers/[0-9a-f]{12,64}/restart|images/prune)"
    - "-watchdoginterval=300"
    - "-stoponwatchdog"
    - "-shutdowngracetime=5"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
    - docker-proxy
    read_only: true
    cap_drop: [ALL]
    security_opt: ["no-new-privileges:true"]
    mem_limit: 64m
    networks:
    docker-proxy:
    internal: true
    outbound: {}
  4. Averiguá el grupo del socket de Docker y levantá el agente:

    Ventana de terminal
    export DOCKER_GID=$(stat -c %g /var/run/docker.sock)
    docker compose pull && docker compose up -d
    docker compose logs -f crm-agent

    En Docker Desktop, usá export DOCKER_GID=0.

  5. En un minuto, el servidor aparece En línea en el CRM.

Actualizar: docker compose pull && docker compose up -d. La etiqueta :1 sigue las versiones 1.x.

Si en el mismo servidor corren varios sistemas, cada uno con su proyecto de Docker Compose, en el CRM elegís a qué despliegue pertenece cada proyecto. Las caídas de un contenedor abren el incidente en el despliegue de su sistema; el disco y la memoria, que son del servidor, abren uno solo que nombra los sistemas afectados. Un proyecto se puede ignorar (por ejemplo, pruebas locales) para que sus caídas no abran incidentes.

Se habilitan en el servidor, nunca desde el CRM:

  1. En el .env, agregá las acciones permitidas. Por ejemplo:

    Ventana de terminal
    CRM_AGENT_ACTIONS=restart:nombre-exacto-del-contenedor,prune_images
  2. En el docker-compose.yml, descomentá la línea -allowPOST del proxy.

  3. Aplicá el cambio: docker compose up -d.

Cada acción se pide desde la web, pide confirmación y queda en la bitácora con quién, cuándo y el resultado. Las que pide un asistente de IA esperan que una persona con el permiso Aprobar acciones remotas las apruebe. Una acción que el agente no tomó en 10 minutos vence y no se ejecuta.

Puede No puede
Listar contenedores y leer sus estadísticas, logs y eventos. Ver la configuración de un contenedor, que es donde están sus variables de entorno con claves.
Reiniciar los contenedores de su lista y borrar imágenes sin uso, si lo habilitaste. Crear contenedores, ejecutar comandos, parar o borrar contenedores, bajar imágenes, ver volúmenes.
Conectarse al CRM por HTTPS. Abrir puertos o recibir conexiones.