Ευρετήριο ημερολογίουDockup / σημείωση πεδίου
Note / self-host-jupyterlab

Πώς να φιλοξενήσετε το JupyterLab μόνοι σας το 2026: tokens, kernels και notebooks με μόνιμη αποθήκευση

Αναπτύξτε το JupyterLab με τη σωστή θύρα, μόνιμη αποθήκευση, TLS, authentication και backups. Αντιμετωπίστε προβλήματα όταν ο proxy απορρίπτει τα WebSockets των kernels σε production.

Το πιο σύντομο demo του JupyterLab αποδεικνύει ότι μια διεργασία ακούει στη θύρα 8888. Το production απαιτεί ισχυρότερες αποδείξεις. Πρέπει να περνά αυτό το σενάριο ακόμη και μετά την αντικατάσταση του container: σύνδεση με token, εκκίνηση kernel, εκτέλεση ενός κελιού notebook, αποθήκευση του output, επανασύνδεση του WebSocket και εκ νέου άνοιγμα του notebook.

Το JupyterLab αναπτύσσεται για έναν σαφή σκοπό: notebooks στον browser, δίπλα στα δεδομένα και τους υπολογιστικούς πόρους. Η συνηθέστερη παγίδα στην ανάπτυξή του είναι ο proxy να απορρίπτει τα WebSockets των kernels ή τα mounted notebooks να ανήκουν στον root. Επομένως, η διαχείριση του public URL και η μόνιμη κατάσταση χρειάζονται την ίδια προσοχή με την εκκίνηση του image.

Αποδείξτε ότι το JupyterLab επιβιώνει από αντικατάσταση

Καταγράψτε κάθε artifact που πρέπει να διατηρείται: notebooks, δεδομένα, environments και αρχεία αναπαραγώγιμων dependencies. Κάντε mount το /home/jovyan/work πριν από το bootstrap, γράψτε harmless sample data και αντικαταστήστε το container για να αποδείξετε ότι η συγκεκριμένη διαδρομή είναι πράγματι persistent. Συμπεριλάβετε configuration που αλλάζει τον τρόπο ερμηνείας των αποθηκευμένων δεδομένων, όχι μόνο τον μεγαλύτερο κατάλογο.

Ορίστε retention, αντιγράψτε τα backups εκτός host και εκτελέστε restore σε clean-room περιβάλλον. Το drill του JupyterLab ολοκληρώνεται όταν επανέλθουν τα notebooks, τα δεδομένα και οι προδιαγραφές του environment και ένα αντιπροσωπευτικό cell παράγει το αναμενόμενο αποτέλεσμα. Αν τα snapshots αποτελούν μέρος του πλάνου, χρησιμοποιήστε τις οδηγίες PITR έναντι snapshot για να τεκμηριώσετε τι μπορεί να ανακτήσει κάθε μηχανισμός.

Καθορίστε πρώτα την επιτυχία για το JupyterLab

Μην αφήσετε το image του JupyterLab να καθορίσει κατά λάθος την αρχιτεκτονική production. Το image παρέχει μια διεργασία στη θύρα 8888· η αποθήκευση, το routing και οι εξωτερικές απαιτήσεις εξακολουθούν να χρειάζονται προσεκτικά καθορισμένους κύκλους ζωής. Η απαίτηση του local runtime είναι ρητά data mounts και υπολογιστικοί πόροι κατάλληλου μεγέθους για notebook workloads. Διατηρήστε τον κύκλο ζωής του σαφή, ώστε η μεταφορά του JupyterLab μεταξύ hosts να μην αλλάζει αθόρυβα τη συμπεριφορά του.

Η ανάπτυξη είναι έτοιμη για βαθύτερο testing όταν μπορεί να πραγματοποιήσει σύνδεση με token, να εκκινήσει kernel, να εκτελέσει ένα cell notebook, να αποθηκεύσει το output, να επανασυνδέσει το WebSocket και να ανοίξει ξανά το notebook. Παρακολουθήστε τη συναλλαγή στα logs και μετρήστε τη RAM και το CPU των kernels, τα αντίγραφα δεδομένων, το model training και τις διεργασίες language server, αντί για το web UI του JupyterLab. Αυτές οι παρατηρήσεις δείχνουν αν η τρέχουσα τοπολογία απομονώνει το σωστό component.

Πέντε έλεγχοι ισχυρότεροι από το health του container

Το release record για το JupyterLab χρειάζεται facts, όχι ένα «φαίνεται εντάξει». Αποθηκεύστε το επιλεγμένο image digest, το configuration checksum, το public hostname και ένα timestamped αποτέλεσμα για τα εξής: σύνδεση με token, εκκίνηση kernel, εκτέλεση ενός cell notebook, αποθήκευση output, επανασύνδεση του WebSocket και εκ νέου άνοιγμα του notebook. Χρησιμοποιήστε sample data εκτός production, ώστε ο έλεγχος να μπορεί να εκτελείται μετά από κάθε deployment.

