Cómo alojar aplicaciones ligeras de forma gratuita

Cuando busca servicios de alojamiento web, hay muchas opciones gratuitas disponibles. Pero no hay muchos lugares donde pueda alojar aplicaciones web de pila completa que involucren API, CGI o consultas de backend AJAX, especialmente si desea usar algo que no sea PHP.

Este artículo es una guía sencilla pero significativa de "paseo antes de poder ejecutar" sobre cómo empezar a alojar sus scripts en servidores en la nube.

Cuándo usar una plataforma de aplicaciones en la nube

Las plataformas de aplicaciones en la nube funcionan bien en escenarios en los que necesita un poco de código para ejecutarse en un servidor. Muchas de estas plataformas ofrecen una serie de contenedores de aplicaciones basados ​​en Linux (que aparecen como máquinas virtuales) donde implementa el código que desarrolló en su computadora local con un conjunto de palabras clave de línea de comando.

Heroku es uno de esos servicios que puede utilizar para alojar su código (en varios idiomas) con relativa facilidad. Ofrece un modelo freemium en el que le permiten usar aproximadamente 500 horas de computación gratis (su precio completo está aquí).

Una vez que haya escrito su código en su escritorio local, puede ejecutar comandos que implementan el código en un espacio de trabajo en Heroku. El código luego se ejecuta dependiendo de un disparador. Los activadores pueden ser un trabajo programado, un servidor web que se activa a través de una solicitud de página web o algo que se ejecuta constantemente y procesa datos, lo que podría resultar bastante caro.

Lo que es realmente bueno es que no tiene que preocuparse por el sistema operativo (memoria, almacenamiento, CPU, parches de seguridad) ya que todo está administrado por usted, pero al mismo tiempo significa que tiene una flexibilidad limitada ya que no puede Asignar recursos directamente.

Algunos ejemplos específicos en los que Heroku puede funcionar muy bien para usted:

  • Alojar su propio sitio web donde desee escribir su propio servidor web
  • Extraer periódicamente datos de un sitio web y luego almacenarlos en una base de datos para su análisis
  • Ofreciendo un servidor API para una tarea específica. Cosas como ofrecer datos meteorológicos, almacenar datos de sensores de Internet de las cosas o una llamada de servicio web para un modelo de aprendizaje automático
  • Un servicio de base de datos (aunque un servicio como Firebase posiblemente sea más adecuado)

Arquitectura Heroku

Heroku proporciona una máquina virtual (VM) liviana para que implemente su código. Tenga en cuenta que, con la opción gratuita, puede implementar hasta 5 aplicaciones que se consideran 5 máquinas virtuales ligeras. Para su aplicación real, se le proporciona un subdominio de URL separado en Heroku. Por lo tanto, los nombres de sus proyectos deben ser únicos.

Estos espacios de trabajo tienen su propio espacio para componentes tales como: archivos de código y recursos (no archivos de datos dinámicos), base de datos (Postgres) y archivos de registro.

En su escritorio local, Heroku usa el nombre de su directorio para definir su proyecto y también para que Heroku comprenda su contexto. Por lo tanto, puede tener varios proyectos en diferentes directorios y cuando ejecute los comandos de Heroku, asegúrese de hacerlo en la carpeta correcta.

La única cosa clave que debe tener en cuenta (que descubrí por las malas durante horas de depuración, desearía prestar más atención a la documentación) es que todo se ejecuta desde la memoria. No hay almacenamiento persistente. Lo diré de nuevo: ¡no puede almacenar ningún archivo en el servidor de archivos! Para la persistencia, Heroku ofrece una base de datos SQL posterior al progreso donde puede agregar registros según sea necesario.

Un ejemplo simple: detección de cambios en el sitio web

