Journal-indexDockup / praktijknotitie
Note / self-host-jupyterlab

JupyterLab zelf hosten in 2026: tokens, kernels en persistente notebooks

Deploy JupyterLab met de juiste poort, duurzame opslag, TLS, authenticatie en backups. Los problemen op wanneer de proxy de WebSockets van kernels verbreekt in productie.

De kortste JupyterLab-demo bewijst dat een proces op poort 8888 luistert. In productie is sterker bewijs nodig. Deze test moet ook slagen nadat de container is vervangen: log in met een token, start een kernel, voer een notebookcel uit, sla de uitvoer op, maak opnieuw verbinding met de WebSocket en open de notebook opnieuw.

JupyterLab wordt ingezet met een duidelijk doel: browsernotebooks naast data en compute. De meest voorkomende valkuil bij deployments is dat de proxy de WebSockets van kernels verbreekt of dat gemounte notebooks eigendom zijn van root. Daarom verdienen de afhandeling van publieke URL's en duurzame state evenveel aandacht als het starten van de image.

Bewijs dat JupyterLab vervanging overleeft

Breng elk duurzaam artefact in kaart: notebooks, data, omgevingen en reproduceerbare dependencybestanden. Mount /home/jovyan/work vóór de bootstrap, schrijf ongevaarlijke voorbeelddata en vervang de container om te bewijzen dat dat pad daadwerkelijk persistent is. Neem ook configuratie op die bepaalt hoe opgeslagen data wordt geïnterpreteerd, niet alleen de grootste directory.

Stel retentie in, kopieer backups naar een andere host en voer een clean-room restore uit. De JupyterLab-oefening is voltooid wanneer notebooks, data en omgevingsspecificaties zijn teruggezet en een representatieve cel het verwachte resultaat oplevert. Als snapshots onderdeel zijn van het plan, gebruik dan de richtlijnen voor PITR versus snapshots om vast te leggen wat elk mechanisme kan herstellen.

Definieer eerst wanneer JupyterLab geslaagd is

Laat de JupyterLab-image niet per ongeluk de productiearchitectuur bepalen. De image levert een proces op 8888; opslag, routing en externe vereisten hebben nog steeds bewust gekozen lifecycles nodig. De vereiste voor de lokale runtime is expliciete datamounts en compute die is afgestemd op notebookworkloads. Houd de lifecycle expliciet, zodat het verplaatsen van JupyterLab tussen hosts niet ongemerkt het gedrag verandert.

De deployment is klaar voor grondiger testen wanneer deze kan inloggen met een token, een kernel kan starten, een notebookcel kan uitvoeren, uitvoer kan opslaan, opnieuw verbinding kan maken met de WebSocket en de notebook opnieuw kan openen. Volg de transactie in de logs en monitor kernel-RAM en -CPU, datakopieën, modeltraining en language-serverprocessen in plaats van de webinterface van JupyterLab. Deze observaties laten zien of de huidige topologie het juiste component isoleert.

Vijf controles die sterker zijn dan container health

Het releaserecord voor JupyterLab heeft feiten nodig, geen “ziet er goed uit”. Sla de geselecteerde image digest, configuratiechecksum, publieke hostname en een resultaat met timestamp op voor: inloggen met een token, een kernel starten, een notebookcel uitvoeren, uitvoer opslaan, opnieuw verbinding maken met de WebSocket en de notebook opnieuw openen. Gebruik niet-productiedata, zodat de controle na elke deployment kan worden uitgevoerd.

Bewijs twee lifecycle-events afzonderlijk. Een containervervanging moet de normale werking behouden; een clean recovery moet aantonen dat notebooks, data en omgevingsspecificaties terugkomen en dat een representatieve cel het verwachte resultaat oplevert. Meet tijdens de controles kernel-RAM en -CPU, datakopieën, modeltraining en language-serverprocessen in plaats van de webinterface van JupyterLab, en bewaar het resultaat als de verwachte bandbreedte voor deze versie.

Test ook een geweigerde of ongeldige toestand: dien ongevaarlijke input in nabij de resource- of formaatl imiet die bij deze grens hoort: de proxy verbreekt de WebSockets van kernels of gemounte notebooks zijn eigendom van root. JupyterLab moet op een diagnoseerbare manier falen en mag geen gezonde state overschrijven. Herstel de geldige toestand, voer het voorbeeld opnieuw uit en voeg de relevante geredigeerde logs toe. Deze artefacten leveren concrete informatie voor een toekomstige rollbackbeslissing.

Start JupyterLab met goed observeerbare defaults

De eerste container moet eenvoudig te verwijderen en opnieuw aan te maken zijn. Houd data buiten de writable layer, bind poort 8888 alleen op een plek die de proxy kan bereiken en geef configuratie tijdens runtime mee.

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 de image na de eerste test. Lees de vroegste startupfout in plaats van het laatste restartbericht, controleer elke mount met docker inspect en volg de logs terwijl je inlogt met een token, een kernel start, een notebookcel uitvoert, uitvoer opslaat, opnieuw verbinding maakt met de WebSocket en de notebook opnieuw opent. Deze volgorde maakt onderscheid tussen een verkeerd imagecommando en een probleem met dependencies of permissies.

Geef JupyterLab niet de volledige host

