TL;DR C'est simple, ça fonctionne sans problème et le support d'Alwaysdata est au top.
- Un compte (gratuit ou payant) chez Alwaysdata
- Une application fastapi prête à être déployée en utilisant Uvicorn
- Des connaissance de base en SSH et git
Nous allons partir du fait que votre site est sur un dépôt Git quelque part sur l'internet mondial et que nous allons le déployer via SSH. Vous pouvez aussi l'envoyer via FTP, il en faut pour tous les goûts après tout, et je ne vous jugerai pas pour cela, promis.
Tout d'abord, connectons-nous avec un mot de passe au serveur SSH Alwaysdata. Attention à bien activer la connexion par mot de passe pour l'utilisateur par défaut comme indiqué ci-dessous.
Vous pouvez à la place utiliser une clé SSH si vous le souhaitez.
Par défaut, la connexion ssh se fait via ssh [utilisateur]@ssh-[compte].alwaysdata.net
. Dans mon cas, le nom de l'utilisateur SSH et du compte Alwaysdata sont les mêmes, c'est à dire pereprogramming
. Ce qui donne:
ssh -A pereprogramming@ssh-pereprogramming.alwaysdata.net
Notez le -A
que j'ai rajouté dans la commande SSH. Il va nous permettre de transférer notre clée SSH locale sur le serveur (en session) et va nous permettre de faire des commandes git sur l
Vous devriez arriver sur un truc de ce style :
➜ pereprogramming git:(main) ✗ ssh pereprogramming@ssh-pereprogramming.alwaysdata.net
(pereprogramming@ssh-pereprogramming.alwaysdata.net) Password:
Linux ssh1 5.4.30-alwaysdata #1 SMP Fri Apr 3 15:02:12 UTC 2020 x86_64
* Any process using too much CPU, RAM or IO will get killed
* Any process running for too long (e.g. days) will get killed
* If you want to have cron jobs, use scheduled tasks: https://help.alwaysdata.com/en/tasks/
* If you want to have processes running 24/7, use services: https://help.alwaysdata.com/en/services/
pereprogramming@ssh1:~$
Je vais prendre comme exemple un simple HelloWord de fastapi disponible sur mon compte github. Déployons le dans ~/www/
:
cd www
git clone https://github.com/vjousse/fastapi-hello-world.git
Avec Alwaysdata, pas besoin d'environnement virtuel, nous allons installer FastAPI directement et ses autres dépendances, notamment Uvicorn :
pip install fastapi[all]
À ce stade, et pour peu que vous soyez bien dans le répertoire où votre code se situe (cd ~/www/fastapi-hello-world
pour moi) vous devriez être capable de lancer Uvicorn
directement avec la commande uvicorn main:app --reload
. Vous devriez alors obtenir quelque chose comme cela :
pereprogramming@ssh1:~/www/fastapi-hello-world$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [3561802] using watchgod
INFO: Started server process [3561808]
INFO: Waiting for application startup.
INFO: Application startup complete.
Tout cela valide que notre installation fonctionne, mais si vous essayez de vous rendre sur l'url http://[compte].alwaysdata.net/
vous verrez que notre application ne s'affiche pas.
Pour cela, il va falloir configurer notre type de site sur Alwaysdata. Vous pouvez quitter le serveur uvicorn
, c'était une fausse alerte :yum:
Par défaut, Alwaysdata s'attend à avoir un site en PHP. Ce n'est évidemment pas notre cas. Notre site n'est pas non plus un site « Python WSGI » classique puisque notre application FastAPI utilise forcément asyncio et n'est pas compatible avec WSGI. Nous allons donc devoir faire un type de site personnalisé, appelé « programme utilisateur » chez Alwasdata. En gros, nous allons lancer le serveur web uvicorn
et le faire écouter sur un port et un host particulier que le proxy d'Alwaysdata attend.
Voici la commande uvicorn
à exécuter pour que ce la fonctionne :
uvicorn main:app --port 8100 --host '::' --proxy-headers --forwarded-allow-ips "::1"
- Le port
8100
est le port sur lequel le proxy Alwaysdata va rediriger les requêtes. --host '::'
précise àuvicorn
d'écouter les requêtes sur toutes les IPs (V6). C'est l'équivalent du0.0.0.0
en IPV4. Il va nous permettre de recevoir les requêtes du proxy Alwaysdata.proxy-headers
permet àuvicorn
de recevoir les headers HTTPs qui sont envoyés au proxy Alwaysdata par le client web. Par défaut,uvicorn
les rejette.--forwarded-allow-ips ::1
précise àuvicorn
à partir de quel host on accepte les requêtes qu'on nous redirige.::1
en IPV6 correspond à127.0.0.1
en ipv4.
Vérifiez bien que la commande fonctionne avant d'aller plus loin. Vous devriez obtenir quelque chose comme ça :
pereprogramming@ssh1:~/www/fastapi-hello-world$ uvicorn main:app --port 8100 --host '::' --proxy-headers --forwarded-allow-ips "::1"
INFO: Started server process [1297268]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://[::]:8100 (Press CTRL+C to quit)
Une fois que c'est le cas, allez modifier le type de site dans l'administration Alwaysdata sur « programme utilisateur ».
Remplissez ensuite la partie Command
et Working Directory
avec respectivement la commande uvicorn
ci-dessus et le répertoire où se trouve votre code, /home/pereprogramming/www/fastapi-hello-world
pour moi.
Vous devriez obtenir quelque chose comme cela :
A priori, votre site devrait maintenant être fonctionnel.
Si ce n'est pas le cas, voici quelques éléments à savoir :
- Les fichiers de logs se trouvent dans
~/admin/logs/sites/
- Lorsque vous faites une modification, n'oubliez pas de « rédémarrer » votre site dans l'administration Alwaysdata sinon vous ne verrez pas la modification.
N'hésitez pas à me contacter sur Twitter si vous avez des questions.
Amusez-vous bien ! 🎉