Lorsque vous développez un serveur avec Django, il est fréquent de travailler sur un serveur distant via SSH, contrairement à un environnement local. Cependant, en raison de la nature des sessions SSH, celles-ci se déconnectent automatiquement après un certain temps d'inactivité, ce qui entraîne des interruptions du serveur de développement et la nécessité de se reconnecter et de redémarrer le serveur. Ici, je vais partager mon expérience sur la façon de maintenir la session SSH tout en assurant que le serveur de développement Django ne soit pas interrompu.

Problème : Déconnexion automatique de la session SSH

Lorsque vous travaillez sur un serveur distant avec une connexion SSH, la session se termine automatiquement si aucune activité n’est détectée pendant longtemps. Cela peut être utile pour des raisons de sécurité dans la configuration SSH, qui déconnecte la session après une période d'inactivité, mais cela peut être très gênant pour les développeurs.

Solutions : configuration SSH, utilisation de tmux et systemd

Pour résoudre ce problème, j'ai appliqué trois méthodes.

1. Modification de la configuration SSH

J'ai configuré le fichier ~/.ssh/config du client SSH pour envoyer des paquets keep-alive à intervalles réguliers. Avec cette configuration, la connexion SSH envoie des paquets régulièrement, permettant ainsi de maintenir la session active.

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 5

Ici, ServerAliveInterval indique l'intervalle (en secondes) auquel le client envoie des paquets au serveur, et ServerAliveCountMax est le nombre maximum d'échecs autorisés avant que la connexion ne soit interrompue. Grâce à ce paramétrage, vous pouvez maintenir la connexion de session active.

2. Utilisation de tmux ou screen

Pour éviter que le serveur de développement Django s'arrête même si la session SSH est interrompue, j'ai utilisé des programmes de multiplexage de terminal comme tmux ou screen. En exécutant le serveur Django avec tmux, le serveur continue de fonctionner même si la session SSH se termine. Par exemple, voici comment exécuter le serveur Django via tmux.

# Créer une session tmux
tmux new -s django_session

# Démarrer le serveur de développement Django
python manage.py runserver

Ainsi, après avoir démarré le serveur Django, même si la session SSH se termine, le serveur reste actif dans la session tmux, permettant de se reconnecter avec tmux attach -t django_session.

3. Configuration en tant que service en arrière-plan avec systemd

Parmi ces méthodes, la plus satisfaisante a été de gérer le serveur Django comme un service avec systemd. Utiliser systemd permet d'exécuter l'application en développement en permanence en arrière-plan, indépendamment de la session SSH, garantissant que le serveur reste stable. De plus, cela présente l’avantage de pouvoir développer et tester dans un état presque identique à celui de l'environnement de déploiement. Voici comment configurer une application Django comme service avec systemd.

Tout d'abord, créez un fichier /etc/systemd/system/my_django_app.service et entrez le contenu suivant.

[Unit]
Description=My Django Application
After=network.target

[Service]
User=myuser
Group=mygroup
WorkingDirectory=/path/to/my/django/project
ExecStart=/path/to/my/venv/bin/python manage.py runserver 0.0.0.0:8000
Restart=always

[Install]
WantedBy=multi-user.target

Après avoir effectué cette configuration, vous pouvez démarrer le service avec la commande systemctl start my_django_app et le configurer pour qu'il se lance automatiquement au redémarrage du serveur avec systemctl enable my_django_app. Après une modification du code, utilisez systemctl restart my_django_app pour redémarrer le service et appliquer les changements. Surtout, une fois que c'est configuré, vous n'avez pas besoin de démarrer manuellement le serveur à moins qu'il y ait un problème, ce qui constitue un avantage majeur.

Vous pourrez ainsi tester comme si vous étiez dans un environnement de déploiement réel, et après la configuration, il n'est plus nécessaire de gérer le serveur de manière continue, ce qui est très efficace. Si vous n'avez jamais essayé cette méthode, je vous encourage vivement à le faire.

Conclusion

En utilisant les méthodes ci-dessus, j'ai pu résoudre le problème de déconnexion de la session SSH tout en maintenant le serveur de développement Django de manière fiable. En particulier, le fait d'exécuter le service en arrière-plan avec systemd a permis de développer et de tester dans un état très similaire à celui d'un environnement de déploiement, améliorant considérablement l'efficacité du travail. Cela sera certainement un conseil utile si vous travaillez dans un environnement de développement à distance.

Illustration SSH, tmux et systemd