Déployer Jupyter en production : HTTPS, authentification et stockage persistant (guide 2026)
Jupyter est parfait pour explorer un dataset ou prototyper un modèle… mais une fois sur un serveur, les règles changent. En production, vous devez penser HTTPS, contrôle d’accès, persistance, sauvegardes, et isolation.
Dans ce guide, on part d’un scénario classique : un service Jupyter accessible depuis un navigateur, derrière un reverse proxy HTTPS, avec un répertoire de travail persistant (et des sauvegardes).
Si vous voulez éviter la plomberie serveur, vous pouvez aussi le déployer sur adgents.cloud (déploiement rapide, backups automatiques, scaling CPU/RAM).
1) Ce qu’on appelle “production” pour Jupyter
Un Jupyter “en prod” n’est pas forcément un gros cluster. C’est surtout un Jupyter :
- exposé sur Internet (ou sur un réseau d’entreprise),
- chiffré en HTTPS,
- protégé par authentification et restrictions réseau,
- avec stockage persistant (documents + artefacts),
- et une stratégie de sauvegarde/restauration testée.
Si votre besoin est multi-utilisateurs, envisagez rapidement JupyterHub. Pour un usage “mono-utilisateur” (ou petit cercle), Jupyter derrière un reverse proxy reste une approche simple.
2) Architecture recommandée (simple et robuste)
Le schéma le plus fréquent :
- Reverse proxy HTTPS (Nginx / Traefik / Caddy)
- Conteneur Jupyter
- Volumes persistants pour documents + données

On garde le reverse proxy comme “porte d’entrée” : certificats TLS, redirections HTTP→HTTPS, éventuellement du rate limiting, et parfois une couche d’auth supplémentaire.
3) Déploiement Docker Compose : exemple concret
a) Le docker-compose.yml
Ci-dessous un exemple volontairement lisible. À adapter selon votre reverse proxy (Traefik, Nginx, Caddy).
services:
jupyter:
image: python:3.11-slim
container_name: jupyter
restart: unless-stopped
working_dir: /srv
command: >
sh -lc "
pip install --no-cache-dir jupyter &&
jupyter server
--ServerApp.ip=0.0.0.0
--ServerApp.port=8888
--ServerApp.open_browser=False
"
volumes:
- ./work:/srv/work
- ./data:/srv/data
networks:
- web
networks:
web:
external: true
Points importants :
./worket./data= persistance (vous ne perdez pas vos fichiers au redémarrage).- Le réseau
webexterne est pratique si votre reverse proxy tourne dans un autre compose.
b) Le reverse proxy (principe)
Quel que soit l’outil, l’idée est :
- publier un domaine (ex:
jupyter.votre-domaine.fr) - terminer le TLS au reverse proxy
- proxy-pass vers
jupyter:8888
Si vous avez déjà l’habitude de Docker Compose avec HTTPS, vous pouvez vous inspirer de la logique présentée dans Installer n8n avec Docker Compose (HTTPS + persistance) (la philosophie reverse proxy/volumes est la même).
4) Authentification : ce qu’il faut vraiment verrouiller
Par défaut, Jupyter affiche souvent un accès via jeton au premier démarrage. C’est mieux que rien, mais ce n’est pas suffisant pour un usage serveur durable.
a) Utiliser un mot de passe hashé (recommandé)
Générez un hash et configurez Jupyter pour exiger un mot de passe :
python -c "from jupyter_server.auth import passwd; print(passwd())"
Puis passez ce hash via un fichier de configuration du serveur Jupyter. L’objectif : pas de service “ouvert”.
b) Restreindre le réseau (très utile)
Même avec un mot de passe, limitez :
- accès par IP (bureau / VPN)
- authentification au reverse proxy (basic auth) si besoin
Si vous cherchez une approche “prêvous pour l’Internet”, vous pouvez aussi appliquer une logique WAF/rate limit (comme pour des applis web). Une approche similaire est détaillée dans Sécuriser WordPress : hardening + WAF + sauvegardes (transposable à Jupyter pour la partie reverse proxy).
5) Stockage persistant : documents, data, exports
La base :
- répertoire de travail (documents)
- datasets
- répertoire pour exports (CSV, modèles, figures)
Bon réflexe : séparer work/ et data/ comme dans l’exemple compose. Ça simplifie les permissions et les sauvegardes.
Et les dépendances Python ?
Deux approches courantes :
- image custom (Dockerfile) avec
requirements.txtfigé - environnement géré au runtime (plus flexible, mais moins reproductible)
Si vous avez un besoin sérieux de reproductibilité, l’image custom est généralement la plus saine.
6) Sauvegardes et restauration : l’essentiel
Une sauvegarde utile doit couvrir :
- le volume
work/ - le volume
data/(si ce sont des données critiques) - vos fichiers de configuration (compose, reverse proxy)
Et surtout : faites au moins un test de restauration, sinon vous ne savez pas si ça fonctionne.
Sur adgents.cloud, vous pouvez activer des backups automatiques (jusqu’à 1/h) et une rétention longue (jusqu’à 10 ans) selon le besoin.
7) Performance et fiabilité (sans complexifier)
Quelques actions simples :
- dimensionner CPU/RAM selon vos workloads (et surveiller la mémoire)
- activer un monitoring basique (CPU/RAM/disque)
- isoler les datasets lourds sur un stockage adapté
Si vous encaissez des pics (démos, formations, ou calculs longs), un hébergeur qui permet start/stop et scaling à la demande aide beaucoup.
8) Quand basculer vers JupyterHub ?
Vous devriez envisager JupyterHub si :
- vous avez plusieurs utilisateurs réels
- vous voulez de vrais comptes
- vous devez isoler les environnements
Sinon, un Jupyter durci derrière HTTPS reste une solution très efficace.
9) Vidéo (FR) pour compléter
Pour voir une installation pas-à-pas en français, vous pouvez suivre :
.
10) Déployer sur adgents.cloud
Si vous voulez aller vite tout en gardant une approche “prod-ready”, adgents.cloud vous permet de :
- déployer en quelques minutes
- activer des backups automatiques
- ajuster CPU/RAM à la demande
- stopper/démarrer quand vous n’en avez pas besoin
Vous gardez la main sur votre conteneur et vos volumes, sans perdre du temps sur l’infra.

