Python - Django - 5 - Deployment - parte 1

django python

In informatica, con il termine deployment si intende il rilascio, l'installazione e la messa in funzione di un programma. Quando lavoriamo con una applicazione web, il deployment inizia con l'installazione dell'applicazione su un server e la configurazione di tutti i servizi di utilità necessari.
Se abbiamo deciso di usare il framework Django saranno installati sul server:

  • l'interprete python
  • un gestore di pacchetti (pip)
  • un gestore di ambienti virtuali (virtualenv)
  • i moduli python necessari all'applicazione (Django, in primis)
  • un web server (nginx)
  • un DBMS (PosgreSQL)

In questa prima parte sul deployment di applicazioni Django vedremo come configurare il server di rilascio e come installare i componenti necessari alla nostra applicazione.
Anche se questa prima parte esula dall'argomento programmazione Django, ricordiamo che tutto il codice di esempio è disponibile sul nostro repository github.

Configurazione del Server di deployment

Per prima cosa dobbiamo procurarci una macchina da usare come server per il deployment. Esistono molti servizi online che mettono a disposizione server a pagamento per provare le proprie applicazioni. DigitalOcean ed Heroku sono due degli esempi più famosi.
In questo tutorial però andremo a configurare un Ubuntu Server su macchina virtuale utilizzando VirtualBox installato sulla nostra macchina di sviluppo, così da azzerare i costi dell'operazione. Risulta chiaro che ogni passo della configurazione del server può essere applicato senza problemi ad una macchina fisica.

Creazione della macchina virtuale

Scarichiamo dalla pagina ufficiale di Ubuntu il file .iso di Ubuntu Server 16.04.2 LTS, ovvero la versione a lungo termine esistente al momento della scrittura del presente articolo.
Una volta ottenuto il file .iso, lanciamo VirtualBox e creiamo una nuova macchina virtuale.

La procedura è piuttosto semplice, vi basterà cliccare sul tasto "Nuova" e seguire le istruzioni del wizard. Vi sarà richiesto un nome per la macchina, la versione del sistema operativo, quanta RAM e quanta memoria di massa assegnare alla macchina. Essendo il nostro un esempio molto leggero, ho seguito le indicazioni consigliate ed ho impostato 1 GB di RAM e 8 GB di Hard Disk.

Installazione del Sistema Operativo

Adesso che la macchina è stata creata, possiamo installarci sopra Ubuntu Server 16.04.2.
Dovrete indicare il file .iso che avete precedentemente scaricato per l'installazione. Anche questa procedura è abbastanza lineare. Vi sarà richiesto di scegliere un nome per la macchina (nell'esempio è stato scelto semplicemente il nome hostmachine), un nome utente ed una password. Per il nome utente, se state sviluppando sotto Linux, vi consiglio di scegliere lo stesso nome utente che utilizzate sulla vostra macchina di sviluppo. Vedremo in seguito perché.
Quando vi verrà richiesto di poter scrivere sul disco, digitate "Yes". Per tutte le altre configurazioni, potete lasciare le opzioni di default.
Una volta terminata l'installazione e riavviata la macchina, provate ad entrare con le credenziali appena create.
Prima di continuare con le configurazioni, facciamo login e digitiamo i seguenti comandi per aggiornare i componenti restanti della macchina:
sudo apt-get update
sudo apt-get upgrade

Configurazioni di rete per la macchina virtuale

Per ovvi motivi vogliamo che il nostro server di deployment virtuale sia accessibile dall'esterno. Per fare ciò, dobbiamo impostare la nostra macchina virtuale per permettere il port forwarding: dobbiamo redirigere il traffico di alcune delle porte della nostra macchina di sviluppo verso la macchina virtuale. In particolare, vogliamo mettere in comunicazione la porta 2222 della macchina di sviluppo con la 22 della macchina virtuale, e la porta 8080 con la 80. Il primo port forwarding serve per poterci collegare via protocollo SSH alla macchina virtuale. Il secondo port forwarding è invece impostato per permettere le comunicazioni col web server.
Per impostare il port forwarding da VirtualBox, cliccate su "Impostazioni" -> "Rete" -> "Avanzate" -> "Inoltro delle porte". Vi si aprirà una scheda come quella mostrata nell'immagine sottostante. Configurate le porte allo stesso modo.

Connessione Sicura con SSH

