Come ospitare app leggere gratuitamente

Quando cerchi servizi di web hosting, ci sono molte opzioni gratuite disponibili. Ma non ci sono molti posti in cui è possibile ospitare app Web a stack completo che coinvolgono API, CGI o query back-end AJAX, soprattutto se si desidera utilizzare qualcosa di diverso da PHP.

Questo articolo è una guida semplice ma significativa "walk before you can run" su come iniziare a ospitare i tuoi script su server cloud.

Quando utilizzare una piattaforma per applicazioni cloud

Le piattaforme per applicazioni cloud funzionano bene in scenari in cui è necessario un po 'di codice per essere eseguito su un server. Molte di queste piattaforme offrono una serie di contenitori di applicazioni basati su Linux (che appaiono come macchine virtuali) in cui distribuisci il codice sviluppato sul tuo computer locale con una serie di parole chiave della riga di comando.

Heroku è uno di questi servizi che potresti usare per ospitare il tuo codice (in varie lingue) in modo relativamente semplice. Offre un modello freemium in cui ti consentono di utilizzare circa 500 ore di elaborazione gratuitamente (il prezzo completo è qui).

Dopo aver scritto il codice sul desktop locale, puoi eseguire comandi che distribuiscono il codice in un'area di lavoro in Heroku. Il codice viene quindi eseguito a seconda di un trigger. I trigger possono essere un lavoro pianificato, un server Web che viene attivato tramite una richiesta di una pagina Web o qualcosa che è in esecuzione costantemente ed elabora dati, il che potrebbe diventare piuttosto costoso.

La cosa veramente bella è che non devi preoccuparti del sistema operativo (memoria, archiviazione, CPU, patch di sicurezza) poiché è tutto gestito per te - ma allo stesso tempo significa che hai una flessibilità limitata poiché non puoi allocare direttamente le risorse.

Alcuni esempi specifici in cui Heroku può funzionare bene per te:

  • Ospitare il tuo sito web in cui desideri scrivere il tuo server web
  • Raschiare periodicamente i dati da un sito Web e quindi archiviarli su un database per l'analisi
  • Offrire un server API per un'attività specifica. Cose come l'offerta di dati meteorologici, l'archiviazione dei dati dei sensori dell'Internet of Things o una richiesta di servizio Web per un modello di apprendimento automatico
  • Un servizio di database (sebbene un servizio come Firebase sia forse più adatto)

Architettura Heroku

Heroku fornisce una macchina virtuale leggera (VM) per distribuire il codice. Tieni presente che con l'opzione gratuita puoi distribuire fino a 5 applicazioni considerate come 5 VM leggere. Per la tua applicazione effettiva, ti viene fornito un sottodominio URL separato sotto Heroku. Quindi i nomi dei tuoi progetti devono essere univoci.

Questi spazi di lavoro hanno il proprio spazio per componenti quali: file di codice e di risorse (non file di dati dinamici), database (Postgres) e file di registro.

Sul desktop locale, Heroku utilizza il nome della directory per definire il progetto e anche per Heroku per comprendere il contesto. Quindi puoi avere più progetti in directory diverse e quando esegui i comandi Heroku, assicurati di farlo nella cartella giusta.

L'unica cosa fondamentale di cui devi essere a conoscenza (che ho scoperto nel modo più duro durante ore di debug - vorrei aver prestato maggiore attenzione alla documentazione) è che tutto viene eseguito dalla memoria. Non c'è memoria persistente. Lo ripeto: non è possibile memorizzare alcun file sul file server! Per la persistenza, Heroku offre un database SQL postgress in cui è possibile aggiungere record come richiesto.

Un semplice esempio: rilevamento delle modifiche al sito web

