Όταν ένα αυτοκίνητο αρνείται να ξεκινήσει, ένας καλός μηχανικός δεν αλλάζει τον κινητήρα: κοιτάζει το ταμπλό (ποια λυχνία είναι αναμμένη;), ακούει (ποιος θόρυβος, πότε;), και μόνο ως έσχατη λύση επαναφέρει τα πάντα στο μηδέν. Το εργαστήριο επιδιορθώνεται με τον ίδιο τρόπο. Κίνηση 1, etat: το ταμπλό, τι τρέχει, τι απαντά. Κίνηση 2, journal <service>: ο θόρυβος, οι εκατό τελευταίες γραμμές αυτού που λέει η υπηρεσία, όπου βρίσκεται σχεδόν πάντα η φράση που εξηγεί τα πάντα. Κίνηση 3, reinitialiser: η επαναφορά στο μηδέν, που σβήνει κοντέινερ και δεδομένα και σου δίνει ένα καινούργιο εργαστήριο σε δύο λεπτά. Ανάμεσα στην κίνηση 2 και την κίνηση 3, αυτό το μάθημα σου δίνει έναν κατάλογο δώδεκα βλαβών, ξαναειδωμένων πολλές φορές, η καθεμία με το ακριβές μήνυμά της, την αιτία και τη λύση της. Εννέα στις δέκα φορές, δεν θα φτάσεις μέχρι την κίνηση 3.
Τι σου λέει κάθε κίνηση:
| Κίνηση | Εντολή | Τι διαβάζεις | Πόσος χρόνος |
|---|---|---|---|
| 1 | ./labo.sh etat · .\labo.ps1 etat | στήλη STATUS: Up … (healthy), Up … (unhealthy), Exited (137), ή απόν κοντέινερ· μετά ✔/✘ ανά υπηρεσία και οι μετρητές | 10 δ. |
| 2 | ./labo.sh journal elasticsearch (ή kibana, neo4j, opensearch) | οι 100 τελευταίες γραμμές· ψάξε ERROR, FATAL, bootstrap check, Exception | 1 λεπτό |
| 3 | ./labo.sh reinitialiser μετά demarrer, importer, charger-graphe | ζητά επιβεβαίωση (oui)· διαγράφει κοντέινερ και τόμους | 3 λεπτά |
Η κίνηση 3 αγγίζει μόνο τα κοντέινερ labo-* και τους τρεις τόμους labo-recherche-graphes_es-data, _neo4j-data, _os-data. Χάνεις ό,τι δημιούργησες εσύ ο ίδιος (index δοκιμής, ταμπλό, κόμβοι δοκιμής)· τα δεδομένα του μαθήματος επαναφορτώνονται με importer και charger-graphe.
Ένα υγιές αρχείο καταγραφής, για να αναγνωρίζεις μετά ένα άρρωστο (τρεις πραγματικές γραμμές που καταγράφηκαν με το journal):
labo-elasticsearch | {"@timestamp":"2026-09-09T13:39:45.630Z","log.level": "INFO", "current.health":"GREEN","message":"Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[cours][0]]])." …}
labo-kibana | [2026-09-09T13:37:16.402+00:00][INFO ][status] Kibana is now available
labo-neo4j | 2026-09-09 13:38:32.401+0000 INFO Started.Το Elasticsearch μιλά σε JSON (μία γραμμή ανά γεγονός, πεδίο message), το Kibana σε αγκύλες [ημερομηνία][ΕΠΙΠΕΔΟ][module], το Neo4j σε απλό κείμενο. Οι τρεις παραπάνω φράσεις είναι αυτές που θέλουμε να βλέπουμε. Το Kibana εκπέμπει επίσης WARN χωρίς σοβαρότητα (Error initializing AI assistant resources: Platinum, Enterprise or trial license needed, Error while trying to load prerelease flag): αγνόησέ τα.
Οι δώδεκα βλάβες, κατά σειρά συχνότητας στην αίθουσα μαθήματος. Τα μηνύματα με την ένδειξη «καταγεγραμμένο» αναπαράχθηκαν στο εργαστήριο του μαθήματος· τα υπόλοιπα αναφέρονται όπως τα εκπέμπουν οι κινητήρες.
Θύρα ήδη χρησιμοποιούμενη (καταγεγραμμένο). Το demarrer αποτυγχάνει αμέσως με:
Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint labo-elasticsearch (…): Bind for 0.0.0.0:9200 failed: port is already allocatedΑιτία: κάποιο άλλο πρόγραμμα ακούει ήδη στη θύρα 9200 (ένα Elasticsearch εγκατεστημένο «σκληρά», κάποιο άλλο έργο Docker), ή 5601, 7474, 7687. Λύση: το prerequis σου λέει ποια θύρα· βρες τον υπαίτιο (Get-NetTCPConnection -LocalPort 9200 σε PowerShell, sudo ss -ltnp | grep 9200 σε Linux/macOS), σταμάτησέ τον ή, αν πρέπει να τον κρατήσεις, άλλαξε τη θύρα από την πλευρά του host στο docker-compose.yml ("9202:9200") και προσάρμοσε τις διευθύνσεις του μαθήματος.
Κοντέινερ Exited (137). Το etat εμφανίζει labo-elasticsearch Exited (137) 2 minutes ago, και το αρχείο καταγραφής σταματά απότομα χωρίς μήνυμα σφάλματος. Αιτία: κωδικός 137 = σκοτώθηκε από το σήμα 9, σχεδόν πάντα ο OOM killer: το Docker δεν έχει αρκετή μνήμη για τρεις JVM (τα Elasticsearch και Neo4j απαιτούν έως 1 GB σωρού το καθένα, συν το Kibana). Το docker inspect labo-elasticsearch --format '{{.State.OOMKilled}}' απαντά true. Λύση: μάθημα 02, βήμα 1 ή 2: ανέβασε τη μνήμη του Docker στα 6 GB (.wslconfig μετά wsl --shutdown σε Windows), μετά demarrer. Μην ενεργοποιείς το προφίλ OpenSearch κάτω από 6 GB.
Linux: το vm.max_map_count πολύ χαμηλό. Το Elasticsearch (ή το OpenSearch) βγαίνει μέσα σε λίγα δευτερόλεπτα και το αρχείο καταγραφής του τελειώνει με:
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/labo.logΑιτία: όριο του πυρήνα Linux του host, που το κοντέινερ δεν μπορεί να αλλάξει μόνο του. Λύση: sudo sysctl -w vm.max_map_count=262144, κάνε το μόνιμο στο /etc/sysctl.conf (μάθημα 02, βήμα 3), μετά demarrer. Σε Docker Desktop (Windows, macOS), η τιμή είναι ήδη 262144.
«Kibana server is not ready yet». Η σελίδα http://localhost:5601 εμφανίζει μόνο αυτή τη φράση. Αιτία: το Kibana περιμένει το Elasticsearch. Είτε είναι πολύ νωρίς (τα πρώτα 40 δευτερόλεπτα), είτε το Elasticsearch έχει πέσει (βλάβη 2 ή 3), και το journal kibana επαναλαμβάνει Unable to retrieve version information from Elasticsearch nodes. connect ECONNREFUSED 172.x.x.x:9200. Λύση: etat. Αν το Elasticsearch είναι healthy, περίμενε ένα λεπτό και ανανέωσε· αλλιώς, επιδιόρθωσε πρώτα το Elasticsearch, το Kibana θα ακολουθήσει μόνο του (restart: unless-stopped).
Δίσκος σχεδόν γεμάτος: index σε λειτουργία μόνο ανάγνωσης. Στο 95% γεμάτου δίσκου, ένα τυπικό Elasticsearch καταγράφει flood stage disk watermark [95%] exceeded on […] all indices on this node will be marked read-only και κάθε εγγραφή απαντά 429: cluster_block_exception … blocked by: [TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block]. Στο εργαστήριο, δεν θα δεις αυτό το μήνυμα: το compose ορίζει cluster.routing.allocation.disk.threshold_enabled=false (επαληθεύσιμο με GET _nodes/settings?filter_path=nodes.*.settings.cluster.routing). Ο εναπομείνας κίνδυνος είναι το no space left on device στο αρχείο καταγραφής κατά τη διάρκεια του importer. Λύση: docker system df για μέτρηση, docker image prune για απελευθέρωση, μετά ξανατρέξε το importer.
Το Neo4j αρνείται τον κωδικό πρόσβασης (καταγεγραμμένο). Στο Neo4j Browser: Connection to instance failed — The client is unauthorized due to authentication failure. (λεπτομέρειες: Neo.ClientError.Security.Unauthorized). Στο etat: ✘ Neo4j ne répond pas, και στη γραμμή εντολών το cypher-shell λέει The client is unauthorized due to authentication failure. Αιτία Α: ορθογραφικό λάθος, ο κωδικός είναι aiopsatlas2026. Αιτία Β, πιο ύπουλη: ο τόμος neo4j-data δημιουργήθηκε σε προηγούμενη εκκίνηση με άλλον κωδικό· το NEO4J_AUTH εφαρμόζεται μόνο στην πρώτη-πρώτη αρχικοποίηση, και το αρχείο καταγραφής το λέει καθαρά (γραμμή καταγεγραμμένη): Changed password for user 'neo4j'. IMPORTANT: this change will only take effect if performed before the database is started for the first time. Λύση Α: ξαναπληκτρολόγησε. Λύση Β: reinitialiser μετά demarrer και charger-graphe.
Σύγκρουση ονόματος κοντέινερ (καταγεγραμμένο). Το demarrer αποτυγχάνει με:
Error response from daemon: Conflict. The container name "/labo-elasticsearch" is already in use by container "a26fe0358d63…". You have to remove (or rename) that container to be able to reuse that name.Αιτία: ένα κοντέινερ labo-elasticsearch υπάρχει ήδη αλλά δεν ανήκει σε αυτό το έργο Compose, συνήθως επειδή κλωνοποίησες το kit σε δεύτερο φάκελο, ή έτρεξες ένα docker run --name labo-elasticsearch με το χέρι. Λύση: docker rm -f labo-elasticsearch (μόνο το κοντέινερ, τα δεδομένα του τόμου παραμένουν), μετά demarrer. Αν η σύγκρουση αφορά και τα πέντε ονόματα, docker rm -f $(docker ps -aq --filter name=labo-).
Το Git Bash ξαναγράφει τις διαδρομές /labo (καταγεγραμμένο). Σε Windows, στο Git Bash, μια εντολή πληκτρολογημένη με το χέρι όπως docker compose exec -T neo4j ls /labo/cypher απαντά:
ls: cannot access 'C:/Program Files/Git/labo/cypher': No such file or directoryΑιτία: η προσομοίωση MSYS του Git Bash μετατρέπει κάθε όρισμα που ξεκινά με / σε διαδρομή Windows πριν το περάσει στο docker. Λύση: το labo.sh εξάγει MSYS_NO_PATHCONV=1 και MSYS2_ARG_CONV_EXCL='*' ήδη από τη δεύτερη γραμμή του, άρα όλες οι εντολές του σεναρίου είναι προστατευμένες. Για τις δικές σου εντολές στο Git Bash, βάλε το πρόθεμα: MSYS_NO_PATHCONV=1 docker compose exec -T neo4j ls /labo/cypher (καταγεγραμμένο: εμφανίζεται η λίστα των αρχείων .cypher).
Το PowerShell 5.1 και το Invoke-RestMethod χαλάνε τους τόνους (καταγεγραμμένο). Στέλνεις ένα ερώτημα με μια τονισμένη λέξη από το PowerShell:
$corps = '{"analyzer":"french","text":"déployés en production"}'
Invoke-RestMethod -Uri http://localhost:9200/cours/_analyze -Method Post -ContentType 'application/json' -Body $corpsΤο PowerShell 5.1 απαντά Le serveur distant a retourné une erreur : (400) Demande incorrecte.· από την πλευρά του Elasticsearch η αιτία είναι x_content_parse_exception … Invalid UTF-8 middle byte 0x70. Αιτία: το PowerShell 5.1 κωδικοποιεί το σώμα σε Latin-1 ενώ το Elasticsearch περιμένει UTF-8· η ίδια εντολή σε PowerShell 7 λειτουργεί. Λύση: πέρνα από το Kibana Dev Tools για όλα τα ερωτήματα του μαθήματος (εγγυημένο UTF-8)· το ίδιο το labo.ps1 χρησιμοποιεί curl μέσα στα κοντέινερ. Για να γράψεις σενάριο παρόλα αυτά: PowerShell 7, ή -Body ([System.Text.Encoding]::UTF8.GetBytes($corps)).
Το Docker Desktop δεν έχει εκκινηθεί. Κάθε εντολή docker (άρα prerequis, etat, demarrer) αποτυγχάνει με:
error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.51/info": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.(Cannot connect to the Docker daemon at unix:///var/run/docker.sock σε macOS/Linux.) Το prerequis μεταφράζει: ✘ le démon Docker ne répond pas — lancez Docker Desktop et attendez l'icône verte. Αιτία: το Docker Desktop είναι κλειστό, ή ακόμα ξεκινά μετά από μια συνεδρία Windows. Λύση: εκτέλεσε το Docker Desktop, περίμενε το εικονίδιο να σταματήσει να κινείται, ξανατρέξε την εντολή. Τα κοντέινερ με restart: unless-stopped ξεκινούν μόνα τους.
Πολύ αργό κατέβασμα ή TLS handshake timeout. Κατά τη διάρκεια του == Téléchargement des images ==:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeoutή failed to copy: read tcp … connection reset by peer. Αιτία: κορεσμένο δίκτυο, wifi σχολείου, εταιρικό proxy· οι εικόνες ζυγίζουν 2,5 έως 2,8 GB η καθεμία. Λύση: τίποτα να επιδιορθώσεις, ξανατρέξε demarrer: το Docker συνεχίζει από τα ήδη κατεβασμένα layers (Already exists). Πίσω από proxy, ρύθμισέ το στο Docker Desktop → Settings → Resources → Proxies.
Γεμάτος τόμος ή κατεστραμμένα δεδομένα: η επαναφορά στο μηδέν. Ποικίλα συμπτώματα: το etat εμφανίζει το cluster σε red, το αρχείο καταγραφής του Elasticsearch μιλά για CorruptIndexException ή για no space left on device, το Neo4j μένει κολλημένο σε recovery μετά από απότομο σταμάτημα του υπολογιστή, ή απλούστερα τίποτα δεν βγάζει πια νόημα μετά από έναν απερίσκεπτο χειρισμό. Λύση, η κίνηση 3:
./labo.sh reinitialiser # répondre : oui
./labo.sh demarrer
./labo.sh importer
./labo.sh charger-graphe.\labo.ps1 reinitialiser
.\labo.ps1 demarrer
.\labo.ps1 importer
.\labo.ps1 charger-grapheΑυτό που πρέπει να δεις: το reinitialiser εκτελεί docker compose --profile opensearch down -v --remove-orphans και επιβεβαιώνει ✔ labo remis à zéro. Οι εικόνες παραμένουν στην cache: κανένα νέο κατέβασμα, και η επόμενη τριάδα εντολών παίρνει δύο με τρία λεπτά. Αυτό που πρέπει να ξέρεις: το arreter (χωρίς -v) διατηρεί τα δεδομένα· το reinitialiser τα σβήνει, αυτή είναι η μόνη διαφορά.
Το etat δεν απαριθμεί κανένα κοντέινερ και το demarrer ξαναδημιουργεί τα πάντα κάθε φορά → Εκτελείς το σενάριο από ένα δεύτερο αντίγραφο του αποθετηρίου. Κράτα ένα μόνο αντίγραφο του kit και εκτέλεσε πάντα τις εντολές από τη ρίζα του.
Το journal εμφανίζει χιλιάδες δυσανάγνωστες γραμμές JSON → Φυσιολογικό για το Elasticsearch. Φιλτράρισμα στις λέξεις-κλειδιά: σε PowerShell .\labo.ps1 journal elasticsearch | Select-String 'ERROR|WARN|bootstrap', σε bash ./labo.sh journal elasticsearch | grep -E 'ERROR|WARN|bootstrap'.
Μετά το reinitialiser, το Kibana εμφανίζει ξανά «Vos données ne sont pas sécurisées» → Κανονικό banner ενός Kibana χωρίς ασφάλεια· επανεμφανίζεται επειδή η διαμόρφωση του Kibana σβήστηκε μαζί με τον τόμο. Κάνε κλικ «Rejeter».
etat (τι δεν πάει καλά), journal <service> (γιατί), reinitialiser (έσχατη λύση, σβήνει τα δεδομένα του εργαστηρίου αλλά όχι τις εικόνες).Exited (137) = μνήμη· port is already allocated = θύρα κατειλημμένη· vm.max_map_count [65530] is too low = Linux προς ρύθμιση· Neo.ClientError.Security.Unauthorized = κωδικός πρόσβασης· container name … already in use = docker rm.labo.sh εξουδετερώνει τη μετατροπή διαδρομών του Git Bash.Invoke-RestMethod σε PowerShell 5.1: το Dev Tools και το labo.ps1 αναλαμβάνουν αυτό σωστά.arreter κρατά τα δεδομένα, το reinitialiser τα σβήνει. Τα δεδομένα του μαθήματος επαναφορτώνονται πάντα με δύο εντολές.Το docker inspect --format '{{.State.Health.Status}}' labo-elasticsearch επιστρέφει starting, healthy ή unhealthy: είναι ακριβώς αυτό που διαβάζει το demarrer κάθε τρία δευτερόλεπτα. Το {{json .State.Health.Log}} δείχνει τα πέντε τελευταία αποτελέσματα του healthcheck.