Automatiser le déploiement de Laravel

Bonjour,

Dans un article précédent, je vous parlais d’un script pour automatiser l’installation d’un serveur sous ISPConfig.

Un bon développeur est un développeur fainéant, et donc j’ai crée un petit script shell make file pour Laravel 5 que je vous partage ici. Il permet d’automatiser les déploiements d’application en Laravel 5 ainsi que leur mise à jour depuis un dépot Git ou Mercurial.

Il est disponible sur mon Github: https://github.com/jeremy379/LaravelProjectInstaller

Concrètement, le script va s’occuper de récupérer composer et git/mercurial pour fonctionner, va faire les update & upgrade du serveur et ensuite après récupération du dépot il va s’occuper de faire les opérations spécifique à Laravel ( composer update, php artisan migrate, correction des permissions …).
En mode installation, il s’occupe également d’ouvrir l’éditeur pour le .env

N’hésitez pas à apporter votre pierre à l’édifice (enfin, la cabane pour le moment ^^)

Lire la suite

ISPConfig, automatiser l’installation

Yop 🙂

Vous vous souvenez d’ISPConfig ? Hé bien je suis de retour avec 🙂
Voici donc un petit script pour automatiser l’installation d’ISPConfig 🙂
Tester sur un debian 8, et ça marche très bien 🙂

Il va vraiment tout vous installer: Apache, Php, … Plusieurs éléments vous seront demandés puis le script va tourner tout seul. Cela peut prendre un peu de temps.

apt-get update && apt-get upgrade
apt-get install unzip
cd /tmp
wget --no-check-certificate https://github.com/servisys/ispconfig_setup/archive/master.zip
unzip master.zip
cd ispconfig_setup-master/
./install.sh

Source: https://www.howtoforge.com/tutorial/ispconfig-install-script-debian/ (je vous invite à y jeter un oeil quand même si vous avez besoin de plus d’infos ou des soucis lors de l’install)

Ps: Si par hasard un jour git tombe, voici le script réuploadé ispconfig_setup-master
Ps2: On est d’accord, les enfants de la cover sont flippant ! :p Si jamais vous vous demandez, ma banque d’images c’est http://finda.photo/

Lire la suite

Backintime, le Timemachine pour vos serveurs !

Aujourd’hui je vais vous présenter un petit outils sympathique que j’ai eu l’occasion d’utiliser, il s’agit de backintime.

Cette outils va vous permettre d’effectuer des sauvegardes incrémentales de la même façon que Timemachine. Le backup est donc mis à jour pour les fichiers modifier seulement, cela permet d’économiser de l’espace serveur.
De plus, il est livré avec une interface visuel qui peut être lancé via ssh avec X11.

Vous pouvez trouver la doc pour Ubuntu ici. Toutefois, je préfères Debian et donc voici la marche à suivre pour l’installation:

Installation du paquet backintime-gnome
apt-get install backintime-gnome (paquet)
On va également ajouter xauth qui permet de résoudre certain bug de connection en ssh ensuite
apt-get install xauth

Certaine autre dépendance vont également être utile

apt-get install python3-dbus python3-dbus.mainloop.qt
apt-get install python-dbus

Vérifier également votre config ssh
nano /etc/ssh/sshd_config
Vous devriez avoir ceci de présent:

X11Forwarding yes
X11UseLocalhost no

Lancement de backintime
Ouvre votre console et lancer votre commande ssh de connection habituel en lui ajoutant le paramètre -Y (ou -X). Par exemple pour une connection ssh via clé privé:
ssh -Y  <host> -l <user> -i <path/to/key>

Lancer ensuite la commande backintime-gnome

Au premier chargement il vous proposant d’encoder les settings pour vos backups

Les deux choses importante: General et include afin de définir où stocker les backups et où trouver les fichiers sources.
Backintime

Pour l’installation récente que j’ai fais à ce niveau, j’ai deux serveurs. Le serveur de prod et le serveur de backup. L’outils est installé sur le serveur de backup bien évidemment et j’ai crée un point de montage vers le serveur de prod (une autre façon de faire aurait pu être d’utiliser la fonction de backup via ssh de backintime).
Je vous offres donc en bonus ma commande utilisant sshfs pour créer ce point de montage, à exécuter sur le serveur de backup.

apt-get install sshfs
mkdir /mnt/
sshfs user@ip-distant-server:/var/www /mnt/ -o IdentityFile=/root/.ssh/private.key -o idmap=user,allow_other,reconnect

Enjoy 🙂

Lire la suite

Installation d’ElasticSearch et Java sur debian 8 Jessie

Hola 🙂
En passant, je vous partage mes petites astuces afin d’installer Elasticsearch et Java sur un serveur Debian 8 Jessie.

Installation de Java

  • La première chose à faire est d’ajouter deux dépots

    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list
    echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
    apt-get update
  • Ensuite, on va installer Java (8 dans ce cas) qui est un prérequis. Si vous voulez une autre version de Java tel que java 6 ou java 7, il suffit d’adapter le chiffre dans le nom du paquet (oracle-java6-installer par exemple)
    apt-get install oracle-java8-installer
  • Avec java -version vous pouvez vérifier la correcte installation. 1.8.xx pour Java 8 par exemple
  • Pour en finir avec Java, nous allons mettre la version installée en version par défaut
    sudo apt-get install oracle-java8-set-default
    Même principe, si vous avez installé Java 6 pensé à adapter le nom du paquet

