Créer une API avec FastAPI et Docker

Le déploiement d'un serveur API prêt pour la production est généralement fastidieux, mais ce n'est pas obligatoire. Cela ne nous prendra qu'environ 15 minutes !

FastAPI est un framework python étonnant qui simplifie l'écriture d'API, mais c'est aussi très rapide ! Nous allons le construire dans un conteneur docker pour une portabilité maximale entre les fournisseurs et une utilisation potentielle dans les déploiements Kubernetes.

Mettre en place un projet

Nous allons utiliser la poetry pour gérer toutes nos dépendances ( un peu comme npm dans le monde Nodejs). Pour le développement, nous allons utiliser la méthode recommandée pour installer poetry :

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

Remarque : vous devrez peut-être ajouter de la poetry à votre PATH à ce stade:

export PATH=$PATH:$HOME/.poetry/bin

Ensuite, nous allons initialiser notre répertoire de projet. Ici, nous faisions une API appelée "orangutan", alors configurons notre répertoire comme ceci :

orangutan
    - orangutan        
        - server.py

commençons par un serveur extrêmement basique (pour apprendre à créer une API plus compliquée / complète, consultez le tutoriel officiel FastAPI ):

Nous devons réellement installer notre dépendance Fastapi avec toutes les dépendances supplémentaires. Mettons en place la Poetry:

poetry init

Il vous sera demandé d'ajouter vos dépendances au cours de ce processus d'initialisation, mais vous pourrez toujours le faire après également en utilisant :

poetry add package_name

Nous devons nous assurer d'ajouter notre dépendance fastapi et ajoutons également des packages communs à notre API Orangutan :

poetry add fastapi
poetry add requests
poetry add pymongo
poetry add -D black --allow-prereleases
poetry add -D pytest
poetry add -D flake8

Remarque : l'indicateur -D marque une dépendance en tant que dépendance de développement que nous pouvons en toute sécurité exclure de notre déploiement de production. Le flag --allow-prereleases sur notre ajout de black est requis, car techniquement, il n'est pas publié, ajoutez-le seulement à la dépendance black.

Notre structure de dossiers devrait maintenant ressembler à

orangutan
    - orangutan
        - server.py
    - pyproject.toml
    - poetry.lock

Configurer Docker

Nous allons emballer notre API dans un conteneur docker pour la production. Assurez-vous que le docker est configuré et installé sur votre machine locale. Ensuite, nous pouvons commencer par ajouter un Dockerfile dans notre répertoire orang-outan de base :

Nous pouvons utiliser l'image docker uvicorn-gunicorn-fastapi-docker, car elle fait beaucoup de travail pour nous, avec des valeurs par défaut raisonnables.

Remarque : Nous devons désactiver le comportement par défaut de la poetry pour créer des environnements virtuels pour chacun de nos projets, car tout est déjà isolé dans le conteneur du docker.

Remarque : nous installons la poetry différemment ici, car il est plus facile d'épingler plus tard la version de poetry dont nous avons besoin pour nous assurer qu'aucun changement inattendu ne se produit.

Nous devons simplement déplacer nos fichiers dans le répertoire approprié et l'image du docker se chargera du reste.

Remarque : assurez-vous que votre instance FastAPI () est référencée par une variable nommée app ou vous pouvez modifier l'ENV du conteneur Docker pour refléter son nom .

Essayons de construire notre image maintenant à partir de notre répertoire de base !

docker build -t orangutan ./

Cela aurait dû se terminer avec succès, lancez ensuite le conteneur sur notre machine locale pour nous assurer qu'il fonctionne :

docker run -d --name orangutan0 -p 80:80 orangutan

Le paramètre -d lance notre conteneur en tant que démon, le paramètre -name nomme notre conteneur et le paramètre -p publie un port pour un accès en dehors de docker. Nous devrions maintenant avoir un conteneur orangutan0fonctionnant sur notre machine locale auquel nous pouvons accéder via http://127.0.0.1/ 🥳

Déployer sur un serveur

Nous allons utiliser un droplet Digital Ocean pour déployer notre API, mais vous pouvez la déployer n'importe où qui peut exécuter des conteneurs docker ! Voici les étapes :

  1. Poussez notre image docker vers Docker Hub
  2. Créer un droplet
  3. Se connecter en ssh
  4. Téléchargez notre image sur notre serveur
  5. Lancez notre API orang-outan 🚀

Créons donc un référentiel et y poussons notre image sur Docker Hub (le référentiel hébergé par défaut pour les images docker, vous devrez avoir un compte et être connecté)

docker tag orangutan:latest orangutan:latest
docker push dockerhub_username/orangutan:latest

Remarque : cela crée un dépôt public. Nous ne voulons probablement pas de cela en production, mais vous pouvez changer cela sur https://hub.docker.com/repositories .

Maintenant que notre image est accessible au public, faisons tourner notre serveur (ce n'est qu'un vps). Nous allons utiliser rancherOS car il est spécialement conçu pour héberger des conteneurs et est très léger. Nous n'avons pas vraiment besoin d'un système d'exploitation complet puisque nous ne faisons qu'exécuter notre conteneur.

Une fois que vous avez créé un droplet rancherOS. Faisons entrer l'utilisateur rancher (vous aurez besoin de fournir une clé ssh associée à digitalocean pour même créer le droplet)

ssh rancher@your_droplet_ip

À partir de là, nous devons exécuter quelques commandes pour extraire et lancer notre image :

docker login
docker pull dockerhub_username/orangutan
docker run -d --name orangutan0 -p 80:80 dockerhub_username/orangutan

Essayons maintenant de visiter l'IP de notre droplet! 🚀 Nous avons déployé notre API !