Αποδείξτε ξεχωριστά δύο lifecycle events. Η αντικατάσταση ενός container πρέπει να διατηρεί την κανονική λειτουργία· ένα clean recovery πρέπει να δείχνει ότι επανέρχονται τα notebooks, τα δεδομένα και οι προδιαγραφές του environment και ότι ένα αντιπροσωπευτικό cell παράγει το αναμενόμενο αποτέλεσμα. Κατά την εκτέλεση των ελέγχων, μετρήστε τη RAM και το CPU των kernels, τα αντίγραφα δεδομένων, το model training και τις διεργασίες language server, αντί για το web UI του JupyterLab, και διατηρήστε το αποτέλεσμα ως το αναμενόμενο envelope για αυτή την έκδοση.

Ελέγξτε επίσης μια denied ή invalid συνθήκη: υποβάλετε harmless input κοντά στο όριο πόρων ή format που σχετίζεται με αυτό το boundary: ο proxy απορρίπτει τα WebSockets των kernels ή τα mounted notebooks ανήκουν στον root. Το JupyterLab πρέπει να αποτυγχάνει με τρόπο που διευκολύνει τη διάγνωση και να μην αντικαθιστά υγιή state. Επαναφέρετε τη valid συνθήκη, εκτελέστε ξανά το sample και επισυνάψτε τα σχετικά redacted logs. Αυτά τα artifacts προσφέρουν συγκεκριμένες αποδείξεις για μια μελλοντική απόφαση rollback.

Εκκινήστε το JupyterLab με παρατηρήσιμες προεπιλογές

Το πρώτο container πρέπει να διαγράφεται και να δημιουργείται ξανά εύκολα. Κρατήστε τα δεδομένα εκτός του writable layer, κάντε bind τη θύρα 8888 μόνο εκεί όπου μπορεί να φτάσει ο proxy και περάστε το configuration κατά το runtime.

docker run -d \
  --name jupyterlab \
  --restart unless-stopped \
  -p 127.0.0.1:8888:8888 \
  -v jupyterlab-data:/home/jovyan/work \
  -e JUPYTER_TOKEN=replace-with-a-long-random-value \
  quay.io/jupyter/minimal-notebook:latest

Κάντε pin το image μετά το αρχικό test. Διαβάστε το πρώτο startup error αντί για το τελικό μήνυμα restart, επαληθεύστε κάθε mount με docker inspect και παρακολουθήστε τα logs ενώ πραγματοποιείτε σύνδεση με token, εκκινείτε kernel, εκτελείτε ένα cell notebook, αποθηκεύετε το output, επανασυνδέετε το WebSocket και ανοίγετε ξανά το notebook. Αυτή η ακολουθία ξεχωρίζει μια λανθασμένη εντολή image από ένα πρόβλημα dependency ή permissions.

Μην δώσετε στο JupyterLab ολόκληρο το host

Κλείστε το bootstrap window μόλις υπάρξει ο πρώτος έμπιστος administrator. Η συγκεκριμένη παγίδα του JupyterLab είναι να απενεργοποιήσετε το token σε notebook που εκτίθεται στο internet ή να κάνετε mount ευρείες διαδρομές του host. Το ασφαλέστερο boundary είναι να διατηρήσετε ενεργό το token authentication, να κάνετε mount μόνο τα προβλεπόμενα δεδομένα και να μην εκθέτετε απερίσκεπτα ένα privileged terminal του host.

Χειριστείτε το JUPYTER_TOKEN σύμφωνα με τον ρόλο του στο JupyterLab: κρατήστε τις ευαίσθητες τιμές εκτός Git, τεκμηριώστε τις επιπτώσεις του rotation και μην αντικαθιστάτε ποτέ ένα public example σε production. Το private networking πρέπει να μεταφέρει τα credentials των dependencies, ενώ οι ρόλοι μέσα στο JupyterLab πρέπει να παρέχουν μόνο την ελάχιστη χρήσιμη ενέργεια. Κρατήστε τα ευαίσθητα request bodies και τις responses των providers εκτός των routine logs.

Ελέγξτε το JupyterLab εκτός του server

Επιλέξτε το τελικό hostname του JupyterLab πριν οι χρήστες αποθηκεύσουν callbacks ή client settings και, στη συνέχεια, δρομολογήστε τον notebook server μέσω HTTPS με υποστήριξη WebSocket. Το platform route πρέπει να τερματίζει το TLS μία φορά και να στοχεύει την private port 8888.

Εκτελέστε εξωτερικά τη συναλλαγή αποδοχής. Αν ο client δεν φτάνει ποτέ στο JupyterLab, χρησιμοποιήστε το checklist επικύρωσης SSL για τους ελέγχους DNS και certificate. Αν το request φτάνει στο JupyterLab, αλλά ο proxy απορρίπτει τα WebSockets των kernels ή τα mounted notebooks ανήκουν στον root, σταματήστε να αλλάζετε τα redirects του proxy και ελέγξτε το application-specific boundary.

Logs που απαντούν στην επόμενη ερώτηση

