Python: Usages avancés
Aller plus loin avec vos déploiements Python
👋 Bienvenue sur la documentation de Stackhero !
Stackhero propose une solution cloud Python prête à l'emploi offrant de nombreux avantages, notamment :
- Déployez votre application en quelques secondes avec un simple
git push.- Utilisez votre propre nom de domaine et bénéficiez de la configuration automatique des certificats HTTPS pour une sécurité renforcée.
- Profitez de la tranquillité d'esprit avec des sauvegardes automatiques, des mises à jour en un clic, et une tarification simple, transparente et prévisible.
- Obtenez des performances optimales et une sécurité robuste grâce à une VM privée et dédiée.
Gagnez du temps et simplifiez-vous la vie : il ne faut que 5 minutes pour essayer la solution d'hébergement cloud Python de Stackhero !
Déployer une branche autre que main
Jusqu'à présent, nous avons utilisé la commande git push stackhero main pour déployer la branche main en production.
Si vous devez déployer une autre branche, vous pouvez utiliser cette commande où <BRANCH> est le nom de la branche que vous souhaitez déployer :
git push stackhero <BRANCH>:main
Par exemple, si vous voulez déployer la branche production, exécutez simplement :
git push stackhero production:main
Déployer un tag au lieu d'une branche
Vous pouvez choisir de déployer un tag plutôt qu'une branche. Pour déployer un tag spécifique, remplacez <TAG> par le tag souhaité dans la commande ci-dessous :
git push stackhero '<TAG>^{}:main'
Par exemple, pour déployer le tag v1.0.0, vous exécuteriez :
git push stackhero 'v1.0.0^{}:main'
La syntaxe
^{}garantit que vous poussez le commit tagué plutôt que la référence du tag elle-même.
Déployer un commit spécifique
En plus de déployer des branches ou des tags, vous pouvez également déployer un commit spécifique en utilisant son hash. Remplacez <COMMIT_HASH> par le hash du commit que vous souhaitez déployer :
git push -f stackhero <COMMIT_HASH>:main
Par exemple, pour déployer le commit avec le hash abcde, exécutez :
git push -f stackhero abcde:main
Revenir à une version précédente
Si un déploiement récent a introduit des problèmes, vous pouvez revenir à un commit antérieur en déployant ce commit. Tout d'abord, identifiez le hash du commit en exécutant :
git log
Cette commande affiche la date, le hash et la description de chaque commit.
Par exemple, la sortie pourrait ressembler à ceci :
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 le déploiement actuel en production est le commit "Break the code" (hash commençant par cccc), et que vous souhaitez revenir au commit précédent "Update the code" (hash commençant par bbbb), exécutez :
git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main
Pour éviter de déployer du code défectueux et augmenter la stabilité de votre production, il est fortement recommandé d'avoir un environnement de "staging".
Situé entre le développement et la production, l'environnement de staging fournit une réplique proche de la configuration de production. Il vous aide à tester votre code de manière approfondie avant un déploiement en direct.
Utiliser le staging augmente votre confiance dans la fonctionnalité et la performance de votre code, ce qui se traduit par un déploiement en production plus robuste.
Ce type d'environnement sera discuté plus tard dans la documentation.
Mettre en place un environnement de staging
Un environnement de staging est une bonne pratique lorsqu'il est utilisé avec les environnements de développement et de production. Il réplique l'environnement de production afin que vous puissiez tester les mises à jour et les modifications avant de les mettre en ligne, réduisant ainsi le risque de problèmes en production.
Un environnement de staging doit refléter de près l'environnement de production.
Cependant, il doit utiliser une version clonée de votre base de données de production ou des services connectés plutôt que la base de données de production en direct.
Si votre service Python dépend de bases de données ou d'autres services, recréez-les dans un nouveau stack
<Project> - Staging.
Suivez ces étapes pour configurer un environnement de staging avec Stackhero :
- Sur le tableau de bord Stackhero, renommez votre stack existant de
<Project>à<Project> - Production. Par exemple, si votre projet s'appelleChat Bot, le stack devientChat Bot - Production. - Créez un nouveau stack nommé
<Project> - Staging. Pour le projetChat Bot, le stack devientChat Bot - Staging. - Démarrez un service Python dans le stack de staging.
- Récupérez la commande
git remoteet suivez les instructions dans la documentation Déployer sur l'environnement de staging.
Cette configuration vous assure d'avoir un environnement de staging entièrement fonctionnel pour tester les mises à jour avant le déploiement en production.
Déployer sur l'environnement de staging
Il est fortement recommandé de maintenir des environnements de staging et de production séparés. Pour gérer plusieurs environnements, commencez par renommer le dépôt distant actuel. Par exemple, renommez le distant stackhero en stackhero-production avec :
git remote rename stackhero stackhero-production
Ensuite, créez un nouveau service Python pour votre environnement de staging. Récupérez la commande git remote add et modifiez-la en remplaçant <XXXXXX> par le domaine de votre service :
-
Commande originale :
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git -
Commande modifiée :
git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Vous pouvez ensuite déployer sur l'un ou l'autre environnement en utilisant les commandes suivantes :
-
Déployer sur staging :
git push stackhero-staging main -
Déployer sur production :
git push stackhero-production main
Pour améliorer le processus de déploiement, nous suggérons d'utiliser la version améliorée du Makefile.
Avec ce
Makefileamélioré, déployer en production ou en staging devient aussi simple que d'exécutermake deploy-productionoumake deploy-staging.
Version améliorée du Makefile
Voici un Makefile amélioré qui prend en charge plusieurs règles :
make dev(ou simplementmake) : Démarre l'application en mode développement.make deploy: Déploie l'application sur le distant nomméstackhero. Cela fonctionne bien lorsque vous avez une seule instance Stackhero.make deploy-production: Déploie l'application sur le distant nomméstackhero-production.make deploy-staging: Déploie l'application sur le distant nomméstackhero-staging.
Ce
Makefileest conçu pour gérer les situations où le code n'a pas changé en évitant l'erreur "Everything up-to-date".
Copiez et collez le contenu suivant comme votre nouveau Makefile :
# Règle à exécuter par défaut lors de l'invocation de "make" sans argument
.DEFAULT_GOAL := dev
# Stackhero pour Python exécutera la règle "run" sur votre instance.
# C'est la commande à exécuter sur vos environnements de production et de staging.
run:
ENV=production gunicorn app:app \
--error-logfile - \
-b 0.0.0.0:8080
# La commande à utiliser dans l'environnement de développement
dev:
python app.py
# Règle "deploy" pour déployer sur l'instance "stackhero".
# Convient si vous n'avez qu'une seule instance.
deploy:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main
# Les règles "deploy-*" déploient sur une instance nommée "stackhero-*".
# Par exemple, exécuter "make deploy-production" déploie sur "stackhero-production",
# ou "make deploy-staging" déploie sur "stackhero-staging".
deploy-%:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main
# Règle de déploiement interne. Ne pas la modifier.
deploy-script:
@echo "Déploiement de la branche \"${DEPLOY_BRANCH}\" vers \"${DEPLOY_REMOTE}\"..."
@echo
@if [ -n "$$(git status --porcelain)" ]; then \
echo "Impossible de déployer car il y a des modifications non validées :"; \
echo "\e[0m"; \
git status -s; \
echo ""; \
echo "\e[0;31m"; \
echo "Vous pouvez utiliser cette commande pour valider les modifications :"; \
echo "git add -A . && git commit -m \"Votre message\""; \
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 "Rien de nouveau à déployer... Forcer le déploiement (cela créera un nouveau 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 "Rien à déployer !"; \
exit 1; \
;; \
esac \
fi
git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}
Gestion des secrets (variables d'environnement)
À un moment donné, vous devrez stocker des secrets tels que des tokens et des mots de passe pour les bases de données ou les services tiers. Il est important de les stocker en toute sécurité. Évitez de les intégrer directement dans votre dépôt ou votre code, car cela crée un risque de sécurité important.
L'utilisation de variables d'environnement offre deux avantages clés :
- Vos secrets ne sont jamais stockés dans votre dépôt Git, réduisant le risque d'accès non autorisé.
- Vous pouvez utiliser des identifiants différents pour divers environnements, comme utiliser une base de données de production en production et une base de données de développement pendant le développement.
Configuration des variables d'environnement pour le développement
Dans un environnement de développement, créez un fichier .env à la racine de votre projet. Ce fichier doit être exclu de Git pour s'assurer qu'il n'est jamais validé.
Pour lire automatiquement le fichier .env, vous pouvez utiliser le module python-dotenv :
pip install python-dotenv
pip freeze > requirements.txt
Ensuite, créez un fichier .env à la racine de votre projet et ajoutez vos variables :
ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...
Enfin, assurez-vous que le fichier .env est exclu de Git en l'ajoutant à votre .gitignore :
echo ".env" >> .gitignore
Configuration des variables d'environnement pour le staging et la production
Le fichier .env n'est pas suffisamment sécurisé pour les environnements de staging et de production. Au lieu de cela, Stackhero vous permet de stocker en toute sécurité vos variables d'environnement directement dans la configuration de votre service Python.
Vous pouvez définir ces variables dans le tableau de bord Stackhero en sélectionnant votre service Python, puis en cliquant sur le bouton "Configurer".
Variables d'environnement Python sur Stackhero
Accéder aux variables d'environnement en Python
Accéder aux variables d'environnement en Python est simple. Utilisez simplement os.environ.get() comme indiqué ci-dessous :
import os
print(os.environ.get('ENV'))
Par exemple, se connecter à un serveur Redis en utilisant une variable d'environnement peut se faire comme ceci :
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL"))
Dans un environnement de développement, définissez REDIS_URL dans votre fichier .env comme suit :
REDIS_URL="redis://localhost:6379"
Pour la production et le staging, définissez REDIS_URL sur le tableau de bord Stackhero sous la configuration du service Python :
REDIS_URL="rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:6380"
Gestion des packages Python
Il est recommandé de gérer les packages Python à l'aide d'un fichier requirements.txt. Ce fichier répertorie tous les packages nécessaires et leurs versions pour exécuter votre code de manière fiable.
Garder ce fichier à jour garantit :
- Tous les packages requis sont installés.
- Seules les versions de packages compatibles sont utilisées.
Lors du déploiement sur votre instance Stackhero, les packages spécifiés dans requirements.txt sont automatiquement installés.
Pour générer ou mettre à jour requirements.txt, exécutez la commande suivante après avoir installé de nouveaux packages :
pip freeze > requirements.txt
Ouverture des ports UDP/TCP
La plupart des applications Python utilisent les ports HTTP 80 (HTTP) et 443 (HTTPS).
Si votre application doit ouvrir des ports supplémentaires ou utilise d'autres protocoles (TCP ou UDP), vous pouvez ajuster le paramètre "Ports Redirections" dans votre service Python sur le tableau de bord Stackhero.
Pour chaque port supplémentaire, spécifiez le port d'entrée (public), le port de destination (utilisé par votre application Python) et le protocole (TCP ou UDP).
Redirections de ports dans le tableau de bord Stackhero
Stockage de fichiers
Pour stocker des fichiers tels que des photos d'utilisateur ou des documents, il est généralement préférable d'utiliser une solution de stockage d'objets.
Le stockage d'objets vous permet de partager des fichiers entre plusieurs services ou instances et sépare votre stockage de votre code, suivant les meilleures pratiques.
Nous recommandons MinIO, une solution rapide et puissante compatible avec le protocole Amazon S3.
Si vous préférez le stockage de fichiers local, vous pouvez utiliser le stockage persistant fourni avec votre instance Python situé à /persistent/storage/. Cependant, cette approche n'est pas recommandée dans la plupart des cas.
ATTENTION : Ne stockez jamais de données en dehors du dossier
/persistent/storage/!Stocker des données en dehors de ce dossier peut entraîner une perte de données lorsque votre instance est redémarrée, mise à jour ou lorsque vous poussez du nouveau code.
Apple/macOS : enregistrer le mot de passe de votre clé privée SSH
Sur macOS, il peut être gênant de saisir le mot de passe de votre clé privée SSH à chaque fois que vous poussez votre code. Bien que la sécurité soit primordiale, vous pouvez enregistrer votre mot de passe en toute sécurité en utilisant le Trousseau d'Apple plutôt que de le supprimer de votre clé.
Pour stocker le mot de passe d'une clé nommée id_ed25519, exécutez :
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Après cela, vous ne serez plus invité à entrer le mot de passe de votre clé, ce qui vous fera gagner du temps et des efforts.
Si vous utilisez une clé RSA à la place, remplacez
id_ed25519parid_rsadans la commande :ssh-add --apple-use-keychain ~/.ssh/id_rsa