Al desarrollar un servidor con Django, se suele trabajar conectándose a servidores remotos a través de SSH, en lugar de hacerlo en un entorno local. Sin embargo, debido a la naturaleza de las sesiones SSH, es común que la conexión se corte automáticamente después de un tiempo, lo que implica que el servidor de desarrollo se detenga y sea necesario volver a conectarse y reiniciar el servidor. Aquí comparto algunas experiencias sobre cómo mantener la sesión SSH activa y evitar que el servidor de desarrollo de Django se detenga.

Problema: Terminación Automática de la Sesión SSH

Cuando se trabaja conectado a un servidor remoto a través de SSH, si no se realizan actividades durante un tiempo prolongado, la sesión se cierra automáticamente. Esto es útil por razones de seguridad, ya que la configuración de SSH corta la conexión si no hay tráfico de red durante un tiempo determinado. Sin embargo, para los desarrolladores, esto puede resultar incómodo.

Solución: Configuración de SSH, Uso de tmux y systemd

Para resolver este problema, implementé tres métodos.

1. Modificación de la Configuración de SSH

Configuré el archivo ~/.ssh/config en el cliente SSH para que enviara paquetes keep-alive cada cierto tiempo. De este modo, la conexión SSH puede mantenerse enviando paquetes en intervalos regulares.

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 5

Aquí, ServerAliveInterval se refiere al intervalo (en segundos) en que el cliente envía paquetes al servidor, y ServerAliveCountMax se refiere al número de intentos fallidos. Con esta configuración, se puede mantener la conexión de sesión sin que se interrumpa.

2. Uso de tmux o screen

Utilicé programas de multiplexión de terminal como tmux o screen para asegurar que el servidor de desarrollo de Django no se detuviera, incluso si la sesión SSH se cortaba. Al ejecutar el servidor de Django a través de tmux, el servidor sigue funcionando incluso si la sesión SSH finaliza. Por ejemplo, el proceso para ejecutar el servidor Django mediante tmux es el siguiente:

# Crear una nueva sesión de tmux
tmux new -s django_session

# Ejecutar el servidor de desarrollo de Django
python manage.py runserver

Después de iniciar el servidor de Django, incluso si la sesión SSH se cierra, el servidor se mantiene activo dentro de la sesión tmux, por lo que se puede volver a conectar con tmux attach -t django_session.

3. Configuración como un Servicio en Segundo Plano con systemd

El método más satisfactorio fue gestionar el servidor de Django como un servicio mediante systemd. Al usar systemd, se puede ejecutar la aplicación en desarrollo de manera continua en segundo plano, manteniendo el servidor de forma estable, independientemente de la sesión SSH. Además, esto facilita el desarrollo y las pruebas en un entorno similar al de producción. Para configurar una aplicación Django como un servicio con systemd, sigue estos pasos:

Primero, crea el archivo /etc/systemd/system/my_django_app.service y escribe el siguiente contenido:

[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

Después de configurar esto, puedes iniciar el servicio con el comando systemctl start my_django_app y configurarlo para que se ejecute automáticamente tras un reinicio del servidor con systemctl enable my_django_app. Después de modificar el código, se puede reiniciar el servicio con systemctl restart my_django_app para aplicar los cambios. Lo más importante es que una vez configurado, no hay necesidad de iniciar manualmente el servidor a menos que ocurra algo especial.

No solo se puede experimentar como si estuvieras en un entorno de producción real, sino que también es eficiente ya que, después de la configuración, no es necesario gestionar continuamente el servidor. Si nunca has probado este método, te animo a que lo intentes.

Conclusión

Gracias a estos métodos, pude resolver el problema de la finalización de la sesión SSH y operar de manera estable el servidor de desarrollo de Django. En particular, ejecutar el servidor como un servicio en segundo plano con systemd permitió realizar el desarrollo y las pruebas en un estado que se asemeja al entorno de producción, mejorando significativamente la eficiencia del trabajo. Si estás trabajando en un entorno de desarrollo remoto, este será un consejo útil.

Ilustración de SSH, tmux y systemd