Comment héberger gratuitement des applications légères

Lorsque vous recherchez des services d'hébergement Web, de nombreuses options gratuites sont disponibles. Mais il n'y a pas beaucoup d'endroits où vous pouvez héberger des applications Web à pile complète qui impliquent des requêtes de backend API, CGI ou AJAX - surtout si vous souhaitez utiliser autre chose que PHP.

Cet article est un guide simple mais significatif «marche avant de pouvoir exécuter» sur la façon de commencer à héberger vos scripts sur des serveurs cloud.

Quand utiliser une plateforme d'applications cloud

Les plates-formes d'applications cloud fonctionnent bien dans les scénarios où vous avez besoin d'un peu de code pour s'exécuter sur un serveur. Beaucoup de ces plates-formes offrent une série de conteneurs d'applications basés sur Linux (qui ressemblent à des machines virtuelles) dans lesquels vous déployez le code que vous avez développé sur votre ordinateur local avec un ensemble de mots-clés de ligne de commande.

Heroku est l'un de ces services que vous pouvez utiliser pour héberger votre code (dans différentes langues) relativement facilement. Il propose un modèle freemium où ils vous permettent d'utiliser environ 500 heures de calcul gratuitement (leur prix complet est ici).

Une fois que vous avez écrit votre code sur votre bureau local, vous pouvez exécuter des commandes qui déploient le code sur un espace de travail dans Heroku. Le code s'exécute ensuite en fonction d'un déclencheur. Les déclencheurs peuvent être une tâche planifiée, un serveur Web qui est déclenché par une demande de page Web, ou quelque chose qui s'exécute constamment et traite des données - ce qui peut coûter assez cher.

Ce qui est vraiment bien, c'est que vous n'avez pas à vous soucier du système d'exploitation (mémoire, stockage, processeur, correctifs de sécurité) car tout est géré pour vous - mais en même temps, cela signifie que vous avez une flexibilité limitée car vous ne pouvez pas allouer directement les ressources.

