Je ne sais pas déployer mon application

Haha,

Je vois souvent des personnes hésitantes, “je veux bien lancer un projet, mais oulala, t’as vu le prix de l’hébergement?” et ma réponse est: “Oui! Pas toi?”
Ok, fini de rigoler, le problème de Python, comme d’autres langages c’est que c’est chouette de réaliser une application, mais pour la rendre publique, lorsqu’on sort de github, ça devient un peu compliqué.
Pas de problème, tonton cGIfl300 va tout expliquer et gratis en plus, c’est pas bien?
Prenons un projet en django, j’aime bien parce que là c’est pas facile, il faut un serveur web qui supporte ton backend, installer quelques librairies exotiques parfois et pire, une base de données.
Alors là, c’est foutu, homme ou femme de peu de foi qui va balancer direct le tout sur github avec un “débrouillez vous moi j’ai juste testé en dev” ça va être limite.
La solution que je propose est volontairement orientée, je ne proposerais pas ici de solutions alternatives afin de ne pas compliquer la vie de chacun, l’objectif de cet article est de fournir une solution opérationnelle, pour le choix, chacun est libre d’adapter à ses besoins mes bons conseils.

Prérequis:
Avoir un projet django opérationnel, le projet de démo ira bien.
Avoir ouvert 3 comptes gratuits:

Voilà, maintenant que tout est dit, on va pouvoir jouer un peu.

Il vous faut commencer par aller sur votre page d’accueil replit.com:
https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT

Delà il faut cliquer sur “Templates”, là vous trouverez le modèle “Django App Template”.
Vous pouvez alors cliquer dessus, lui choisir un joli nom, ou conserver celui suggéré.
Vous arriverez ensuite sur un joli éditeur de code.
Appuyez sur “Run”.
Vous devriez voir l’application de démonstration de Django se lancer dans le volet de droite.
https://drive.google.com/uc?id=1RxfnYAzA-XP7L16NCpAxWnjRsZJlcxoY

Replit.com c’est en gros une image docker, le contenu dynamique est donc clairement non stocké, il sera au mieux effacé lorsque votre image se mettra en sommeil.

Vous avez au dessus de l’aperçu l’URL de votre site, tant que celui-ci est lancé, n’importe qui peut le lancer depuis la page de votre profil en appuyant sur play, pour peu que votre projet soit publique.

Vous pouvez aussi le synchroniser avec un dépôt github, ce qui est indéniablement très pratique.

La première chose à faire est donc de remplacer la base de données sqlite par une base de données postgres hébergée ailleurs, c’est là qu’entre en jeux elephantsql, ils offrent des bases de données gratuites, elles sont limitées à 100_000 enregistrements environ. Mais ce n’est pas bloquant pour une démonstration de projet, si vous désirez quelque chose d’un peu plus conséquent je vous donne toutes les clés à la fin.

Une fois votre compte créé sur elephantsql, prenez une base de données tortue pour votre projet. Notez bien le nom d’utilisateur, celui de la base de donnée (c’est le même si je me souviens bien) ainsi que le mot de passe et l’adresse du serveur.

Avant toute chose, ajoutez psycopg2 aux packages de votre application, depuis votre repl, à gauche, cliquez sur packages et ajoutez psycopg2. Il s’installera automatiquement.

Ce n’est pas nécessaire, on peut tout coder en dur, mais j’aime bien conserver une configuration dynamique, il faut maintenant ajouter quelques variables d’environnement à votre replit ce qui est facile, depuis votre projet, cliquez sur le cadenas à gauche, puis ajoutez les différentes variables nécessaires:

ENV = PRODUCTION
DATABASE_SERVER = <serveur de la base de données>
DATABASE_NAME = <nom de votre base de données>
DATABASE_USER = <nom d’utilisateur de la base de données>
DATABASE_PASSWORD = <mot de passe pour accéder à votre base de données>
DJANGO_SECRET = <votre django secret>

Il vous faudra aussi ajouter ceci à la fin de votre fichier settings.py de façon à ce que Django soit configuré convenablement.