Installation d’Elasticsearch

  • Sélectionner votre version d’elasticsearch sur https://www.elastic.co/downloads/past-releases. Vous avez d’autre paquet disponible mais seul elasticsearch nous intéresse.
  • Récupérer l’adresse du paquet .deb
    .deb elastricsearch
  • cd /usr/local
    wget dpkg -i
  • Une fois elasticsearch installé, il ne reste plus qu’a le lancer :
    /etc/init.d/elasticsearch start

Ps: Je vous conseil également l’installation du plugin Marvel qui est bien utile surtout en phase de développement.

Source pour l’installation de Java: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html

Ps2: Vu qu’elasticsearch à une tendance très agréable à cracher de temps en temps, voici un petit script qui permet de faire une relance automatique.
nano /usr/local/bin/autorestartes.sh
chmod +x /usr/local/bin/autorestartes.sh

ps aux | grep elasticsearch | pidof java > /dev/null
verifier=$?
zero=0
if [ $zero = $verifier ]
then
echo "Service was successfully started"
else
echo "Service stopped"
/etc/init.d/elasticsearch restart
fi

Ensuite, j’ai ajouté une tâche Cron qui va exécuter ce script chaque minutes
crontab -e
* * * * * /usr/local/bin/autorestartes.sh 2>&1 > /dev/null

Lire la suite

Eviter le temps de propagation des DNS lors d’une migration

Bonsoir 🙂

Lors d’une migration de serveur, ou globalement lors du changement de l’ip lié à vos nom de domaines, il y a une période de propagation des DNS qui peut être assez longue selon les fournisseur d’accès.

D’ailleurs en passant, vous pouvez utiliser un meilleur prestataire de DNS en prenant ceux de Google ou encore OpenDns.

Bref, pour éviter cette période de propagation des Dns et donc rendre un changement d’ip immédiat, voici une petite astuce:

Tout se passe sur l’ancien serveur, il va forwarder tout les paquets qu’il reçois directement vers la nouvelle ip.

  • Autoriser l’IP Forwarding
    echo 1 >/proc/sys/net/ipv4/ip_forward
  • On ajoute une règle de PREROUTING au niveau d’IPTables afin de rediriger tous ce qui rentre sur le port 80 vers le nouveau
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 255.255.255.128
    N’oubliez pas d’adapter l’ip et/ou le port selon vos choix.

  • Sur même principe, on ajoute une règle de POSTROUTING permettant de faire apparaitre les redirections vers le nouveau serveur comme provenant du client et pas de l’ancien serveur.
    iptables -t nat -A POSTROUTING -p tcp -d 255.255.255.128 --dport 80 -j MASQUERADE

Et voila 🙂

Petite astuce supplémentaire, si vous désirez ensuite enlevé ce forwarding :

  • On va listé les règles de PREROUTING et POSTROUTING
    iptables -L -vt nat --line-numbers
  • Vous allez donc avoir un affichage avec les règles que vous aviez entrée précédemment ainsi qu’en début de ligne le numéro de cette ligne. C’est avec ce numéro que nous allons pouvoir supprimer la règle. Dans les commandes suivante, 1 représente donc le numéro de la ligne.
    iptables -t nat -D POSTROUTING 1
    iptables -t nat -D PREROUTING 1
  • On bloque ensuite l’IP Forwarding
    echo 0 >/proc/sys/net/ipv4/ip_forward

N’hésitez pas à me faire pars de vos retours 🙂

Lire la suite

Amazon Web service - Mon infrastructure

Construction d’une infrastructure serveur avec AWS

Bonjour, Bonsoir, vous allez bien ?

Il y a quelques semaines de cela, j’ai eu l’occasion de m’intéresser de plus près au service web d’amazone: Amazon Web Service (AWS).

J’avais besoin de pouvoir migrer une application web vers un système offrant une meilleur sécurité en terme de disponibilité, je me suis donc atteler à mettre une place l’infrastructure suivante :

  • Deux serveurs virtuel EC2 avec volumes de stockage synchronisé entre eux
  • Une instance RDS Mysql avec Déploiements multi-AZ pour une haute disponibilité
  • Un Load Balancer ELB permettant de passer d’un EC2 à l’autre en fonction de la charge et de la disponibilité

AWS-shema-Ec2-load-balancer

Au premier abord cela peut sembler assez compliqué (nouveau dans l’univers AWS, j’ai du chercher mon chemin), il faut monter toutes nos briques en commençant par un VPC (Virtual private cloud) qui est notre réseau privé dans lequel on va monter notre infrastructure et on la connectera ensuite à « l’internet mondial ».

Mise en place du Virtual Private Cloud ( VPC ) sur AWS

Pour commencer, rendez vous sur le dashboard VPC.
Par défaut, j’ai travaillé dans la zone « Frankfurt ». Vous pouvez en changer dans le menu en haut à droite, mais veillez alors à conserver la même partout.