Adesso che abbiamo impostato il port forwarding, possiamo configurare tutto per utilizzare il protocollo SSH e controllare così la macchina virtuale direttamente dalla nostra macchina di sviluppo.
Dal terminale della macchina virtuale, installiamo openssh-server:
sudo apt-get install openssh-server.
Adesso apriamo un terminale nella macchina di sviluppo e digitiamo:
ssh utente@127.0.0.1 -p 2222
con utente uguale al nome utente scelto sulla macchina virtuale. Come risultato, ci siamo connessi via protocollo SSH alla macchina virtuale e possiamo così controllarla dal terminale della macchina di sviluppo.
Se avete lo stesso nome utente su entrambe le macchine, potete connettervi anche digitando solo:
ssh 127.0.0.1 -p 2222.
D'ora in poi, ogni operazione sulla macchina virtuale descritta in questa guida sarà eseguita da un terminale della macchina di sviluppo tramite protocollo SSH.

Utilizzare SSH senza password

Per evitare che vi sia richiesta la password ogni volta che vi collegate in SSH, vi consiglio di generare una coppia chiave pubblica - chiave privata e copiare la vostra chiave pubblica tra le chiavi autorizzate della macchina virtuale.
Per generare una coppia chiave pubblica - chiave privata sulla vostra macchina di sviluppo, digitate da terminale:
ssh-keygen -t rsa -b 4096 -C "utente@email.com"
Di default, sarà creato un file id_rsa.pub all'interno della cartella nascosta .ssh/ contenuta nella home.
Copiate il contenuto di id_rsa.pub nel file .ssh/authorized_keys nella home dell'utente della macchina virtuale.
A questo punto ogni volta che vi collegherete in SSH non vi sarà più richiesta la password.

Impostare un alias per la connessione

Invece di digitare l'intero comando ssh specificando il port forwarding verso la porta 2222, possiamo inserire un alias all'interno del file .ssh/config della macchina di sviluppo.
Se aggiungiamo le seguenti righe al file:

possiamo ottenere con:
ssh hostmachine
lo stesso risultato che avremmo ottenuto con:
ssh utente@127.0.0.1 -p 2222

Creazione Utente Applicativo

Ultimo passo, prima di passare all'installazione delle componenti specifiche per la nostra applicazione web, è creare un utente applicativo, ovvero un utente il cui unico compito all'interno della macchina sarà quello di far eseguire l'applicazione. Per questo motivo, i suoi privilegi saranno limitati alla cartella dell'applicazione.
Chiameremo l'utente applicativo deploy e imposteremo la sua home in /var/lib/deploy/ digitando:
sudo useradd -d /var/lib/deploy -s /bin/bash deploy
Per impostare la password dell'utente applicativo digitiamo:
sudo passwd deploy
Infine, per consentire all'utente deploy di leggere, scrivere ed eseguire i soli file contenuti in /var/lib/deploy, digitiamo:
sudo chown deploy -R /var/lib/deploy/

Per collegarci in SSH utilizzando l'utente deploy possiamo eseguire gli stessi passi del paragrafo precedente, aggiungendo la chiave pubblica in /var/lib/deploy/.ssh/authorized_keys e modificando .ssh/config nel seguente modo:

Installazione delle componenti necessarie

Adesso che abbiamo configurato la nostra macchina virtuale, possiamo passare all'installazione dei componenti necessari all'applicazione web.

Componenti python

Per prima cosa è necessario installare l'interprete python, il gestore di pacchetti pip ed il gestore di ambienti virtuali virtualenv.
Digitiamo i seguenti comandi per installare il tutto:
sudo apt-get install python-pip python-dev build-essential
sudo pip install virtualenv
Per ora il modulo virtualenvwrapper, di cui abbiamo parlato in questo articolo, non è necessario.

DBMS PostgreSQL

Invece di continuare ad usare SQLite come abbiamo fatto in sviluppo negli articoli precedenti, possiamo installare un DBMS più espressivo come PostgreSQL. Per installare il DBMS digitiamo i seguenti comandi:
sudo apt-get install libpq-dev python-dev
sudo apt-get install postgresql postgresql-contrib
Per verificare la corretta installazione, controlliamo che sia stato creato l'utente postgres:
sudo su - postgres

Web Server nginx

Infine, dobbiamo installare nginx, il web server che utilizzeremo per mettere a disposizione i servizi della nostra applicazione verso l'esterno.
Per l'installazione digitiamo:
sudo apt-get install nginx
Per verificare la corretta installazione, avviamo il servizio di nginx:
sudo service nginx start

Abbiamo adesso una macchina pronta per ospitare la nostra applicazione web Django. Nel prossimo articolo sul deployment vedremo come configurare le componenti appena installate per servire l'applicazione web.

Come sempre, vi invito a lasciare domande, dubbi o chiarimenti nei commenti a questo articolo.

Fonti

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…

Python - Django - 5 - Deployment - parte 1 ultima modifica: 2017-09-19T11:38:27+01:00 da Alessio Antonielli


Advertisment ad adsense adlogger