¿Cuál es la mejor manera de implementar Django en un servidor de producción que debería servir solo a un puñado de usuarios internos?

“Lo mejor” es altamente subjetivo, especialmente aquí. Siempre es importante tener en cuenta cuáles son los requisitos con respecto a:

  • Disponibilidad: ¿necesita el servidor estar en línea con 99.999999% de tiempo de actividad? Si realiza una implementación, ¿puede eliminar el entorno mientras ejecuta migraciones o reinicia la aplicación web, o lo que sea? El negocio debe decidir los requisitos de tiempo de actividad, y usted crea la infraestructura y el plan de implementación de acuerdo con estos requisitos.
    • ¿Necesita autoescala para mantener la máquina en línea? Si es así, eso afecta su proceso de implementación.
    • ¿Necesita estar en línea el 100% del tiempo? Si es así, tiene al menos dos máquinas ejecutándose en un momento dado, que su estrategia de implementación debe tener en cuenta.
    • ¿Tiene una base de datos, y podría haber cambios en esa base de datos? Si es así, debe prepararse para las migraciones y decidir qué migraciones son migraciones “en línea” frente a “fuera de línea”.
  • Seguridad y coherencia: ¿qué nivel de seguridad requiere su servidor? ¿Está bien simplemente escribir un script que se implemente en el entorno de producción? (Mi respuesta es, inequívocamente, no, pero eso puede no ser cierto para usted). ¿Está bien usar Git como estrategia de implementación con claves SSH? Nuevamente, mi respuesta siempre es no, pero eso puede no ser cierto para su contexto.

Personalmente, si estoy respondiendo esta pregunta para mi propio equipo, es configurar un libro de jugadas Ansible para esta herramienta que:

  • Identifica el inventario en el que estoy implementando (las IP privadas del servidor)
  • Copia un artefacto de mi servidor de artefactos a las máquinas remotas en tmp utilizando el agente Ansible que he instalado en las máquinas
  • Expanda el archivo en mi carpeta de implementación de webapps, donde guardo las últimas 10 implementaciones
  • Copie archivos de configuración importantes, como my.cnf, que describe la información de conexión MySQL para producción, en el directorio apropiado dentro de mi carpeta expandida
  • Elimine el enlace simbólico “actual” que tengo que apunta al siguiente al último (ahora que tengo una nueva versión) de la aplicación y enlace simbólico la nueva carpeta a “actual”
    • Actual es donde apuntan mis configuraciones de uWSGI, por lo que nunca tengo que actualizar esto en el servidor después de la configuración inicial
  • Reinicie los servicios con gracia (uWSGI, Apache, etc.)
  • Ejecuta una prueba rápida de humo para asegurarse de que el servidor responde con una buena respuesta