if os.getenv("ENV") == "PRODUCTION":
	DEBUG = False
	DATABASES = {
    		'default': {
        	'ENGINE': 'django.db.backends.postgresql_psycopg2',
        	'NAME': os.getenv("DATABASE_NAME"),
        	'USER': os.getenv("DATABASE_USER"),
        	'PASSWORD': os.getenv("DATABASE_PASSWORD"),
        	'HOST': os.getenv("DATABASE_SERVER"),
        	'PORT': '',
    		}
}
SECRET_KEY = os.getenv("DJANGO_SECRET")

Ensuite, depuis l’onglet shell, lancez la migration:

python manage.py migrate

Si tout est convenablement configuré, vous utilisez maintenant la base de données postgresql en ligne.
Ultérieurement, pour continuer le développement, il vous suffit de changer la valeur de la variable d’environnement “ENV” et de la passer à DEV par exemple.
Maintenant on a une jolie application django qui fonctionne bien, avec sa base de donnée toute jolie.

Que faire du contenu statique?

Je conseil d’utiliser simplement Google Drive, et oui, je n’avais pas noté Google Drive dans les prérequis pour rien, il va nous être d’une grande utilité immédiate.
ou 14BnqXW_m71UGlTRxmj_zdwqytteYlJCT est l’ID de votre document permet par exemple d’utiliser une image de votre drive dans un template.

<img src="https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT" alt=“Jolie image”>

https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT

ASTUCE EN PRODUCTION:

Là il va falloir passer à la caisse.

Utilisez Heroku, une vrai base de donnée et un stockage amazon s3, c’est une autre histoire qui prends fin ici, si on me le demande beaucoup tout plein et si un jour j’ai le temps, pourquoi ne pas vous expliquer tout ça, sinon, allez explorer l’internet par vous même, vous pouvez même tout déployer depuis un petit VPS l’histoire de ne pas trop avoir de frais pour une application commerciale au début de sa vie.
Avec 6€ par mois, on peut commencer avec un joli VPS chez OVH et le surcharger à mort avec notre premier site, si le trafic augmente il faudra alors envisager une migration vers d’autres cieux, pour les connaissances, je dirais qu’il vous faut savoir déployer un service systemd, configurer nginx et postgresql, du reste, je déconseil l’utilisation de gunicorn derrière nginx, ce truc ne fait que ralentir le trafic pour rien.

J’espère que ce tutos express vous permettra de déployer un peu tout et n’importe quoi assez facilement avec python.
Maintenant que vous avez autant de machine en ligne que nécessaires, une jolie base de données et que vous savez héberger du contenu à moindre coût, j’attends vos créations avec impatience.

1 « J'aime »

Hello @cGIfl300,

Bravo pour ce post très intéressant. Je ne connaissais pas Replit et ElephantSQL, je pense les tester à l’avenir !

Pour ma part, je recommande PythonAnywhere pour héberger et déployer gratuitement un projet Python. Il y a des templates pour Django, Flask ou Web2py mais c’est assez facile de déployer n’importe quel projet existant en utilisant Git :wink:

Bon, il y a des limitations au compte gratuit, le nom de domaine sera forcément <username>.pythonanywhere.com, il y a seulement 512 MB de stockage max et d’autres limites CPU ou bande passante. Mais une fois que c’est testé et que cela fonctionne bien, c’est possible de passer au compte supérieur pour environ 5-6€/mois et cela débloque pas mal de choses sympas comme une base PostgreSQL ou encore un accès SSH (très pratique pour mettre en place du déploiement automatique via Github Actions par exemple :slightly_smiling_face:).

De plus, il y a un forum d’aide (en anglais) avec pleins de tutos et le staff répond assez vite aux mails.
L’un des points négatifs cependant, c’est qu’il n’est pas possible de déployer une application en mode asynchrone avec asgi (impossible d’utiliser Websocket donc). Mais peut-être que ça viendra plus tard !

Oui, il y en a tout plein, en fait l’avantage de replit c’est aussi de pouvoir lancer une application tkinter et plein d’autres langages aussi, comme C# et plein d’autres, c’est vraiment bien à tester.
Tu peux synchroniser avec un dépôt github, tu peux même faire des commits directement depuis l’interface de code.
Le gros + de replit c’est d’avoir juste le bouton play à presser. Pour un portofolio c’est super pratique, mais aussi en complément de github pour le “hey, regardez, ça marche en prod”.

1 « J'aime »