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:
1 2 3 4 |
Host hostmachine Hostname 127.0.0.1 Port 2222 User utente |
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:
1 2 3 4 5 6 7 8 9 |
Host hostmachine Hostname 127.0.0.1 Port 2222 User utente Host hostmachine-deploy Hostname 127.0.0.1 Port 2222 User deploy |
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