Aquí hay una guía paso a paso para obtener un ejemplo funcional de un servicio simple que le enviará un correo electrónico si un sitio web ha cambiado, básicamente un clon de www.changedetection.com. Habrá varios componentes clave de esto:

  1. Una base de datos que almacenará: (a) la dirección de correo electrónico para notificar un sitio web modificado; (b) el sitio web para rastrear; (c) la última 'copia' del sitio web
  2. Un fragmento de código que verificará un sitio web determinado de la base de datos en el n. ° 1 (secuencia de comandos de Python)
  3. Un programador de trabajos que ejecutará el programa en el n. ° 2 (equivalente a un trabajo cron)
  4. Una interfaz de usuario web donde puede agregar / eliminar sitios web para monitorear en la base de datos mencionada en el n. ° 1
  5. Un mecanismo para enviar correos electrónicos

Comprender estos componentes le proporcionará las habilidades para hacer muchas cosas. Aprendí todas estas cosas a través de múltiples fuentes, por lo que esto actúa como una publicación consolidada.

Supuestos

La siguiente guía hace las siguientes suposiciones:

  • Tienes una cuenta de GitHub; si no la tienes, crea una aquí. También debería leer esta sencilla guía.
  • Ya tiene una cuenta de Heroku; si no la tiene, cree una aquí.
  • Está ejecutando una máquina con Windows; si no, está bien, las instrucciones son bastante similares en otros entornos
  • Ya tiene Python instalado; si no lo tiene, vaya aquí para instalarlo
  • Ya puede programar en Python; de lo contrario, le sugiero que primero aprenda algunos de los conceptos básicos. Algunas guías están aquí.
  • Ya conoce SQL; si no lo sabe, vaya aquí.

Resumen de los pasos

Encuentro que seguir un enfoque de 'caminar antes de poder correr' ayuda con el proceso de aprendizaje. También sirve como documentación para usted mismo sobre cómo resolver cada parte del proceso más grande. De esa manera, si algo se rompe en su esfuerzo futuro, tiene más posibilidades de averiguar dónde salió mal.

Paso 1 : Desarrolle la interfaz de usuario web: primero cree Hello World

Paso 2 : Persistencia: crea una base de datos

Paso 3 : revisa los sitios web para ver si hay cambios

Paso 4: envíe una notificación por correo electrónico sobre los cambios

Paso 5 : enumere el resultado en la página web

Paso 6: Implementar

Paso 1: Desarrolle la interfaz de usuario web: primero cree Hello World

Primero, implementemos un programa simple en Heroku para comenzar. Este programa será un precursor de la interfaz de usuario web (elemento # 4) en la lista de componentes anterior. Para servir una página, simplemente podríamos tener una página HTML, pero luego necesitaríamos tener un servidor web para servir ese archivo. En otras palabras, cuando escribe la URL del sitio web, un programa necesitaría interpretar la solicitud y luego proporcionar el contenido del archivo HTML. Puede crear su propio mini servidor web con la biblioteca Flask Python, que es lo que haremos.

  • Cree una carpeta llamada webchecker y vaya a ese directorio (este nombre de directorio no tiene que ser el mismo que el nombre de la aplicación Heroku)
  • Instale la biblioteca Flask. Ingrese el comando: npm Flask
  • Cree el siguiente programa Python y asígnele el nombre showchecks.py:

Antes de implementar en Heroku, pruebe que funcione en su PC local. Puedes probarlo con los siguientes pasos:

  • Ejecute el programa: python webchecker.com
  • Abra su navegador en su PC local y abra la página: // localhost: 5000 / hello

A continuación, implementemos esto en Heroku. Antes de que pueda implementar, debe haber algunos archivos más que deben incluirse para ayudar a Heroku a saber más sobre su aplicación.

Primero, los requisitos.txt

En segundo lugar, el archivo para decirle a Heroku qué debe ejecutar cuando se realiza una webrequest:

Finalmente, la versión en tiempo de ejecución de Python a usar (la predeterminada es 2.7, pero queremos especificar la última versión de Python):

Por lo tanto, debería tener cuatro archivos:

  1. showchecker.py que es el código
  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

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 )