Ecco una guida passo passo per ottenere un esempio funzionante di un semplice servizio che ti invierà un'email se un sito web è cambiato, fondamentalmente un clone di www.changedetection.com. Ci saranno diversi componenti chiave di questo:

  1. Un database che memorizzerà: (a) l'indirizzo di posta elettronica per la notifica di un sito Web modificato; (b) il sito web da monitorare; (c) l'ultima "copia" del sito web
  2. Un pezzo di codice che controllerà un determinato sito Web dal database in # 1 (script Python)
  3. Un pianificatore di lavori che eseguirà il programma in # 2 (equivalente a un cron job)
  4. Un'interfaccia utente Web in cui è possibile aggiungere / eliminare siti Web da monitorare nel database menzionato in # 1
  5. Un meccanismo per inviare e-mail

La comprensione di questi componenti ti fornirà le capacità per fare già molte cose. Ho imparato tutte queste cose da più fonti, quindi questo funge da post consolidato.

Presupposti

La seguente guida fa i seguenti presupposti:

  • Hai un account GitHub: in caso contrario, creane uno qui. Dovresti anche leggere questa semplice guida.
  • Hai già un account Heroku - se non lo fai, creane uno qui.
  • Stai utilizzando una macchina Windows - in caso contrario, va bene, le istruzioni sono abbastanza simili in altri ambienti
  • Hai già installato Python - se non lo fai, vai qui per installarlo
  • Puoi già programmare in Python - in caso contrario, ti suggerirei di imparare prima alcune delle basi. Alcune guide sono qui.
  • Conosci SQL - se non lo fai, per favore vai qui.

Panoramica dei passaggi

Trovo che passare attraverso un approccio "cammina prima di poter correre" aiuti con il processo di apprendimento. Serve anche come documentazione per te stesso su come risolvere ogni parte del processo più ampio. In questo modo, se qualcosa si rompe nella tua impresa futura, hai maggiori possibilità di capire dove è andato storto.

Passaggio 1 : sviluppa l'interfaccia utente web: crea prima Hello World

Passaggio 2 : persistenza: creare un database

Passaggio 3 : controlla i siti Web per le modifiche

Passaggio 4: invia una notifica e-mail sulle modifiche

Passaggio 5 : elenca l'output sulla pagina web

Passaggio 6: distribuzione

Passaggio 1: sviluppa l'interfaccia utente web: crea prima Hello World

Per prima cosa, creiamo un semplice programma distribuito su Heroku per iniziare. Questo programma sarà un precursore dell'interfaccia utente web (elemento n. 4) nell'elenco dei componenti sopra. Per servire una pagina, potremmo semplicemente avere una pagina HTML, ma poi avremmo bisogno di un server web per server quel file. In altre parole, quando si digita l'URL del sito Web, un programma dovrebbe interpretare la richiesta, quindi fornire il contenuto del file HTML. Puoi creare il tuo mini server web con la libreria Flask Python, che è quello che faremo.

  • Crea una cartella chiamata webchecker e vai in quella directory (questo nome di directory non deve essere lo stesso del nome dell'applicazione Heroku)
  • Installa la libreria Flask. Immettere il comando: npm Flask
  • Crea il seguente programma Python e chiamalo showchecks.py:

Prima di distribuire su Heroku, verifica che funzioni sul tuo PC locale. Puoi testarlo con i seguenti passaggi:

  • Esegui il programma: python webchecker.com
  • Apri il browser sul tuo PC locale e apri la pagina: // localhost: 5000 / hello

Quindi, distribuiamolo su Heroku. Prima di poter eseguire la distribuzione, è necessario includere alcuni file in più per aiutare Heroku a saperne di più sulla tua applicazione.

Innanzitutto, il file requirements.txt

Secondo, il file per dire a Heroku cosa eseguire quando viene effettuata una richiesta web:

Infine, la versione runtime di Python da utilizzare (il valore predefinito è 2.7, ma vogliamo specificare l'ultima versione di Python):

Quindi, dovresti avere quattro file:

  1. showchecker.py che è il codice
  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 )