Come distribuire un'applicazione su un server remoto con Deployer PHP da SO Ubuntu

Il deploy di un'applicazione è una fase molto importante ed è conveniente usare strumenti appositi che ci consentono di facilitare le operazioni più comuni come ad esempio un rollback alla versione precedente.

Pubblicato da ,
Ultima modifica

Questo articolo ha lo scopo di illustrare in modo basilare come utilizzare Deployer PHP su un SO Ubuntu, in particolare come configurare la nostra applicazione PHP per effettuare il deploy su un server remoto, come passare da una release all'altra, ad esempio nel caso in cui si voglia effettuare un rollback della nostra applicazione nel caso si verifichino dei malfunzionamenti o per altri motivi, o semplicemente passare ad un'altra release.

Si presuppone inoltre che si abbia già un'applicazione collegata ad un repository remoto e inizializzata con composer, e una connessione ssh attiva sul server di produzione.

La prima cosa che faremo è installare Deployer PHP nel nostro progetto, quindi dalla root lanciamo il seguente comando da CLI

$ composer require --dev deployer/deployer

Adesso possiamo inizializzare il progetto con deployer lanciando il seguente comando dalla root del nostro progetto

$ vendor/bin/dep init

ci verranno chieste alcune informazioni, selezionare il linguaggio con cui vogliamo creare il file di deploy

$ vendor/bin/dep init
Select recipe language [php]:
[0] php
[1] yaml
> 0

in questo esempio scegliamo 0 (che corrisponde a php) e poi invio, poi ci verrà chiesto il tipo di progetto, abbiamo diverse opzioni laravel, joomla, zend_framwork, etc...,

Select project template [common]:
	[0 ] cakephp
	[1 ] codeigniter
	[2 ] common
	[3 ] composer
	[4 ] contao
	[5 ] craftcms
	[6 ] drupal7
	[7 ] drupal8
	[8 ] flow_framework
	[9 ] fuelphp
	[10] joomla
	[11] laravel
	[12] magento
	[13] magento2
	[14] pimcore
	[15] prestashop
	[16] provision
	[17] shopware
	[18] silverstripe
	[19] statamic
	[20] sulu
	[21] symfony
	[22] typo3
	[23] wordpress
	[24] yii
	[25] zend_framwork
> 2

in questo esempio scegliamo common che sarebbe un progetto generico, quindi digitiamo 2 e poi invio, poi ci verrà indicato il link del repository (in questo esempio è https://github.com/MicheleDeF/deployer-example.git), poi il nome del progetto, e l'host in questo caso indichiamo l'indirizzo IP del server remoto (in questo esempio è 192.168.2.163) e poi invio.

Al termine di questa procedura verrà generato un file deploy.php nella root del nostro progetto simile a questo

deploy.php

<?php
namespace Deployer;

require 'recipe/common.php';

// Config

set('repository','https://github.com/MicheleDeF/deployer-example.git');

add('shared_files',[]);
add('shared_dirs',[]);
add('writable_dirs',[]);

// Hosts

host('192.168.2.163')
     ->set('remote_user', 'deployer')
     ->set('deploy_path', '~/example');
	 
// Hooks

after('deploy:failed', 'deploy:unlock');

host è l'indirizzo IP del server remoto (in questo esempio è 192.168.2.163), remote_user è l'utente tramite il quale effettueremo una connessione ssh, deploy_path è il percorso nel quale verrà effettuato il deploy dell'applicazione, quindi modifichiamo questo file con i nostri dati

deploy.php

<?php


// Hosts

host('192.168.2.163')
     ->set('remote_user', 'micheledef')
     ->set('deploy_path', '/var/www/deployer-example');

micheledef è l'utente tramite il quale effettuo la connessione ssh, /var/www/deployer-example è il percorso del deploy, assicuriamoci che la cartella che abbiamo indicato sul server remoto /var/www/deployer-example abbia i permessi necessari per l'utente col quale effettuiamo il deploy, in caso contrario usiamo i seguenti comandi da CLI

cd /var/www/
sudo chown micheledef deployer-example
sudo chgrp -R micheledef deployer-example 

in modo da avere un risultato simile a questo

$ drwxr-xr-x 2 micheledef micheledef 4096 lug 3 12:29 deployer-example 

sostituiamo l'utente micheledef di esempio in questo articolo con quello che vogliamo.

Per connettersi all'host remoto è necessario specificare una chiave pubblica, se non ne abbiamo già una, generiamo una chiave pubblica con il seguente comando da CLI sul nostro sistema host locale

ssh-keygen

verranno generati due file id_rsa e id_rsa.pub in ~/ssh, modifichiamo il file ~/.ssh/config aggiungendo le seguenti righe

~/.ssh/config

Host *
  IdentityFile ~/.ssh/id_rsa

creiamo una nuova SSH key dal nostro account github che abbia come valore key il contenuto del file id_rsa.pub.

Un'ultima cosa da fare prima di effettuare il deploy è modificare il valore repository nel file deploy.php, cioè aggiungendo l'url ssh del repository

deploy.php

<?php


set('repository','git@github.com:MicheleDeF/deployer-example.git');

Adesso lanciamo il comando per effettuare il deploy

vendor/bin/dep deploy

ci verrà chiesta la password per effettuare una connessione ssh tramite l'utente che abbiamo indicato nel file deploy.php (in questo esempio è micheledef), se tutto va a buon fine avremo un risultato simile a questo

 

deploy

 

se andiamo nel percorso del deploy sul server remoto che abbiamo indicato, in questo caso è /var/www/deployer-example, vedremo che sono stati trasferiti i file, in particolare vedremo una struttura simile a questa

current->releases/1
.dep
releases
shared

nella cartella current ci sono i file e le cartelle della nostra applicazione, la prima volta che si effettua un deploy è indicata la release numero 1.

Vediamo adesso come passare da una release all'altra nel caso ne abbiamo più di una.

Facciamo una modifica alla nostra applicazione effettuando il commit e il push, successivamente lanciamo di nuovo il comando da CLI

$ vendor/bin/dep deploy

se tutto è andato a buon fine nella directory del deploy sul server remoto /var/www/deployer-example avremo il seguente risultato

current->releases/2
.dep
releases
shared

cioè è stata creata una nuova release la numero 2 la quale è sta applicata in automatico alla nostra applicazione, se volessimo ritornare alla release 1 possiamo farlo tramite i seguenti comandi

cd /var/www/deployer-example
ln -nfs releases/1 current

possiamo passare da una release all'altra anche con un altro sistema cioè usando il comando dep come fatto fino adesso, basta lanciare il seguente comando da CLI

$ vendor/bin/dep run '{{bin/symlink}} releases/1 {{current_path}}'

indicando il numero della release, in questo esempio è 1, ci verrà chiesta la password per la connessione ssh.

Infine per visualizzare la lista delle releases disponibili lanciare il seguente comando da CLI

$ vendor/bin/dep releases

anche in questo caso ci verrà chiesta la password usata per la connessione ssh, avremo un risultato simile a questo

dep releases