Iniciar el laboratorio y hacer un recorrido por las interfaces

11 min
Público
principiante, requisitos previos de la lección 02 todos en verde
Duración
30 min (más la primera descarga de imágenes)
Módulo
1/7
Competencia objetivo
iniciar la stack, cargar los datos, leer etat, enviar una primera consulta en Kibana Dev Tools y en Neo4j Browser

En una imagen

Iniciar el laboratorio es como encender un edificio de tres pisos. demarrer pulsa el interruptor general, luego un conserje pasa por cada piso a verificar que la luz esté realmente encendida antes de darte las llaves: ese conserje son los healthchecks de Docker Compose. Kibana ni siquiera tiene permiso para iniciar antes de que Elasticsearch sea declarado saludable. Luego importer llena las estanterías de Elasticsearch, charger-graphe llena las de Neo4j, y etat te da el plano del edificio: quién está ahí, quién responde, cuántos documentos hay en cada índice. El resto de la lección es un recorrido guiado por las dos salas donde pasarás el curso: la consola Dev Tools de Kibana y Neo4j Browser.

Cómo funciona

demarrer encadena tres etapas de docker compose: pull (descarga las imágenes, ~6 GB la primera vez, nada después), up -d (crea e inicia los contenedores en segundo plano), luego un bucle de espera que interroga docker inspect cada 3 segundos hasta que cada contenedor esté healthy.

La palabra healthy viene del docker-compose.yml. Cada servicio declara ahí una prueba que Docker repite regularmente:

ServicioPrueba ejecutada en el contenedorRitmo
elasticsearchcurl -fsS http://localhost:9200/_cluster/health debe contener "status":"green" o "yellow"cada 10 s, 30 intentos, 30 s de gracia al inicio
kibanacurl -fsS http://localhost:5601/api/status debe contener "level":"available"cada 10 s, 30 intentos, 40 s de gracia
neo4jwget -qO- http://localhost:7474 respondecada 10 s, 30 intentos, 30 s de gracia

Mientras la prueba falla, el contenedor está starting; cuando tiene éxito, healthy; después de 30 fallos, unhealthy. El servicio kibana declara depends_on: elasticsearch: condition: service_healthy: Compose no lo inicia hasta que Elasticsearch esté healthy, lo que evita el famoso «Kibana server is not ready yet» al inicio.

Dos detalles del archivo compose merecen una palabra desde ahora. xpack.security.enabled=false: sin contraseña ni certificado para Elasticsearch, es un laboratorio local, nunca una configuración de producción. cluster.routing.allocation.disk.threshold_enabled=false: Elasticsearch no pondrá tus índices en solo lectura si tu disco supera el 95 % (lección 04, fallo n.º 5).

Paso a paso

El kit del laboratorio primero. Todo lo que sigue se lanza desde la raíz del kit — https://github.com/hrhouma2/aiopsatlas-recherche-graphes-labo-fr — obtenido con git clone https://github.com/hrhouma2/aiopsatlas-recherche-graphes-labo-fr o con el botón Code → Download ZIP (lección 02, paso 4). Si dir (o ls) no muestra docker-compose.yml, labo.sh y labo.ps1, no estás en el lugar correcto.