On va donc lancer la création de notre vpc directement depuis cette page en cliquant sur « Create Vpc ».

Le name tag est un nom qui vous permettra de l’identifier ensuite.
le CIDR block est la plage d’ip disponible pour votre VPC, pour ma pars j’ai utilisé simplement ce qu’AWS conseil, c.à.d. 10.0.0.0/16.

De cette manière j’ai choisi de ne pas passer par le Wizard Aws. Nous allons faire les choses une à une de cette façon. Toutefois, rien ne vous empêche d’utiliser le Wizard et d’ensuite vérifier votre configuration en suivant la suite de cet article.

Garder cette page avec ce Vpc créer dans un onglet, vous pourriez trouver utile de revenir voir les noms assigné. Ouvrez ensuite un nouvel onglet avec « Subnets » (dans le menu à gauche). Nous allons ajouter deux sous réseaux, un pour chacun de nos EC2 dans des zones de disponibilités différentes (permettant que si l’une des zones crash, l’autre restera disponible).

Cliquez donc sur « Create Subnet »

Name tag : comme pour le vpc, c’est un nom pour le distinguer. Je lui ai mis le même nom que celui du VPC avec la lettre A en plus pour le premier et B pour le second.
VPC : sélectionnez votre Vpc fraichement créer
Availability Zone : Choisissez la zone 1a pour le premier subnet, et 1b pour le second subnet que vous créerai juste après.
CIDR block : Pour ma pars j’ai utilisé 10.0.2.0/24 pour le A et 10.0.3.0/24 pour le B.

Une fois les subnets créer, on passe le plus simplement du monde à l’élément suivant : « Route Tables« . Normalement une route existe déjà (Name vide), si ce n’est pas le cas cliquez sur « Create Route Table« . Entrez y un nom et sélectionné votre Vpc.

Cliquez ensuite sur la route créée et rendez vous dans l’onglet « Subnet Associations« . Il s’agit là d’éditer afin d’associer vos deux subnet à cette route.

On continue ensuite en se rendant dans « Internet Gateways« , cliquez sur « Create Internet Gateway » et donnez donc un nom à cette belle chose.
Cliquez ensuite sur votre gateways et cliquez sur le bouton « Attach to VPC » en haut. Sélectionné le Vpc que vous aviez crée tout à l’heure.
Notez l’id de votre Gateway (commençant par igw) et revenez sur « Route Tables », cliquez sur votre route et dans l’onglet en bas allez sur « Routes ». CLiquez sur Edit et ajouter

Destination: 0.0.0.0/0
Target: igw-…

Et sauvegarder.

Ensuite, quelques vérification :
Rendez vous à nouveaudans le menu de gauche, dans la partie « Security » et « Networdk ACLs« . Normalement une entrée existe déjà pour votre Vpc. Vérifier qu’en cliquant dessus et en allant dans Subnet Associations vous ayez les subnets créer. Si ce n’est pas le cas cliquez sur Edit pour le modifier.

Vous pouvez également lire la doc officiel et éventuellement utiliser le Wizard.

Ajout des instances EC2

Nous allons maintenant créer nos instance EC2, rendez vous sur le dashboard EC2.

EC2-instance

Cliquez sur « Launch Instance« . La première étape consiste à choisir votre type de distribution. Etant un fan de Debian, il faut aller la chercher dans « AWS Marketplace » et utiliser le moteur de recherche. Après une recherche sur Debian j’ai donc choisis/Select « Debian GNU/Linux 8 (Jessie) ».

L’étape suivante consiste à choisir la puissance du serveur voulu. Choisissez judicieusement (le changement est pas évident) et cliquez ensuite sur « Next: Configure Instance Details« .

Il faut maintenant configurer les petite joyeuseté qu’on a pris soin de préparé avant: notre Vpc dans Network et le subnet sur lequel l’instance dois tourner (Subnet A pour la première instance, et le B pour la seconde que vous allez créer ensuite).
Pour le champ « Auto-assign Public Ip« , choisissez « Enable » (contrairement au screen ci-dessous)

ec2-configure

Next: Add storage

Nous allons ici ajouter un espace de stockage pour notre EC2. Il sera possible ensuite de le réadapter si nécessaire (ça nécessite de couper l’EC2 et faire un snapshot de l’instance, compter ~30 minutes)

Next: Tag Instance
On s’en fout un peut 🙂

Next: Configure Security Group

C’est ici que l’on va autoriser l’accès à l’EC2 de l’extérieur (port autorisé, …)

Pour ma pars j’ai ceci (ouais y a pas mal de choses d’ouverte, notamment All TCP, à cause de ce joyeux filezilla qui ne vous permettra pas de vous connecter en Ftp sinon)

sg

Ensuite vous avez une étape de Review et finalement vous pouvez faire un « Launch » de l’instance.

Pour lancer la seconde instance, vous pouvez vous rendre dans « Instances » > « Instances » dans le menu de gauche, sélectionner votre instance puis en haut dans Actions choisir « Launch More Like This »

Capture d’écran 2015-11-24 à 22.54.29