Quelques exemples spécifiques où Heroku peut bien fonctionner pour vous:

  • Hébergement de votre propre site Web où vous souhaitez écrire votre propre serveur Web
  • Récupérer périodiquement les données d'un site Web, puis les stocker dans une base de données pour analyse
  • Offrir un serveur API pour une tâche spécifique. Des choses comme offrir des données météorologiques, stocker des données de capteur de l'Internet des objets ou un appel de service Web pour un modèle d'apprentissage automatique
  • Un service de base de données (bien qu'un service tel que Firebase soit peut-être mieux adapté)

Architecture d'Heroku

Heroku fournit une machine virtuelle (VM) légère pour vous permettre de déployer votre code. Notez que sous l'option gratuite, vous pouvez déployer jusqu'à 5 applications considérées comme 5 VM légères. Pour votre application actuelle, un sous-domaine URL distinct vous est fourni sous Heroku. Les noms de vos projets doivent donc être uniques.

Ces espaces de travail ont leur propre espace pour les composants tels que: les fichiers de code et de ressources (pas les fichiers de données dynamiques), la base de données (Postgres) et les fichiers journaux.

Sur votre bureau local, Heroku utilise le nom de votre répertoire pour définir votre projet, et également pour Heroku pour comprendre votre contexte. Ainsi, vous pouvez avoir plusieurs projets dans différents répertoires et lorsque vous exécutez les commandes Heroku - assurez-vous simplement de le faire dans le bon dossier.

La seule chose clé dont vous devez être conscient (que j'ai découvert à la dure à travers des heures de débogage - j'aimerais accorder plus d'attention à la documentation) est que tout est exécuté à partir de la mémoire. Il n'y a pas de stockage persistant. Je le répète - vous ne pouvez pas stocker de fichiers sur le serveur de fichiers! Pour la persistance, Heroku propose une base de données SQL postgress où vous pouvez ajouter des enregistrements selon vos besoins.

Un exemple simple - détection de changement de site Web

Voici un guide étape par étape pour obtenir un exemple fonctionnel d'un service simple qui vous enverra un e-mail si un site Web a changé - essentiellement un clone de www.changedetection.com. Il y aura plusieurs éléments clés de ceci:

  1. Une base de données qui stockera: (a) l'adresse e-mail pour informer d'un site Web modifié; (b) le site Web à suivre; (c) la dernière `` copie '' du site Web
  2. Un morceau de code qui vérifiera un site Web donné à partir de la base de données en # 1 (script Python)
  3. Un planificateur de travaux qui exécutera le programme en # 2 (équivalent d'un travail cron)
  4. Une interface utilisateur Web où vous pouvez ajouter / supprimer des sites Web à surveiller dans la base de données mentionnée au n ° 1
  5. Un mécanisme pour envoyer des emails

Comprendre ces composants vous permettra d'acquérir les compétences nécessaires pour faire déjà beaucoup de choses. J'ai appris toutes ces choses à travers plusieurs sources, donc cela agit comme un article consolidé.

Hypothèses

Le guide suivant formule les hypothèses suivantes:

  • Vous avez un compte GitHub - si ce n'est pas le cas, veuillez en créer un ici. Vous devriez également lire ce guide simple.
  • Vous avez déjà un compte Heroku - si vous ne le faites pas, veuillez en créer un ici.
  • Vous utilisez une machine Windows - sinon, ça va, les instructions sont assez similaires dans d'autres environnements
  • Vous avez déjà installé Python - si ce n'est pas le cas, veuillez cliquer ici pour l'installer
  • Vous pouvez déjà programmer en Python - sinon, je vous suggère d'apprendre d'abord certaines des bases. Quelques guides sont ici.
  • Vous connaissez SQL - si ce n'est pas le cas, allez ici.

Aperçu des étapes

Je trouve que passer par une approche «marcher avant de pouvoir courir» aide avec le processus d'apprentissage. Il sert également de documentation pour vous-même sur la façon de résoudre chaque élément du processus plus large. De cette façon, si quelque chose se brise dans votre entreprise future, vous avez une meilleure chance de comprendre où cela s'est mal passé.

Étape 1 : Développer l'interface utilisateur Web - Créez d'abord Hello World

Étape 2 : Persistance - créer une base de données

Étape 3 : Vérifiez les sites Web pour les changements

Étape 4: envoyer une notification par e-mail sur les modifications

Étape 5 : Listez la sortie sur la page Web

Étape 6: déployer

Étape 1: Développer l'interface utilisateur Web - Créez d'abord Hello World

First, let’s get a simple program deployed onto Heroku to get things started. This program will be a precursor to the web user interface (item #4) in the components list above. In order to serve up a page, we could simply have an HTML page, but then we would need to have a web server to server that file. In other words, when you type in the URL of the website, a program would need to interpret the request, then provide the contents of the HTML file. You can create your own mini web server with the Flask Python library, which is what we’ll do.

  • Create a folder called webchecker and go into that directory (this directory name does not have to be the same as the Heroku application name)
  • Install the Flask library. Enter the command: npm Flask
  • Create the following Python program and name it showchecks.py:

Before you deploy to Heroku, test that it works on your local PC. You can test it with the following steps:

  • Run the program: python webchecker.com
  • Open up your browser on your local pc and open up the page: //localhost:5000/hello

Next, let’s deploy this to Heroku. Before you can deploy, there needs to be a few more files that need to be included to help Heroku know more about your application.

First, the requirements.txt

Second, the file to tell Heroku what to run when a webrequest is made:

Finally, the runtime version of Python to use (default is 2.7, but we want to specify the latest version of Python):

Hence, you should have four files:

  1. showchecker.py which is the code
  2. requirements.txt for the list of non-standard library dependencies. Whenever you have new libraries which are not part of the Python Standard Library — i.e. you need to install them using a tool such as “pip” — then add these here. You can find the version of an installed library such as Flask by running the command: pip show Flask in the command line
  3. Procfile which is the actual Python script to run when the website is called — make sure to update this if you change the Python file
  4. runtime.txt which is the actual version of python to use

You can deploy with the following steps from the command line:

  1. heroku create webchecker01 — buildpack heroku/python
  2. git add *.* *
  3. git status
  4. git commit -m “all files”
  5. git push heroku master

For the command #1 (heroku create…), the “webechecker01” part is the unique name you’ll need to provide for the name of the app.

For command #3 (git status) this will tell you what files are ready to be deployed. Make sure all files are there, if not add them using git add me>.

Now you can check your website: .herokuapp.com/hello

Original text


Let’s also make sure we can see the logs since this is a great way to see what’s going on with your app server. On your PC and in the webchecker directory, run the command: heroku logs

You’ll see the last execution steps. If things aren’t working as expected, this is your first stop to find out more detail.

You can also go to the Heroku dashboard to see your consumption:

//dashboard.heroku.com

Step 2: Persistence — create a database

In order to make more useful programs, you’ll need to have a data store of sorts. This is where the Postgres database service comes into play. You first need to deploy the Heroku database service, then create your tables, and finally be able to connect to the database from your code locally (for testing).

To deploy a database service, first create it using the following command:

heroku addons:create heroku-postgresql:hobby-dev

Next, access the database from the command line and create your tables. The database is created on the Heroku cloud service and not locally. However, you can access it through the command line. To log on to the database via the console, run the command heroku pg:psql. Remember, you have to do it in your webchecker folder so that Heroku knows that it is the database for the webchecker site.

To see the list of tables type the command \d

To create a table, you need to use normal SQL statements. For our webchecker program, let’s create a table with the following columns:

  • ID — automatically generated ID for each entry (this will be the primary key). This is done by using the type “serial”
  • website — the website to monitor
  • emailaddress — the email address to send the notification that a change has occurred
  • lasthashcode — we won’t store a copy of the whole webpage, instead we will generate a hash based on the HTML of the page, and then compare this each time. This is more efficient storage-wise, but will not tell us what actually changed
  • lastchangedate — the date that the web changed last time. Hence we will get the database to default this with the current date

To create this table, enter the following command in the Heroku Postgres database console:

CREATE TABLE webcheckerdb (id serial, website varchar(250), emailaddress varchar(250), lasthashcode varchar(32), lastchangedate timestamp DEFAULT current_date );

(Make sure you include the semicolon at the end!)

Next, let’s insert a single record in the database to ensure we have something to work with prior to getting our web UI up and running (you can use your own email address so it works in the future):

INSERT into webcheckerdb values(DEFAULT, 'news.google.com', '[email protected]', '', DEFAULT);

(Make sure you include the semicolon at the end!)

You can quit with \q.

Step 3: Check websites for changes

First, let’s get a piece of code to at least check if a hardcoded site can be retrieved (following on the concept of walking before running).

Hence, first step is to see if we can retrieve a webpage, hash it, and then compare it to a hardcoded hash. Create a new Python file called checkwebsite.py. Code here:

Running this will output the following:

If you have any errors with missing libraries, you can add them via: pip install ry> from the command line.

Next, let’s connect to the database with the following code:

When you try to run this code, you are likely going to get an error of the form KeyError: ‘DATABASE_URL’. This is because your Python code is trying to locate the web address of the Postgres database hosted on Heroku. This is automatically updated to the environment variable DATABASE_URL in the Heroku server. However, on your local PC you will have to do this manually:

  1. heroku config
  2. set DATABASE_URL=

Step 4: Send an email notification on changes

Final step is to send an email. To do this, you’ll need to install an Addon that has the ability to send emails — you can find these via the Heroku marketplace: //elements.heroku.com/addons

In here, there is an Addon called SendGrid: //elements.heroku.com/addons/sendgrid

You can add SendGrid to your app in the command line by typing:

heroku addons:create sendgrid:starter

When you go to your dashboard you can see the new Addon in the Resources section:

Before using it, you’ll need to create an API key. Double click the SendGrid component above and go into Settings->API Key->Create Key (blue button on top right).

Once you create the key, copy it and go back to the command prompt and enter:

heroku config:set SENDGRID_API_KEY=ve>

This will only register it on the server, you need to add it locally to your desktop with:

set SENDGRID_API_KEY=in>

Once done, you can test your code in a new Python script called sendmail.py. Install the library via pip install sendgrid:

To confirm the email was sent and delivered, you can go back to the SendGrid dashboard and checking the Statistics Overview screen:

When checking your email, remember to check your spam.

Once it is working, there are only two lines of code you need to add to your main checkwebsite.py script. It is:

import sendmail #import the send email subroutine you wrote above
...
#call the subroutine after find the hashcode has changedsendmail.sendemail(webrecord['emailaddress'], 'Website changed', webrecord['website'] + ' changed')

The full code is here:

Step 5: List the output on the web page and schedule the job

The next step is to list the output on the webpage.

This involves querying the database, and then cycling through and showing the data on your screen. Hence, it takes the ‘Hello World’ code above, and makes the modification. I also created a different path for this, so to test this out you’ll need to go to the URL: //localhost:5000/list

And here’s the output:

Step 6: Deploy

The final step is to deploy everything to Heroku and then schedule the job so that it checks email.

You should have the following files:

  1. Procfile — the file which points to showchecker.py
  2. requirements.txt — the file which contains the library dependencies
  3. runtime.txt — the version of python
  4. showchecker.py — the python code which shows the database output on the web via .herokuapp.com/list
  5. checkwebsite.py — the python code that checks for any changes on the websites

For the requirements.txt, you will need to make amendments to add the latest libraries:

Deploy these all to Heroku:

  1. git add *.* *
  2. git commit -m “deployment”
  3. git push heroku master

Test each component:

  1. Go to .herokuapp.com/hello
  2. Go to .herokuapp.com/list

If there are any errors, then run heroku logs in the command line to see what is going on.

Next, run the checkwebsite.py directly on Heroku to make sure there are no issues. To do this, you can type:

heroku run python checkwebsite.py

Finally, you can now schedule your job. Again, you need to include an Addon to do this.

heroku addons:create scheduler:standard

And you should be able to see the scheduler in your resources page:

You can simply use the command line to run the program, in our case it is: python checkwebsite.py (this is the same as what we tested above with the heroku run command).

Summary

And that’s it… the first time it is a little complex, but hopefully the above incremental steps will help you understand what’s going on under the hood. There are a lot more resources on Heroku as well as a wealth of information on Stack Overflow. These resources should make a lot more sense after going through the above.

Good Luck!

Thanks for reading! If you like what you read, hit the❤ button below so that others may find this (you can also find me on Twitter )