Supongo que esta pregunta parecerá increíblemente trivial para algunos lectores, pero como alguien que es desarrollador pero con poca experiencia en la implementación de aplicaciones en otra cosa que no sea un manual, golpear y esperar de alguna manera, espero que entiendan que es bastante desalentador ver la cantidad de enfoques y herramientas diferentes que existen, por lo que podría hacer un pequeño consejo para comenzar en la dirección correcta.
Soy desarrollador, ahora solo en mi tiempo libre, que es limitado. Hasta ahora he trabajado con Java, creando aplicaciones web, y he estado razonablemente contento con la implementación de un archivo war en un entorno Tomcat que mantiene las cosas bien encapsuladas.
Ahora estoy trabajando en Python y Django, pero a medida que me acerco al punto donde necesito implementar, quiero configurar un flujo de trabajo devops sólido para automatizar todo lo que pueda y asegurarme de que pueda implementar de manera confiable, pero dado que mi el caso de uso es relativamente simple, quiero evitar aprender un conjunto de herramientas grande y gordo que está diseñado en exceso para mis necesidades y que requiere una gran inversión de tiempo. Preferiría usar la codificación de mi aplicación.
Por lo tanto, estoy buscando un término medio que me permita implementar y administrar mis aplicaciones de manera confiable sin invertir una gran cantidad de tiempo en configurar y aprender un gran ecosistema de DevOps.
Algunos detalles más ...
Contexto
- Desarrollo en una Mac, usando PyCharm para construir Django 2, Python 3.
- Uso git (pero no en github) para administrar el control de versiones del software.
- Me siento cómodo con otros idiomas y lenguajes de scripting y he escrito algunos scripts de bash (probablemente bastante aficionados), aunque no disfruto bash. También he incursionado con Perl, que me di cuenta de que no es realmente un lenguaje para incursionar (es decir, debes pasar tiempo aprendiéndolo correctamente)
- Tengo la intención de implementar en un entorno VPS, probablemente DigitalOcean.
- Mi aplicación no es crítica para la misión, pero es importante que sepa si el sitio deja de funcionar, y necesito tener una forma de recuperación confiable si lo hace, ya sea reiniciando la aplicación, reiniciando el servidor o moviéndome a otro servidor ( u otro).
Requisitos específicos
Posibilidad de configurar un nuevo entorno para recibir la aplicación.
Hasta ahora, mientras estoy aprendiendo, esto ha sido manual, y cada vez que lo hice, comencé desde cero con una nueva Droplet. Me gustaría que esto sea mucho más simple (automatizado) para que si tengo que configurar un nuevo entorno en caso de emergencia, pueda hacerlo de manera confiable.
Capacidad para implementar la aplicación en un entorno de preparación que sea lo más idéntico a la vida posible, idealmente como un proceso automatizado desencadenado por un impulso de git utilizando un enfoque de integración continua (que nunca he hecho antes).
Posibilidad de "presionar el botón" cuando estoy satisfecho con la aplicación en el entorno de preparación para impulsar automáticamente a un entorno en vivo.
Manera de monitorear el sitio (solo una encuesta a una página servirá)
Manera de cambiar el sitio en vivo a otro servidor si necesito recuperarme de una aplicación o falla del servidor en el sitio en vivo. ¿Creo que un enfoque azul-verde podría funcionar para mí?
¿Qué he intentado o considerado?
Configuración manual del entorno en vivo con la aplicación Django, luego copie manualmente la nueva base de código cuando haya un cambio. Esto parece propenso a errores humanos y me temo que cometer un error en un despliegue provocando una falla irrecuperable.
Estibador. Admito que cuando me enteré de Docker parecía un sueño hecho realidad, pero después de un poco de experimentación e investigación, me siento intimidado por lo mucho que necesito aprender y saber para poner esto en marcha y administrarlo. Puede ser que esto valga la pena porque una vez que está funcionando es de muy bajo riesgo, pero en este momento se siente como una mayor inversión de mi tiempo de lo que esperaba.
Bash scripts. Úselos para configurar el entorno original y para tareas específicas como actualizar la aplicación. Mi preocupación acerca de esto es que los scripts serán código que necesita pruebas y me temo que tomaría mucho tiempo construir un conjunto de herramientas confiable de esta manera.
He examinado las opciones de Digital Ocean para las direcciones IP flotantes y la capacidad de tener dos servidores para un enfoque "azul verde" que parece bastante sensato. Si sigo esta ruta, todavía necesito poder automatizar la implementación.
Entonces ... estoy buscando consejos sobre un enfoque de DevOps que encuentre el equilibrio adecuado entre minimizar el riesgo (por ejemplo, el riesgo de romper la aplicación en vivo con una actualización o el riesgo de no poder recuperarse de una falla) y minimizar el tiempo inversión que necesito hacer para configurar los entornos y el flujo de trabajo.