Sluit het bootstrapvenster zodra de eerste vertrouwde beheerder bestaat. De concrete valkuil bij JupyterLab is het uitschakelen van het token op een notebook dat aan het internet is blootgesteld of het mounten van brede hostpaden. De veiligere grens is tokenauthenticatie ingeschakeld te houden, alleen bedoelde data te mounten en niet zomaar een geprivilegieerde hostterminal beschikbaar te maken.

Behandel JUPYTER_TOKEN volgens de rol ervan in JupyterLab: houd gevoelige waarden uit Git, documenteer de gevolgen van rotatie en gebruik in productie nooit een publiek voorbeeld. Gebruik private networking voor dependencycredentials en laat rollen binnen JupyterLab alleen de kleinst nuttige actie uitvoeren. Houd gevoelige requestbodies en responses van providers buiten de reguliere logs.

Test JupyterLab vanaf buiten de server

Kies de definitieve JupyterLab-hostname voordat gebruikers callbacks of clientinstellingen opslaan en routeer de notebookserver via HTTPS met ondersteuning voor WebSockets. De platformroute moet TLS één keer beëindigen en doorsturen naar private poort 8888.

Voer de acceptatietransactie extern uit. Als de client JupyterLab nooit bereikt, gebruik dan de checklist voor SSL-validatie voor DNS- en certificaatcontroles. Als het request JupyterLab wel bereikt, maar de proxy de WebSockets van kernels verbreekt of gemounte notebooks eigendom zijn van root, stop dan met het aanpassen van proxyredirects en inspecteer in plaats daarvan de applicatiespecifieke grens.

Logs die de volgende vraag beantwoorden

Gebruik inloggen met een token, een kernel starten, een notebookcel uitvoeren, uitvoer opslaan, opnieuw verbinding maken met de WebSocket en de notebook opnieuw openen als de JupyterLab-smoketest na elke deployment. De bijbehorende metrics zijn kernel-RAM en -CPU, datakopieën, modeltraining en language-serverprocessen in plaats van de webinterface van JupyterLab. Stel alerts in wanneer deze resources een punt naderen waarop de gebruikersactie verslechtert.

Het grootste veranderingsrisico is dat packages in de base image, notebookextensies en omgevingsbestanden vóór upgrades een reproduceerbaarheidstest nodig hebben. Een veilige release begint met een herstelbare snapshot en valideert elke eenrichtingswijziging in state voordat het verkeer wordt omgeleid. Wanneer de proxy de WebSockets van kernels verbreekt of gemounte notebooks eigendom zijn van root, houd de mislukte container dan lang genoeg beschikbaar om de configuratie en de eerste fout te lezen.

Ook een Dockup-deployment heeft een JupyterLab-acceptatietest nodig

De platformlaag voor JupyterLab bestaat uit poort 8888, ingress, TLS, runtimeconfiguratie, opslag en bereikbaarheid van dependencies. Dockup kan deze onderdelen reproduceren voor de eigen infrastructuur of voor een server waarmee de klant verbinding maakt.

Daarna voltooit de operator de productlaag: routeer de notebookserver via HTTPS met ondersteuning voor WebSockets; dwing deze toegangsregel af — houd tokenauthenticatie ingeschakeld, mount alleen bedoelde data en stel niet zomaar een geprivilegieerde hostterminal beschikbaar; en voer “inloggen met een token, een kernel starten, een notebookcel uitvoeren, uitvoer opslaan, opnieuw verbinding maken met de WebSocket en de notebook opnieuw openen” uit. Door deze test samen met de deployment vast te leggen, voorkom je dat geautomatiseerde provisioning wordt verward met gereedheid van de applicatie.

Veelgestelde vragen

Wat heeft JupyterLab nodig voor een deployment in productie?

Routeer de JupyterLab-container op poort 8888 via één HTTPS-origin. De vereiste voor de lokale runtime is expliciete datamounts en compute die is afgestemd op notebookworkloads. Verklaar JupyterLab pas gereed wanneer je kunt inloggen met een token, een kernel kunt starten, een notebookcel kunt uitvoeren, uitvoer kunt opslaan, opnieuw verbinding kunt maken met de WebSocket en de notebook opnieuw kunt openen.

Welke JupyterLab-data hoort in een backup?

Maak /home/jovyan/work persistent en neem notebooks, data, omgevingen en reproduceerbare dependencybestanden op in hetzelfde recoverymanifest. Een clean JupyterLab-restore is pas geslaagd wanneer notebooks, data en omgevingsspecificaties zijn teruggezet en een representatieve cel het verwachte resultaat oplevert.

Heeft JupyterLab HTTPS nodig achter een reverse proxy?

Gebruik HTTPS voor de publieke JupyterLab-origin en houd poort 8888 op de interne route. Pas de JupyterLab-instelling correct toe: routeer de notebookserver via HTTPS met ondersteuning voor WebSockets. Voor JupyterLab beschermt HTTPS credentials of gebruikerscontent tijdens transport en blijft clientgedrag dat gevoelig is voor de origin consistent.

Hoe moet een JupyterLab-upgrade worden getest?

Zet de huidige JupyterLab-state terug in een geïsoleerde deployment, pas de kandidaatversie toe en herhaal de acceptatietransactie. Let hier extra op, omdat packages in de base image, notebookextensies en omgevingsbestanden vóór upgrades een reproduceerbaarheidstest nodig hebben. Houd de vorige JupyterLab-image beschikbaar totdat de grenzen voor datamigratie en rollback duidelijk zijn.