Veillez en particulier à adapter « Instance Details » en cliquant sur « Edit Instance Details » pour modifier le Subnet.

L’étape final consiste à rendre ce serveur accessible depuis l’extérieur et pour cela rendez vous via le menu de gauche dans « Network & Security » > « Elastic IPS » et cliquez sur « Allocate New Address« .
Cliquez ensuite sur cette ip et dans le menu Actions choisissez « Associate Address »

Capture d’écran 2015-11-24 à 22.58.31

Sélectionnez votre instance EC2 créer et sauver. Répétez l’opération pour la seconde instance EC2.

Cela vous permettra d’accéder au serveur depuis le web, pour des accès ssh, ftp, …

Ajout de l’instance RDS Mysql pour la base de données

Cette partie est assez simple en comparaison de l’étape précédente. Rendez vous sur la page des instances de RDS ici et cliquez sur le bouton « Launch Db Instance« .
Choisissez ensuite votre modèle de base de données, pour ma pars il me fallait une base de type Mysql.
Cochez ensuite « Yes, use Multi-AZ Deployment and Provisioned IOPS Storage as defaults while creating this instance » (Multi-AZ Deployment permet de rendre la base de données disponible dans plusieurs zone de disponibilités)

En continuant, nous arrivons donc sur un écran de configuration plus précis
aws-rds-mysql

DB Instance Class : le type de capacités du serveur
Storage Type : J’ai choisis magnetic, ma base de données étant petit et n’atteignant pas 5Go de taille. Pour de plus grosse base de données vous pouvez utiliser les propositions SSD.

Sur l’étape suivante, vous allez pouvoir configurer notamment les informations réseaux.

aws-rds-mysql-network

VPC : Sélectionner votre Vpc crée plus haut.
Publicly Accessible : Attention, vous ne pourrez plus changer ce paramètre ensuite. Il autorisera la base de donnée à être accessible en dehors de votre VPC. Dans tout les cas, vos instances EC2 qui sont dans le même VPC y auront accès, mais si vous choisissez NO une connection extérieur sera refusée.
Pour « publicly accessible » j’ai sélectionné YES dans mon cas car j’effectue une maintenance et un monitoring régulier qui nécessite une facilité d’accès à la base de données. Si vous n’en avez pas besoin, privilégié évidemment en DB isolé, c’est plus sécure 🙂
Le groupe de sécurité : Je réutilise déjà un existant, mais n’hésite pas à en créer un nouveau.

Le suite de la configuration est assez logique, type de db, nom, backups, …

Ajout du Load Balancer

Avec tout ce que nous avons déjà crée, cette opération devrait se dérouler assez facilement.

Rendez vous, via l’onglet de gauche dans la section Load Balancers et choisissez « Create Load Balancer »

Donnez lui un nom et choisissez le VPC pour lequel le Load balancer va agir. Il s’agira dès lors d’ajouter les subnets et instances pour lesquels le load balancer va répartir la charge. Le reste des opérations sont des choses par lesquelles vous êtes déjà passé, vous ne devriez pas avoir de mal.

Une fois le load balancer crée, voici quelques petite choses que vous pouvez créer/adapter en cliquant sur le load balancer via les onglets en bas.

Dans Health Check

  • Diminuer Interval et Timeout afin de réagir plus vite en cas de crash d’un serveur.
  • Ping Target : pour ma pars j’ai créer un fichier check.php sur mon serveur (dans /var/www, la zone accessible sans vhost) afin d’effectuer le check si le serveur est Up. Cela me permet également de vérifier que php tourne et également, si je veux désactiver le serveur sans le couper il me suffit de renommer le fichier pour que le load balancer passe sur l’autre serveur.
  • Dans Monitoring : Cliquez sur Create Alarm afin de recevoir un mail quand une instance plante et/ou quand le nombre d’Http 5xx est trop élevé (Sum HTTP 5xxs).

Vous allez ensuite devoir mettre en place un lien entre votre nom de domaine actuel et le nom de domaine de votre load balancer (NAMELB-0101010101.eu-central-1.elb.amazonaws.com). Amazon vous conseille de mettre en place un champ CName, en effet l’ip du load balancer changer et vous ne pourrez mettre un champs A avec l’ip.

Toutefois, cela nécessite une mise à jour rapide des Dns et des prestataires tel qu’Ovh ne le font pas assez rapidement. Je vois à cette problématique deux solutions : soit utiliser ISPConfig par exemple pour géré nos dns (via un serveur supplémentaire surement) ou alors, et c’est la solution que j’ai choisis, mettre en place le routing via le service Route 53 d’Amazon Web Service

Synchronisation des deux serveurs

Il va donc falloir synchroniser les deux serveurs, pour cela je vous renvoi à deux articles précédent, à savoir
Synchroniser deux serveur avec rsync (une fois par minute)
Et sa version améliorer permettant la synchro en temps réel avec Rsync et Inotify (un peu gourmande en cpu, mais avec un bon serveur ça tiens la route).

