Telegram: come creare un BOT con Python - 3 - deploy su Heroku di un container Docker

Benvenuti in questo terzo tutorial sui bot di Telegram. Abbiamo imparato a creare semplici bot col modulo telepot e ci siamo sbizzarriti per renderli sempre più raffinati. Finora abbiamo utilizzato le nostre macchine di sviluppo con accesso ad internet, ma non potremo sempre farci affidamento per mantenere attivi i nostri bot.

In questo veloce tutorial vedremo come creare una immagine Docker del bot presentato da Andrea nella seconda parte di questa serie e come deployarla in un container sul servizio di hosting Heroku.

Requisiti

  • Tutti i concetti spiegati nella parte 1 e 2 di questa serie
  • Concetti base di Docker
  • Un account Heroku

Modifiche al bot

Prima di procedere, mi sono permesso di fare una piccola modifica al codice del bot presentato da Andrea:

Per rendere il codice più sicuro e modularizzabile, ho impostato la lettura da variabile d'ambiente del token che ci ha restituito BotFather quando abbiamo creato il nostro bot. Nel seguito del tutorial vedremo come impostare il token tra le variabili d'ambiente del container.

Per pulizia, nella cartella di progetto contenente il file bot.py aggiungiamo un file requirements.txt. In questo caso, l'unico modulo python esterno alle librerie base di cui abbiamo bisogno è telepot, quindi il file requirements.txt conterrà una sola riga con scritto "telepot".

Creazione del Dockerfile

Abbiamo già parlato di Docker nell'articolo di Valentina che vi invito a rileggere per avere una infarinatura di base del framework.
Nella cartella del progetto andiamo ad aggiunge un Dockerfile così definito:

Dal file si nota che partiamo dall'immagine debian:stretch e andiamo ad installarci pip per gestire i moduli python. Avviato il container, sarà eseguito il comando python bot.py. Per provare il Dockerfile, possiamo creare l'immagine e successivamente avviare un container che la contenga:
docker build -t NOME_IMMAGINE:TAG .
docker run -d NOME_IMMAGINE:TAG
Se tutto è andato a buon fine digitiamo docker ps per controllare lo stato dei container attivi. Se è presente il container appena creato, il bot dovrebbe rispondere alle nostre richieste.
Per vedere i log del container, digitiamo il comando:
docker logs -f CONTAINER_ID

Deploy del container su Heroku

Procediamo adesso a crearci un account su Heroku seguendo le istruzioni sul sito ufficiale.
Una volta fatto, installiamo sulla nostra macchina Debian/Ubuntu la Command Line Interface di Heroku digitando il seguente comando:
sudo wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
In alternativa, per gli altri sistemi operativi, seguite le istruzioni ufficiali.

DISCLAIMER: ciò che segue della procedura presentata nel tutorial è tratto dalla guida ufficiale di Heroku per la gestione dei container Docker. Vi invito perciò a dargli un'occhiata prima di proseguire, così da avere un'idea generale delle operazioni che andremo ad eseguire.

Spostiamoci nella cartella contenente il Dockerfile ed eseguiamo i seguenti comandi
heroku login
heroku:container login
Col primo comando ci siamo loggati tramite la CLI al nostro account di Heroku, mentre col secondo comando ci siamo collegati al Container Registry di Heroku dove andremo a caricare il nostro container Docker.
Adesso siamo pronti a creare la nostra app:
heroku create
La CLI di Heroku ci risponderà con il nome casualmente generato per la nostra app. Solitamente il nome è formato da un aggettivo in inglese, un nome comune in inglese ed una sequenza numerica, separati da dei trattini.

Prima di andare avanti sul terminale, colleghiamoci alla dashboard di Heroku accedendo sul sito ufficiale.
Nella pagina personale troveremo l'elenco delle nostre app, tra cui quella appena creata.
Clicchiamo sulla nuova app e andiamo su Settings. Nella sezione Config Vars andiamo ad aggiungere la variabile d'ambiente contenente il token delle api di Telegram:
KEY=API_TOKEN
VALUE=token

Dopo aver salvato, torniamo sul terminale e digitiamo:
heroku container:push worker --app APP_NAME
Con questo comando, abbiamo fatto il push del container nel registry di Heroku. La parola chiave worker si riferisce al Process Type scelto per la nostra applicazione. Poichè abbiamo utilizzato MessageLoop al posto dei WebHooks forniti da telepot, la nostra app non necessita di essere esposta ad alcuna porta. Per questo motivo, non è stato utilizzato il Process Type web

Effettuiamo adesso il vero e proprio deploy della applicazione:
heroku container:release worker --app APP_NAME
heroku ps:scale worker=1 --app APP_NAME
Per controllare lo stato della nostra app, digitiamo:
heroku ps --app APP_NAME
Per dare un'occhiata ai log della nostra app, digitimo:
heroku logs --tail --app APP_NAME
Se l'app non fosse partita, proviamo a digitare:
heroku restart --app APP_NAME

Possiamo modificare il nome della nostra app con uno sperabilmente più parlante accedendo alla pagina Settings della dashboard di Heroku.

Conclusioni

Ora che la nostra applicazione è attiva su Heroku, possiamo provare ad interrogare il bot da Telegram e vedere che tutto funzioni correttamente.

Come sempre, vi invito a lasciare un commento in coda all'articolo per qualsiasi domanda, richiesta di chiarimento, appunto o preciazione da utenti più esperti di Python, Docker o Heroku.

Alessio Antonielli

Ingegnere informatico, appassionato di cinema, musica, videogiochi e serie tv. Insomma, le solite cose che vi aspettereste da un ex studente di Ingegneria Informatica, giusto per rafforzare lo stereotipo…

Telegram: come creare un BOT con Python - 3 - deploy su Heroku di un container Docker ultima modifica: 2018-07-05T13:18:43+01:00 da Alessio Antonielli


Advertisment ad adsense adlogger