Todas las consultas de esta lección: elasticsearch/requetes/01-03-premiere-visite.txt.

  1. Iniciar la stack. Desde la carpeta del kit:

    bash
    ./labo.sh demarrer
    powershell
    .\labo.ps1 demarrer

    El script muestra tres bloques: == Téléchargement des images == (largo la primera vez, silencioso después), == Démarrage == (las líneas Container labo-elasticsearch Started de Compose), luego == Attente que chaque service soit prêt == donde cada línea se llena de puntos hasta prêt (…s). Termina con:

    text
    Le labo est prêt.
      Kibana                 http://localhost:5601   (Dev Tools : menu ☰ → Management → Dev Tools)
      Elasticsearch          http://localhost:9200
      Neo4j Browser          http://localhost:7474   (utilisateur neo4j · mot de passe aiopsatlas2026)
    
    Étape suivante : ./labo.sh importer   puis   ./labo.sh charger-graphe

    Lo que debes ver: tres prêt (elasticsearch, kibana, neo4j). Cuenta uno a dos minutos después de la descarga. Si una línea muestra unhealthy, exited o délai dépassé, ve a la lección 04.

  2. Cargar los índices de Elasticsearch.

    bash
    ./labo.sh importer

    El comando crea cada índice con su mapping (archivos elasticsearch/mappings/*.json) luego envía los datos a la API _bulk. Salida real, aquí en un laboratorio donde los índices ya existían (el comando se puede repetir sin riesgo):

    text
    == Import dans elasticsearch ==
    — index cours existe déjà — conservé
      ✔ données cours chargées
    — index avis existe déjà — conservé
      ✔ données avis chargées
    — index acces existe déjà — conservé
      ✔ données acces chargées
    
    index docs.count store.size
    acces      12000      1.5mb
    avis         609     74.6kb
    cours        504    183.6kb
    
    Import terminé. Attendu : cours = 504, avis = 609, acces = 12000.

    Lo que debes ver: la primera vez, las líneas se convierten en ✔ index cours créé avec son mapping. Los tres contadores deben ser exactamente 504, 609 y 12000; los documentos llevan su propio _id, así que relanzar la importación nunca crea duplicados.

  3. Cargar el grafo de Neo4j.

    bash
    ./labo.sh charger-graphe

    El script ejecuta neo4j/cypher/01-contraintes.cypher (restricciones de unicidad e índices) luego 02-charger.cypher (LOAD CSV + MERGE para cada archivo de neo4j/import/). Termina con el balance que calcula la última consulta del script, MATCH (n) RETURN labels(n)[0] AS etiquette, count(*) AS noeuds ORDER BY etiquette:

    text
    etiquette, noeuds
    "Competence", 22
    "Cours", 504
    "Etudiant", 300
    "Professeur", 30
    "Ville", 16
    
    Graphe chargé. Attendu : Competence 22, Cours 504, Etudiant 300, Professeur 30, Ville 16.

    Lo que debes ver: 872 nodos en total. Todo está en MERGE, así que relanzar el comando no crea ningún duplicado.

  4. Leer el estado del laboratorio. Es el comando que escribirás con más frecuencia:

    bash
    ./labo.sh etat

    Salida real (aquí con el perfil OpenSearch activo, que no aparecerá en tu caso antes del módulo 5):

    text
    == Conteneurs ==
    NAME                         STATUS                    PORTS
    labo-elasticsearch           Up 16 minutes (healthy)   0.0.0.0:9200->9200/tcp, [::]:9200->9200/tcp
    labo-kibana                  Up 16 minutes (healthy)   0.0.0.0:5601->5601/tcp, [::]:5601->5601/tcp
    labo-neo4j                   Up 14 minutes (healthy)   0.0.0.0:7474->7474/tcp, [::]:7474->7474/tcp, 0.0.0.0:7687->7687/tcp, [::]:7687->7687/tcp
    labo-opensearch              Up 16 minutes (healthy)   0.0.0.0:9201->9200/tcp, [::]:9201->9200/tcp
    labo-opensearch-dashboards   Up 16 minutes             0.0.0.0:5602->5601/tcp, [::]:5602->5601/tcp
    
    == Services ==
      ✔ Elasticsearch : {"status":"green","number_of_nodes":1}
         index : acces 12000 avis    609 cours   504
      ✔ Kibana répond (http://localhost:5601)
      ✔ Neo4j répond — nœuds : 872
      ✔ OpenSearch : {"status":"green","number_of_nodes":1}

    Lo que debes ver: (healthy) en cada línea de contenedor, green para el cluster, los tres contadores de índices y 872 nodos. Sin OpenSearch, la última línea dice — OpenSearch non démarré (profil optionnel : ./labo.sh demarrer opensearch).

  5. Abrir Kibana Dev Tools. Ve a http://localhost:5601. Kibana está en francés (I18N_LOCALE=fr-FR). Haz clic en el menú en la parte superior izquierda; en la sección Management, elige Outils de développement (es la traducción de «Dev Tools»; la ruta de navegación muestra Outils de développement > Console). Llegas a la pestaña Console, subpestaña Shell: un editor a la izquierda, la respuesta a la derecha. El botón Effacer cette entrée vacía el editor de ejemplo.

    Lo que debes ver: cuando escribes una consulta, aparece un botón ▶ («Cliquer pour envoyer la requête») al final de la línea. Atajo: Ctrl + Enter (⌘ + Enter en Mac) envía la consulta bajo el cursor. En la parte inferior derecha de la respuesta, Kibana muestra el código HTTP y la duración, por ejemplo 200 - OK 23 ms.

  6. Primera consulta: la salud del cluster.

    text
    GET _cluster/health
    json
    {
      "cluster_name": "labo",
      "status": "green",
      "timed_out": false,
      "number_of_nodes": 1,
      "number_of_data_nodes": 1,
      "active_primary_shards": 53,
      "active_shards": 53,
      "unassigned_shards": 0,
    
      "active_shards_percent_as_number": 100
    }

    Lo que debes ver: "status": "green". Los índices del laboratorio se crean con number_of_replicas: 0, así que no hay réplica pendiente: green en un solo nodo. El número de shards (53) incluye índices de sistema de Kibana; puede variar.

  7. ¿Quién responde, y qué índices existen?

    text
    GET /

    Respuesta: "name": "labo-es-1", "cluster_name": "labo", "version": { "number": "9.5.3", …, "lucene_version": "10.5.1" }, "tagline": "You Know, for Search".

    text
    GET _cat/indices/cours,avis,acces?v&s=index
    text
    health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
    green  open   acces aii68fsfQXKyt5wqkE1mPA   1   0      12000            0      1.5mb          1.5mb        1.5mb
    green  open   avis  W9j_JrwJT4mdzpWcS5k7xg   1   0        609            0     74.6kb         74.6kb       74.6kb
    green  open   cours pmq403ZgSZWeHJY9uNw1Qw   1   0        504            0    183.6kb        183.6kb      183.6kb

    Lo que debes ver: pri 1, rep 0, y los tres contadores. ?v añade la línea de encabezado, s=index ordena por nombre. Sin el filtro cours,avis,acces, GET _cat/indices?v también lista índices internos que empiezan con un punto (.internal.alerts-…): ignóralos.

  8. El nodo y los conteos.

    text
    GET _cat/nodes?v
    text
    ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
    172.24.0.2           39          63   2    0.43    0.38     0.64 cdfhilmrstw *      labo-es-1
    text
    GET cours/_count
    json
    { "count": 504, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 } }

    Lo mismo para GET avis/_count"count": 609 y GET acces/_count"count": 12000. Lo que debes ver: un solo nodo, master *, y heap.percent alrededor del 40 % con el ajuste -Xmx1g del compose.

  9. Un primer documento.

    text
    GET cours/_search
    json
    {
      "query": { "match_all": {} },
      "size": 1
    }

    Respuesta (truncada):

    json
    {
      "took": 1,
      "hits": {
        "total": { "value": 504, "relation": "eq" },
        "max_score": 1,
        "hits": [
          {
            "_index": "cours",
            "_id": "C0001",
            "_score": 1,
            "_source": {
              "id": "C0001",
              "titre": "Docker expliqué simplement",
              "categorie": "DevOps", "sujet": "Docker", "niveau": "debutant",
              "prix": 129, "note_moyenne": 4.4, "nb_avis": 327,
              "professeur": { "id": "P001", "nom": "Karim Caron", "ville": "Gatineau" },
    
            }
          }
        ]
      }
    }

    Lo que debes ver: hits.total.value = 504 (todos los documentos corresponden a match_all) pero solo uno se devuelve gracias a size: 1. Dev Tools envía un GET con cuerpo en POST por debajo; ambos se aceptan.

  10. Abrir Neo4j Browser y conectarse. Ve a http://localhost:7474. La ventana Connect to instance ya propone Protocol neo4j:// y Connection URL localhost:7687 (el puerto Bolt, no 7474). Deja Database user en neo4j, escribe el Password aiopsatlas2026, haz clic en Connect. Lo que debes ver: arriba, un punto verde y Instance: neo4j://localhost:7687, Database: neo4j, User: neo4j. El panel Database information a la izquierda muestra Nodes (872) con las etiquetas Competence, Cours, Etudiant, Professeur, Ville, y Relationships (3,712) con COUVRE, ENSEIGNE, HABITE, INSCRIT_A, PREREQUIS_DE. La barra lateral propone Database overview, Saved Cypher, History, Cypher reference, Parameters, Settings (la interfaz está en inglés).

  11. Primera consulta Cypher. En el editor de arriba (neo4j$), escribe y luego haz clic en Run (o Ctrl + Enter):

    cypher
    MATCH (c:Cours) RETURN c LIMIT 25

    Lo que debes ver: un cuadro de resultados con tres vistas Graph, Table, Raw, y a la derecha Results overview: Nodes (25) · Cours (25). En la vista Graph, 25 burbujas naranjas; haz clic en una para ver sus propiedades (id, titre, categorie, prix…). En la vista Table, los mismos 25 nodos en JSON. El módulo 6 te enseña a escribir estas consultas; por ahora, ya sabes dónde escribirlas.

  12. ¿Y OpenSearch? El laboratorio también puede iniciar OpenSearch 3.8.0 y OpenSearch Dashboards en los puertos 9201 y 5602, con ./labo.sh demarrer opensearch luego ./labo.sh importer opensearch. Es un perfil opcional de Compose: no se inicia por defecto, y reclama 6 GB de memoria para Docker. Lo activamos en el módulo 5, para repetir las mismas consultas en ambos motores y comparar. Nada que hacer hoy.

Si algo falla

  • Kibana muestra «Kibana server is not ready yet» justo después de demarrer → Kibana ha iniciado pero aún no ha terminado de conectarse a Elasticsearch y de crear sus índices internos. Espera 30 segundos y recarga la página. Si el mensaje persiste más de dos minutos, ./labo.sh journal kibana (lección 04, fallo n.º 4).

  • Dev Tools responde 404 con "type": "index_not_found_exception", "reason": "no such index [cour]" → Error de tipeo en el nombre del índice (cour en lugar de cours). Elasticsearch no adivina; GET _cat/indices?v te da los nombres exactos. Variante: 400 con "no handler found for uri [/cours/_serch] and method [GET]" → es el nombre de la API el que está mal escrito (_serch).

  • Dev Tools responde 400 con x_content_parse_exception … was expecting double-quote to start field name → El JSON está mal formado, casi siempre una coma de más antes de la llave de cierre ("size": 1, }). El editor subraya la línea errónea en rojo incluso antes de enviarla.

  • Neo4j Browser: «Connection to instance failed — The client is unauthorized due to authentication failure.» (detalles: Neo.ClientError.Security.Unauthorized) → Contraseña errónea. Es aiopsatlas2026 (fijada por NEO4J_AUTH en el compose), no la contraseña por defecto neo4j. Vuelve a escribirla, sin espacio final.

  • etat muestra Neo4j répond — nœuds : 0 → El contenedor está corriendo pero olvidaste charger-graphe. Lánzalo; toma unos treinta segundos.

Para recordar

  • El trío de inicio: demarrer, importer, charger-graphe. Los dos últimos se pueden repetir sin crear duplicados (identificadores explícitos del lado de Elasticsearch, MERGE del lado de Neo4j).
  • demarrer espera el estado healthy de cada contenedor; ese estado viene de los healthchecks del docker-compose.yml, y Kibana solo inicia después de Elasticsearch gracias a depends_on … service_healthy.
  • etat de un vistazo: (healthy) en todas partes, cluster green, 504 / 609 / 12000 documentos, 872 nodos.
  • Kibana Dev Tools: menú ☰ → Management → Outils de développement; una consulta = una línea GET ruta seguida de su JSON pegado debajo; Ctrl + Enter para enviar.
  • Neo4j Browser: http://localhost:7474, conexión Bolt en localhost:7687, usuario neo4j, contraseña aiopsatlas2026; los resultados se leen en Graph, Table o Raw.

Para ir más allá

El archivo 01-03-premiere-visite.txt está en el formato exacto de Dev Tools: en la consola, el botón Importer les requêtes (icono arriba a la derecha del editor) acepta este archivo y lo pega en el editor. Todos los archivos de la carpeta elasticsearch/requetes/ funcionan así; nunca tendrás que volver a escribir una consulta del curso.