Python: Usos avanzados
Avanzando con tus despliegues de Python
👋 ¡Bienvenido a la documentación de Stackhero!
Stackhero ofrece una solución nube de Python lista para usar que proporciona una serie de beneficios, incluyendo:
- Despliegue su aplicación en segundos con un simple
git push.- Use su propio nombre de dominio y benefíciese de la configuración automática de certificados HTTPS para una mayor seguridad.
- Disfrute de la tranquilidad con copias de seguridad automáticas, actualizaciones con un clic, y precios sencillos, transparentes y predecibles.
- Obtenga un rendimiento óptimo y una seguridad robusta gracias a una VM privada y dedicada.
Ahorre tiempo y simplifique su vida: solo toma 5 minutos probar la solución de alojamiento en la nube de Python de Stackhero.
Desplegar una rama distinta de main
Hasta ahora, hemos utilizado el comando git push stackhero main para desplegar la rama main en producción.
Si necesitas desplegar una rama diferente, puedes usar este comando donde <BRANCH> es el nombre de la rama que deseas desplegar:
git push stackhero <BRANCH>:main
Por ejemplo, si quieres desplegar la rama production, simplemente ejecuta:
git push stackhero production:main
Desplegar una etiqueta en lugar de una rama
Puedes optar por desplegar una etiqueta en lugar de una rama. Para desplegar una etiqueta específica, reemplaza <TAG> con la etiqueta deseada en el siguiente comando:
git push stackhero '<TAG>^{}:main'
Por ejemplo, para desplegar la etiqueta v1.0.0, ejecutarías:
git push stackhero 'v1.0.0^{}:main'
La sintaxis
^{}asegura que estás empujando el commit etiquetado en lugar de la referencia de la etiqueta en sí.
Desplegar un commit específico
Además de desplegar ramas o etiquetas, también puedes desplegar un commit específico usando su hash. Reemplaza <COMMIT_HASH> con el hash del commit que deseas desplegar:
git push -f stackhero <COMMIT_HASH>:main
Por ejemplo, para desplegar el commit con el hash abcde, ejecuta:
git push -f stackhero abcde:main
Revertir a una versión anterior
Si un despliegue reciente ha introducido problemas, puedes volver a un commit anterior desplegando ese commit. Primero, identifica el hash del commit ejecutando:
git log
Este comando muestra la fecha, el hash y la descripción de cada commit.
Por ejemplo, la salida podría ser así:
git log
commit cccc8b3ebdccb9abc1926ef49ee589dae5c5fe06 (HEAD -> main, stackhero/main)
Author: Developer
Date: Fri Apr 28 09:36:18 +0000
Break the code
commit bbbb622301772072c3d82f3cc0d91e29e6e84901
Author: Developer
Date: Wed Apr 26 12:49:28 +0000
Update the code
commit aaaa1d8b06535b413e0df8298ccf52339dfef3ff
Author: Developer
Date: Wed Apr 26 12:44:50 +0000
Improve the code
Si el despliegue actual en producción es el commit "Break the code" (hash comenzando con cccc), y deseas volver al commit anterior "Update the code" (hash comenzando con bbbb), ejecuta:
git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main
Para evitar desplegar código defectuoso y aumentar la estabilidad de tu producción, se recomienda encarecidamente tener un entorno de "staging".
Situado entre el desarrollo y la producción, el entorno de staging proporciona una réplica cercana de la configuración de producción. Te ayuda a probar tu código a fondo antes de un despliegue en vivo.
Utilizar staging aumenta tu confianza en la funcionalidad y el rendimiento de tu código, resultando en un despliegue en producción más robusto.
Este tipo de entorno se discutirá más adelante en la documentación.
Configurar un entorno de staging
Un entorno de staging es una buena práctica cuando se utiliza junto con los entornos de desarrollo y producción. Replica el entorno de producción para que puedas probar actualizaciones y cambios antes de ponerlos en línea, reduciendo el riesgo de problemas en producción.
Un entorno de staging debe reflejar de cerca el entorno de producción.
Sin embargo, debe usar una versión clonada de tu base de datos de producción o servicios conectados en lugar de la base de datos de producción en vivo.
Si tu servicio Python depende de bases de datos u otros servicios, recréalos en un nuevo stack
<Project> - Staging.
Sigue estos pasos para configurar un entorno de staging con Stackhero:
- En el panel de Stackhero, renombra tu stack existente de
<Project>a<Project> - Production. Por ejemplo, si tu proyecto se llamaChat Bot, el stack se convierte enChat Bot - Production. - Crea un nuevo stack llamado
<Project> - Staging. Para el proyectoChat Bot, el stack se convierte enChat Bot - Staging. - Inicia un servicio Python dentro del stack de staging.
- Recupera el comando
git remotey sigue las instrucciones en la documentación Desplegar en el entorno de staging.
Esta configuración asegura que tengas un entorno de staging completamente funcional para probar actualizaciones antes del despliegue en producción.
Desplegar en el entorno de staging
Se recomienda encarecidamente mantener entornos de staging y producción separados. Para gestionar múltiples entornos, comienza renombrando el repositorio remoto actual. Por ejemplo, renombra el remoto stackhero a stackhero-production con:
git remote rename stackhero stackhero-production
A continuación, crea un nuevo servicio Python para tu entorno de staging. Recupera el comando git remote add y modifícalo reemplazando <XXXXXX> con el dominio de tu servicio:
-
Comando original:
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git -
Comando modificado:
git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Luego puedes desplegar en cualquiera de los entornos usando los siguientes comandos:
-
Desplegar en staging:
git push stackhero-staging main -
Desplegar en producción:
git push stackhero-production main
Para mejorar el proceso de despliegue, sugerimos utilizar la versión mejorada del Makefile.
Con este
Makefilemejorado, desplegar en producción o en staging se vuelve tan simple como ejecutarmake deploy-productionomake deploy-staging.
Versión mejorada del Makefile
A continuación se muestra un Makefile mejorado que admite múltiples reglas:
make dev(o simplementemake): Inicia la aplicación en modo desarrollo.make deploy: Despliega la aplicación en el remoto llamadostackhero. Esto funciona bien cuando tienes una sola instancia de Stackhero.make deploy-production: Despliega la aplicación en el remoto llamadostackhero-production.make deploy-staging: Despliega la aplicación en el remoto llamadostackhero-staging.
Este
Makefileestá diseñado para manejar situaciones donde el código no ha cambiado evitando el error "Everything up-to-date".
Copia y pega el siguiente contenido como tu nuevo Makefile:
# Regla a ejecutar por defecto al invocar "make" sin argumento
.DEFAULT_GOAL := dev
# Stackhero para Python ejecutará la regla "run" en tu instancia.
# Este es el comando para ejecutar en tus entornos de producción y staging.
run:
ENV=production gunicorn app:app \
--error-logfile - \
-b 0.0.0.0:8080
# El comando a usar en el entorno de desarrollo
dev:
python app.py
# Regla "deploy" para desplegar en la instancia "stackhero".
# Adecuado si solo tienes una instancia.
deploy:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main
# Las reglas "deploy-*" despliegan en una instancia llamada "stackhero-*".
# Por ejemplo, ejecutar "make deploy-production" despliega en "stackhero-production",
# o "make deploy-staging" despliega en "stackhero-staging".
deploy-%:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main
# Regla de despliegue interna. No la modifiques.
deploy-script:
@echo "Desplegando la rama \"${DEPLOY_BRANCH}\" a \"${DEPLOY_REMOTE}\"..."
@echo
@if [ -n "$$(git status --porcelain)" ]; then \
echo "No se puede desplegar porque hay cambios no confirmados:"; \
echo "\e[0m"; \
git status -s; \
echo ""; \
echo "\e[0;31m"; \
echo "Puedes usar este comando para confirmar los cambios:"; \
echo "git add -A . && git commit -m \"Tu mensaje\""; \
echo "\e[0m"; \
exit 1; \
fi
@git push --dry-run ${DEPLOY_REMOTE} ${DEPLOY_BRANCH} 2>&1 | grep -q -F "Everything up-to-date"; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 0 ]; then \
echo -n "Nada nuevo que desplegar... ¿Forzar el despliegue (esto creará un nuevo commit)? (y/N) "; \
read answer && \
case $$answer in \
y|Y|yes|YES) \
git commit --allow-empty -m "Force update for deploy purpose to \"${DEPLOY_REMOTE}\"" ; \
;; \
*) \
echo "¡Nada que desplegar!"; \
exit 1; \
;; \
esac \
fi
git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}
Gestión de secretos (variables de entorno)
En algún momento, necesitarás almacenar secretos como tokens y contraseñas para bases de datos o servicios de terceros. Es importante almacenarlos de manera segura. Evita incrustarlos directamente en tu repositorio o código ya que esto crea un riesgo de seguridad significativo.
Usar variables de entorno ofrece dos beneficios clave:
- Tus secretos nunca se almacenan en tu repositorio Git, reduciendo el riesgo de acceso no autorizado.
- Puedes usar credenciales diferentes para varios entornos, como usar una base de datos de producción en producción y una base de datos de desarrollo durante el desarrollo.
Configuración de variables de entorno para el desarrollo
En un entorno de desarrollo, crea un archivo .env en la raíz de tu proyecto. Este archivo debe estar excluido de Git para asegurar que nunca se confirme.
Para leer automáticamente el archivo .env, puedes usar el módulo python-dotenv:
pip install python-dotenv
pip freeze > requirements.txt
Luego, crea un archivo .env en la raíz de tu proyecto y añade tus variables:
ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...
Finalmente, asegúrate de que el archivo .env esté excluido de Git añadiéndolo a tu .gitignore:
echo ".env" >> .gitignore
Configuración de variables de entorno para staging y producción
El archivo .env no es lo suficientemente seguro para los entornos de staging y producción. En su lugar, Stackhero te permite almacenar de manera segura tus variables de entorno directamente en la configuración de tu servicio Python.
Puedes establecer estas variables en el panel de Stackhero seleccionando tu servicio Python y luego haciendo clic en el botón "Configurar".
Variables de entorno de Python en Stackhero
Acceder a variables de entorno en Python
Acceder a variables de entorno en Python es sencillo. Simplemente usa os.environ.get() como se muestra a continuación:
import os
print(os.environ.get('ENV'))
Por ejemplo, conectarse a un servidor Redis usando una variable de entorno se puede hacer así:
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL"))
En un entorno de desarrollo, establece REDIS_URL en tu archivo .env de la siguiente manera:
REDIS_URL="redis://localhost:6379"
Para producción y staging, define REDIS_URL en el panel de Stackhero bajo la configuración del servicio Python:
REDIS_URL="rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:6380"
Gestión de paquetes de Python
Es una buena práctica gestionar los paquetes de Python usando un archivo requirements.txt. Este archivo lista todos los paquetes necesarios y sus versiones para ejecutar tu código de manera confiable.
Mantener este archivo actualizado asegura:
- Todos los paquetes requeridos están instalados.
- Solo se usan versiones de paquetes compatibles.
Al desplegar en tu instancia de Stackhero, los paquetes especificados en requirements.txt se instalan automáticamente.
Para generar o actualizar requirements.txt, ejecuta el siguiente comando después de instalar nuevos paquetes:
pip freeze > requirements.txt
Apertura de puertos UDP/TCP
La mayoría de las aplicaciones Python usan los puertos HTTP 80 (HTTP) y 443 (HTTPS).
Si tu aplicación necesita abrir puertos adicionales o usa otros protocolos (TCP o UDP), puedes ajustar la configuración de "Ports Redirections" en tu servicio Python en el panel de Stackhero.
Para cada puerto adicional, especifica el puerto de entrada (público), el puerto de destino (usado por tu aplicación Python) y el protocolo (TCP o UDP).
Redirecciones de puertos en el panel de Stackhero
Almacenamiento de archivos
Para almacenar archivos como fotos de usuarios o documentos, generalmente es mejor usar una solución de almacenamiento de objetos.
El almacenamiento de objetos te permite compartir archivos entre múltiples servicios o instancias y separa tu almacenamiento de tu código, siguiendo las mejores prácticas.
Recomendamos MinIO, una solución rápida y potente compatible con el protocolo Amazon S3.
Si prefieres el almacenamiento de archivos local, puedes usar el almacenamiento persistente proporcionado con tu instancia de Python ubicado en /persistent/storage/. Sin embargo, este enfoque no se recomienda en la mayoría de los casos.
ADVERTENCIA: ¡Nunca almacenes datos fuera de la carpeta
/persistent/storage/!Almacenar datos fuera de esta carpeta puede llevar a la pérdida de datos cuando tu instancia se reinicia, actualiza o cuando empujas nuevo código.
Apple/macOS: guardar la contraseña de tu clave privada SSH
En macOS, puede ser inconveniente ingresar la contraseña de tu clave privada SSH cada vez que empujas tu código. Aunque la seguridad es primordial, puedes guardar tu contraseña de manera segura usando el Llavero de Apple en lugar de eliminarla de tu clave.
Para almacenar la contraseña de una clave llamada id_ed25519, ejecuta:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Después de esto, no se te pedirá la contraseña de tu clave, ahorrando tiempo y esfuerzo.
Si usas una clave RSA en su lugar, reemplaza
id_ed25519conid_rsaen el comando:ssh-add --apple-use-keychain ~/.ssh/id_rsa