J’espère que ceci pourra vous aider.
A savoir que j’ai écris cette doc après la mise en place de mon infrastructure, j’espère ne rien avoir oublier mais si jamais vous pouvez toujours me poser vos questions dans la zone commentaire ci-dessous.

Lire la suite

Synchroniser deux serveurs en temps réel avec inotify et rsync

Bonsoir 🙂

Il y a quelques jours j’avais présenté une solution de synchronisations entre deux serveurs via Rsync. Entre temps j’ai eu l’occasion d’améliorer la solution et je la partage donc ici.
La nouvelle version utilise inotify tools qui est une sorte d’observer des changements sur un repertoire de votre machine. Nous allons donc, à chaque détection, exécuter notre script de Rsync afin de lancer une synchronisation instantanée.

L’ancien article: RSYNC : synchroniser deux serveurs

Synchronisation Rsync avec système de lock

Voici donc un nouveau fichier rsync.sh qui comprend un système de lock afin d’éviter l’exécution de plusieurs instance à la fois:


#!/bin/sh

#Rsync with B server

LOG_FILE=/root/scriptsh/rsync.log
SOURCE_DIR=/var/www/mywebsite/web
DISTANT_DIR=/var/www/mywebsite
DISTANT_USER=admin
DISTANT_HOST=IP
KEY=/root/scriptsh/key.pem
LOCK_FILE=/root/scriptsh/rsync.lock