Χρησιμοποιήστε τη σύνδεση με token, την εκκίνηση kernel, την εκτέλεση ενός cell notebook, την αποθήκευση output, την επανασύνδεση του WebSocket και το εκ νέου άνοιγμα του notebook ως smoke test του JupyterLab μετά από κάθε deployment. Τα υποστηρικτικά metrics του είναι η RAM και το CPU των kernels, τα αντίγραφα δεδομένων, το model training και οι διεργασίες language server, όχι το web UI του JupyterLab. Ενεργοποιήστε alerts όταν αυτοί οι πόροι πλησιάζουν σε σημείο που υποβαθμίζει την ενέργεια του χρήστη.

Ο βασικός κίνδυνος αλλαγής είναι ότι τα packages του base image, τα notebook extensions και τα environment files χρειάζονται test αναπαραγωγιμότητας πριν από τα upgrades. Ένα ασφαλές release ξεκινά από restore ενός snapshot και επικυρώνει κάθε one-way αλλαγή κατάστασης πριν μετακινηθεί το traffic. Όταν ο proxy απορρίπτει τα WebSockets των kernels ή τα mounted notebooks ανήκουν στον root, κρατήστε το αποτυχημένο container αρκετά ώστε να διαβάσετε το configuration και το πρώτο error.

Μια ανάπτυξη του JupyterLab στο Dockup χρειάζεται επίσης acceptance test

Το platform layer για το JupyterLab αποτελείται από τη θύρα 8888, το ingress, το TLS, το runtime configuration, την αποθήκευση και την πρόσβαση στα dependencies. Το Dockup μπορεί να αναπαράγει αυτά τα στοιχεία για τη δική του υποδομή ή για έναν server στον οποίο συνδέεται ο πελάτης.

Στη συνέχεια, ο operator ολοκληρώνει το product layer: δρομολογεί τον notebook server μέσω HTTPS με υποστήριξη WebSocket· επιβάλλει αυτόν τον κανόνα πρόσβασης — διατηρήστε ενεργό το token authentication, κάντε mount μόνο τα προβλεπόμενα δεδομένα και μην εκθέτετε απερίσκεπτα ένα privileged terminal του host· και εκτελεί «σύνδεση με token, εκκίνηση kernel, εκτέλεση ενός cell notebook, αποθήκευση output, επανασύνδεση του WebSocket και εκ νέου άνοιγμα του notebook». Η καταγραφή αυτού του test μαζί με το deployment αποτρέπει τη σύγχυση μεταξύ automated provisioning και application readiness.

Συχνές ερωτήσεις

Τι χρειάζεται το JupyterLab για deployment σε production;

Δρομολογήστε το container του JupyterLab στη θύρα 8888 μέσω ενός HTTPS origin. Η απαίτηση του local runtime είναι ρητά data mounts και υπολογιστικοί πόροι κατάλληλου μεγέθους για notebook workloads. Μην θεωρήσετε το JupyterLab έτοιμο μέχρι να μπορείτε να πραγματοποιήσετε σύνδεση με token, να εκκινήσετε kernel, να εκτελέσετε ένα cell notebook, να αποθηκεύσετε το output, να επανασυνδέσετε το WebSocket και να ανοίξετε ξανά το notebook.

Ποια δεδομένα του JupyterLab πρέπει να περιλαμβάνονται σε backup;

Διατηρήστε το /home/jovyan/work και συμπεριλάβετε notebooks, δεδομένα, environments και αρχεία αναπαραγώγιμων dependencies στο ίδιο recovery manifest. Ένα clean JupyterLab restore θεωρείται επιτυχές μόνο όταν επανέρχονται τα notebooks, τα δεδομένα και οι προδιαγραφές του environment και ένα αντιπροσωπευτικό cell παράγει το αναμενόμενο αποτέλεσμα.

Απαιτεί το JupyterLab HTTPS πίσω από reverse proxy;

Χρησιμοποιήστε HTTPS για το public origin του JupyterLab και διατηρήστε τη θύρα 8888 στο internal route. Εφαρμόστε σωστά τη ρύθμιση του JupyterLab: δρομολογήστε τον notebook server μέσω HTTPS με υποστήριξη WebSocket. Για το JupyterLab, το HTTPS προστατεύει τα credentials ή το περιεχόμενο των χρηστών κατά τη μεταφορά και διατηρεί συνεπή τη συμπεριφορά του client που εξαρτάται από το origin.

Πώς πρέπει να ελεγχθεί ένα upgrade του JupyterLab;

Κάντε restore την τρέχουσα κατάσταση του JupyterLab σε ένα isolated deployment, εφαρμόστε την υποψήφια έκδοση και επαναλάβετε τη συναλλαγή αποδοχής. Δώστε ιδιαίτερη προσοχή, επειδή τα packages του base image, τα notebook extensions και τα environment files χρειάζονται test αναπαραγωγιμότητας πριν από τα upgrades. Διατηρήστε το προηγούμενο image του JupyterLab μέχρι να γίνουν κατανοητά τα όρια του data migration και του rollback.