if [ -f "$LOCK_FILE" ]
then
echo "Rsync Locked !" >> $LOG_FILE
else
touch $LOCK_FILE
rsync -vrlpEogth --progress --log-file=$LOG_FILE -e "ssh -i $KEY" --rsync-path="sudo -i rsync" $SOURCE_DIR $DISTANT_USER@$DISTANT_HOST:$DISTANT_DIR
chown -R web1:client1 /var/www/mywebsite/web/*
rm $LOCK_FILE
fi

L’élément supplémentaire est donc ce if [ -f "$LOCK_FILE" ] qui vérifie la présence d’un fichier. Je crée ce fichier avec la commande touch et je le supprime ensuite. Si une instance tourne, le fichier existe et la requête est donc bloquée.

Installation de inotify tools

Simple comme bonjour 🙂
apt-get install inotify-tools

Utilisation de inotify pour déclencher rsync.sh

Nous allons créer un nouveau fichier sh à côté de rsync.sh, et celui ci va exploité inotify


#!/bin/sh

LOG=/root/scriptsh/inotify.log
DIR=/var/www/mywebsite/web
COMMAND=/root/scriptsh/rsync.sh

#Kill instance already in use (usefull if we relaunch the script by cron)
pgrep "inotify" | while read file; do kill $file; done;

while true
do
( inotifywait -r -e create $DIR >> $LOG ) && sh $COMMAND
done

Nous y avons placé un while true afin qu’inotify tourne tout le temps.
-e create dans la requêtes permet de ne filtrer que les créations (si vous aviez des modification vous auriez pu utiliser modify ou delete pour des suppressions, … ).
inotifywait --help vous permet d’obtenir toutes les informations supplémentaire.

nous avons aussi placer un système pour automatiquement killer le script si on le rappel.

! Ne lancer pas encore votre fichier

Bug courant: si votre répertoire contiens de nombreux fichier, inotify ne voudra peut être pas s’exécuter. Une erreur sera alors lancé et il faudra modifier la config
nano /proc/sys/fs/inotify/max_user_watches
Simplement augmenter la valeur donc 🙂

Mise en place d’un launcher pour inotify.sh

Si vous lancer maintenant le fichier votre console est bloqué et il est bien difficile de l’arrêter (un reboot du serveur s’impose). En effet, vous pouvez killer les process inotify mais pas le script sh avec le while true.
Pour régler ce problème, nous allons créer un autre fichier sh qui sera notre launcher et qui va s’occuper de conserver le pid du process lancer afin de pouvoir le killer si nécessaire.

Créons donc un fichier inotify_launcher.sh


#!/bin/sh

PID=/tmp/inotify_launcher.pid

kill -9 `cat $PID`
rm $PID

sh /root/scriptsh/inotify.sh 2>&1 > /dev/null &
echo $! > $PID

la première exécution va levé des erreurs car le fichier /tmp/inotify_launcher.pid n’existe pas encore, vous pouvez les ignorer.

La ligne importante ici est echo $! > $PID qui va récupéré le PID du dernier script lancé et le stocker dans le fichier.
Le début du fichier permet en cas de rappel de killé le script sh qui aura alors été lancé.

le & à la fin de la ligne exécutant le fichier sh permet de faire tourner le script en background sans bloquer la console.

Par acquis de conscience, on peut désormais ajouter un Cron supplémentaire pour relancer le launcher. Cela permet de s’assurer de deux choses: Que si le script crash il est relancé et que si le serveur reboot il sera également relancé.

crontab -e
et on y ajoute (avec placement d’un message dans les logs cron d’ISPConfig, ce qu’il y a après le | est optionnel) :
30 * * * * sh /root/scriptsh/inotify_launcher.sh 2>&1 > /dev/null | while read line; do echo `/bin/date` "Inotify relaunch" >> /var/log/ispconfig/cron.log; done

J’espère que ceci pourra vous être utile 🙂

Lire la suite

Let’s Encrypt – Votre certificat SSL gratuit

Yop 🙂
Petit changement pour le site, il est désormais en https et ceci grâce à Let’s Encrypt.
Un fabuleux projet qui va permettre à tout le monde d’obtenir son certificat SSL et, je le pense, améliorer globalement la sécurité sur le web.

Je me suis donc inscrit il y a quelques semaines à la Beta de Let’s Encrypt et j’ai reçu mes accès cette semaine. La mise en place est très aisée.

1. Génération du certificat via l’outil de Let’s Encrypt

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --agree-dev-preview --server \
https://acme-v01.api.letsencrypt.org/directory certonly

2. Configurer le certificat sur le site, pour ma pars j’utilise ISPConfig. Il faut toutefois ruser un peu pour pouvoir le mettre en place.

Rendez vous dans Sites > Website, et sélectionnez votre site. la première chose à faire est de cocher la case « Ssl » dans l’onglet principal « Domain »
ispconfig-ssl

Etape suivante, allez dans l’onglet Ssl et complétez y les infos en haut.

ispconfig ssl

Sélectionner bien « Create certificate » dans SSL action. ISPConfig va alors créer un certificat ssl non signé mais cela va permettre d’activer correctement l’utilisation du protocole Https

Il faudra ensuite éditer les informations de l’onglet SSL en mettant dans

SSL key le contenu du fichier /etc/letsencrypt/live/[votre_site]/privkey.pem
SSL certificate le contenu du fichier /etc/letsencrypt/live/[votre_site]/fullchain.pem
Ne changé rien à SSL request.

Dans SSL Action il faut choisir save et ensuite sauvegarder. Et voila, votre serveur va être dispo en https avec un certificat signé.

3. Rediriger les requêtes http vers https

Petit bonus supplémentaire, voici le bout de code à ajouté dans Apache directive (onglets Options) ou dans le htaccess qui va permettre de rediriger les http vers https


RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

J’espère que ceci vous aura été utile 🙂

Edit 05/02: Renouvellement du certificat Ssl Let’s Encrypt

Rien de plus simple finalement, j’ai relancé la commande ./letsencrypt-auto certonly, j’ai entré à nouveau mes domaines et voila 🙂
Ensuite, pour ISPConfig, il faut encore mettre à jour dans l’onglet SSL les certificats comme effectué lors de l’installation.

Lire la suite

RSYNC : synchroniser deux serveurs

Bonsoir 🙂

Je suis en train de vous écrire un article sur une configuration avec deux serveurs et un load balancer.
A cette occasion, j’ai eu besoin de synchroniser les deux serveurs en question, du serveur A vers le B et réciproquement.

J’ai choisi une synchronisation semi temps-réel, elle s’exécute une fois par minutes via une tâche Cron.

Voici les étapes, a effectué de préférences en root. A faire sur le serveur A, puis à adapter pour votre second serveur.
Ceci peut également serveur pour faire du backup en temps réel ou presque.
A noter également que pour quelques choses de plus pointu d’autres outils seront plus optimisé, n’hésitez pas à proposer des solutions en commentaire 🙂

Le fichier bash à créer pour le Rsync

nano /root/scriptsh/rsync.sh

#!/bin/sh

#Rsync with B server

LOG_FILE=/root/scriptsh/rsync.log
SOURCE_DIR=/var/www/mywebsite/web
DISTANT_DIR=/var/www/mywebsite
DISTANT_USER=admin
DISTANT_HOST=IP
KEY=/root/scriptsh/key.pem

rsync -vrlpEogth --progress --log-file=$LOG_FILE -e "ssh -i $KEY" --rsync-path="sudo -i rsync" $SOURCE_DIR $DISTANT_USER@$DISTANT_HOST:$DISTANT_DIR
chown -R web1:client1 /var/www/mywebsite/web/*

Explication :

Je défini une série de variables:
LOG_FILE: le fichier qui va logger nos opérations
SOURCE_DIR et DISTANT_DIR: le répertoire source sur le serveur actuel et le répertoire distant (à savoir que /web n’est pas nécessaire pour le répertoire distant car ce qui sera envoyé est le répertoire local web et son contenu. Le contenu local sera donc bien dans web sur le serveur distant)
DISTANT_USER: l’utilisateur sur le serveur distant pour la connexion ssh
DISTANT_HOST: l’adresse ip (ou nom de domaine) du serveur distant
KEY: la clé de connexion ssh. Pour utiliser un mot de passe, vous pouvez adapter le code comme ceci :

rsync -vrlpEogth --progress --log-file=$LOG_FILE -e ssh --rsync-path="sudo -i rsync" $SOURCE_DIR $DISTANT_USER:$PASSWORD@$DISTANT_HOST:$DISTANT_DIR
et créer une variable PASSWORD= qui contiendra le mot de passe.
De même, si le serveur ssh se trouve sur un autre port que le port 22, adapter la partie -e "ssh -i $KEY" par -e "ssh -i $KEY -p 1234

Après les variables, la requête 🙂
Pour -vrlpEogth, je vous invite à faire un rsync --help. Globalement cela active le mode verbose, conserve les droits des fichiers, crée les liens symboliques (et ne récupère donc pas le fichier pour le transmettre).
-e ssh : Cela nous donne le driver de connexion auquel on peut ajouter des paramètres.
--rsync-path="sudo -i rsync" il s’agit de la requête rsync qui sera effectué sur le serveur distant lors de l’exécution. Par défaut, c’est juste rsync (et on peut donc ne pas mettre le paramètre), toutefois j’ai choisi de l’utiliser afin d’ajouter sudo -i qui me permet de passer en root, sans quoi je n’aurais pas les droits d’écriture nécessaire. En fonction des cas il vous faudra peut être l’adapter.

La suite c’est le coeur de la requêtes en tant que tel (dossier source, connection au serveur et dossier distant)

Je termine mon code par chown -R web1:client1 /var/www/mywebsite/web/* qui m’assure de rétablir les permissions correctement. Evidemment il vous faudra changer web1 et client1 par votre user et groupe.

Vous pouvez également ajouter l’attribut --exclude 'log' pour exclure certain dossier.
Ici j’exclus un fichier de log. Rsync ne gérant pas bien la modification de fichiers, cela ne ferait que créer des conflits. A noter que mon système ne fonctionne bien que parce que le serveur ne modifie pas de fichiers (sauf cas de log). Il n’y a que des créations de fichiers.

Ajout de la tâche CRON

crontab -e
et ajouter la ligne
* * * * * sh /root/scriptsh/rsync.sh 2>&1 > /dev/null

Ou, si vous êtes comme moi avec ISPConfig :
* * * * * sh /root/scriptsh/rsync.sh 2>&1 > /dev/null | while read line; do echo `/bin/date` "RSYNC $line" >> /var/log/ispconfig/cron.log; done
Ce qui affichera un message accessible dans l’admin d’ISPConfig.

Rien de bien particulier concernant les Cron, une simple recherche vous apprendra ce qu’il faut savoir si nécessaire

Bon amusement 🙂

Ps: Il y a évidemment des améliorations possible, l’une d’entre elle pourrait être de « locker » l’exécution pour éviter que deux instance de cron ne s’exécute en même temps et ne plante.

Update 7/11/15 ==> j’ai améliorer cette solution, lisez ici Synchroniser deux serveurs en temps réel avec inotify et rsync

Lire la suite

Ajouter d’autre version de Php avec ISPConfig (Debian 8, Php 5.3)

Je continue donc dans cette suite de documentations sur l’installation et la configuration d’ISPConfig.

Faute de tutoriel pour Debian Jessie, je suis partis sur base de celui ci https://www.howtoforge.com/how-to-use-multiple-php-versions-php-fpm-and-fastcgi-with-ispconfig-3-ubuntu-12.04-lts-p2

Pour installer Php 7, vous pouvez vous référer à ce tutoriel : Installation de Php 7.

Nous, nous allons nous occuper de version plus ancienne de php, la 5.3 dans notre cas.

1. On va télécharger et compile la version voulue de Php (on va ici le faire pour php 5.3)
Je récupère la version depuis le site de php.net (cliquez sur la release, ensuite clique droite sur votre miroir et copier le lien)

Le php 5.3 que nous voulons se trouve à l’adresse http://fr2.php.net/get/php-5.3.29.tar.bz2/from/this/mirror


mkdir /opt/php-5.3.29
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget http://fr2.php.net/get/php-5.3.29.tar.bz2/from/this/mirror -O php-5.3.29.tar.bz2
tar jxf php-5.3.29.tar.bz2
cd php-5.3.29/

Une série de librairies et de paquets sont nécessaire pour la compilation. Comme montré dans le tuto joint en debut de poste, on lance :

apt-get install build-essential

apt-get build-dep php5

apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-turbo-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev

ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

Ensuite, afin d’éviter un bug avec freetype.h on dois effectuer deux commande (Debian 8 est un peu trop récent pour Php 5.3 (ou c’est 5.3 qui est un peu trop vieux 🙂 )


mkdir /usr/include/freetype2/freetype
ln -s /usr/include/freetype2/freetype.h /usr/include/freetype2/freetype/freetype.h

Nous allons donc commencer par configurer php avec fastcgi (Php fpm plus bas, mais ne fonctionne pas correctement sur ISPConfig).
A noté que pour refaire une autre compilation, pensé à refaire un cd /usr/local/src/php5-build/php-5.3.29/

Php FastCgi


./configure \
--prefix=/opt/php-5.3.29-cgi \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--enable-exif \
--enable-bcmath \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl=/usr \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-libdir=/lib/x86_64-linux-gnu \
--enable-ftp \
--with-imap=/usr \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-xmlrpc \
--with-xsl \
--enable-cgi

Puis make && make install

Copie de php.ini

cp /usr/local/src/php5-build/php-5.3.29/php.ini-production /opt/php-5.3.29-cgi/lib/php.ini

Configuration d’ISPConfig avec php 5.3.29 cgi

On se rend dans System -> System -> Additional PHP Versions

ISPCONFIG - additional php versions

Puis dans l’onglet FastCGI Settings :
Path to the PHP FastCGI binary : /opt/php-5.3.29-cgi/bin/php-cgi
Path to the php.ini directory : /opt/php-5.3.29-cgi/lib

Ensuite pour placer un site en php-5.3.29, on va dans Sites -> clique sur le site voulu et on adapte :

ISPConfig - fastcig php 5.3

Php-FPM

Pour installer php-fpm vous pouvez suivre la procédure suivante, toutefois, avec l’installation d’ISPConfig suivi dans le tutoriel pour Debian 8 ceci ne devrait pas fonctionner. A tester donc seulement si vous ne pouvez pas faire fonctionner FastCgi ou que votre configuration diffère de la config de base pour Debian Jessie.

Lançons maintenant le ./configure pour la version php-fpm (cgi plus bas)

./configure \
--prefix=/opt/php-5.3.29-fpm \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--enable-exif \
--enable-bcmath \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl=/usr \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-libdir=/lib/x86_64-linux-gnu \
--enable-ftp \
--with-imap=/usr \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-xmlrpc \
--with-xsl \
--enable-fpm

Noté les différences avec le script du tuto initial : le **=/usr** après *with-openssl* et *with-imap*.

On lance ensuite :

make
make install

Ensuite nous allons copier le php.ini et php-fpm.ini dans les bon répertoire :

cp /usr/local/src/php5-build/php-5.3.29/php.ini-production /opt/php-5.3.29-fpm/lib/php.ini
cp /opt/php-5.3.29-fpm/etc/php-fpm.conf.default /opt/php-5.3.29-fpm/etc/php-fpm.conf

Nous allons ensuite éditer php-fpm.conf
nano /opt/php-5.3.29-fpm/etc/php-fpm.conf

Adapter le fichier en motidier / ajout les valeurs comme ceci
(pid est à décommenté, user et group sont normalement ok, listen : il vaut mieux changer le port car 9000 peut être utilisé. Include est à ajouté en fin de fichier)

[...]
pid = run/php-fpm.pid
[...]
user = www-data
group = www-data
[...]
listen = 127.0.0.1:8999
[...]
include=/opt/php-5.3.29-fpm/etc/pool.d/*.conf

Création du répertoire pour la pool
mkdir /opt/php-5.3.29-fpm/etc/pool.d

Ensuite il faut créer un script dans /etc/init.d afin de lancer notre version de php

nano /etc/init.d/php-5.3.29-fpm

Et on y ajoute le code


#! /bin/sh
### BEGIN INIT INFO
# Provides: php-5.3.29-fpm
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-5.3.29-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
php_fpm_BIN=/opt/php-5.3.29-fpm/sbin/php-fpm
php_fpm_CONF=/opt/php-5.3.29-fpm/etc/php-fpm.conf
php_fpm_PID=/opt/php-5.3.29-fpm/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {
try=0
while test $try -lt 35 ; do
case "$1" in
'created')
if [ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if [ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo -n .
try=`expr $try + 1`
sleep 1
done
}
case "$1" in
start)
echo -n "Starting php-fpm "
$php_fpm_BIN $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Gracefully shutting down php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -QUIT `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed. Use force-exit"
exit 1
else
echo " done"
echo " done"
fi
;;
force-quit)
echo -n "Terminating php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -TERM `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reload service php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -USR2 `cat $php_fpm_PID`
echo " done"
;;
*)
echo "Usage: $0 {start|stop|force-quit|restart|reload}"
exit 1
;;
esac

Changement de permissions pour rendre le script éxécutable et lien pour l’execution au démarrage, et ensuite le démarrage à proprement parlé :


chmod 755 /etc/init.d/php-5.3.29-fpm
insserv php-5.3.29-fpm
/etc/init.d/php-5.3.29-fpm start

Au démarrage vous aurez une erreur comme ceci

Starting php-fpm [22-Sep-2015 22:13:34] WARNING: Nothing matches the include pattern '/opt/php-5.3.29-fpm/etc/pool.d/*.conf' from /opt/php-5.3.29-fpm/etc/php-fpm.conf at line 511.
done

Rien de grave, c’est car il n’y a pas encore de pool dans /opt/php-5.3.29-fpm/etc/pool.d. Vous pouvez ignorer l’erreur, elle se resoudra plus tard.

Nous allons ensuite adapter ISPConfig pour lui donner les chemins vers notre nouvelle configuration.

On se rend dans System -> System -> Additional PHP Versions (on peut faire dans le même que pour php-fcgi)

ISPCONFIG - additional php versions

On va ensuite dans l’onglet PHP-FPM Settings et on entre les informations suivante :

Path to the PHP-FPM init script /etc/init.d/php-5.3.29-fpm
Path to the php.ini directory /opt/php-5.3.29-fpm/lib
Path to the PHP-FPM pool directory /opt/php-5.3.29-fpm/etc/pool.d

Ensuite dans site, vous sélectionnez php-fpm et la version choisie.
Merci pour votre lecture 🙂
Jérémy

N’hésitez pas à commenter ou me contacter si vous avez une question 🙂

Lire la suite