par Anne-Laure DELPECH | 19 Déc 2016 | Google Apps, site web
Nous allons voir comment lire le statut HTTP d’un site internet avec Google Sheets et envoyer un email automatique en cas d’anomalie.
J’ai rencontré des soucis (non résolus 10 jours après mon premier signalement…) avec mon hébergement Plesk. Il arrive que la base de données de l’hébergement soit en panne et on n’a aucun moyen de le savoir sans essayer d’accéder à l’un des sites de l’hébergement. Les systèmes habituels de vérification par « ping » ne donne pas satisfaction car les sites répondent à un ping mais sont inaccessible depuis un navigateur (le code HTTP n’est pas 200). Comme mon fournisseur d’hébergement se montre incapable d’accepter qu’il y a un problème ou au moins de générer une alerte automatique en cas de panne de la base de données, j’ai décidé de créer un système d’alerte automatique.
Obtenir le code HTTP de réponse d’un site avec Google Sheets
Je me suis inspirée de cet article : How to Pull an HTTP Response Code in Google Sheet.
J’ai créé un fichier Google Sheets dans lequel j’ai placé le tableau suivant :
site |
url |
statut |
parcours-P |
parcours-performance.com |
=VALUE(HTTPResponse(B3)) |
knowledge PP |
knowledge.parcours-performance.com |
=VALUE(HTTPResponse(B4)) |
Ce qui donne ce qui suit dans Google Sheets :

Google Sheets : surveiller le code httpde sites
Avec l’éditeur de scripts (menu « Outils »), j’ai créé la fonction HTTPResponse .
/*****************************************************************
* check websites for http response
*****************************************************************/
function HTTPResponse( uri )
{
/* source https://atulhost.com/how-to-pull-an-http-response-code-in-google-sheet */
var response_code ;
try {
response_code = UrlFetchApp .fetch( uri ) .getResponseCode() .toString() ;
}
catch( error ) {
response_code = error .toString() .match( / returned code (\d\d\d)\./ )[1] ;
}
finally {
return response_code ;
}
}
J’ai ensuite cliqué sur « enregistrer ».
Lorsque je retourne dans ma feuille de calcul, si les sites fonctionnent, je vois « 200 » dans la troisième colonne de mon tableau, celle qui contient =VALUE(HTTPResponse(Bx)) .
Régler la fréquence de vérification
Je veux vérifier au moins toutes les heures que les sites sont opérationnels.
Dans l’éditeur de scripts, je sélectionne (A) la fonction HTTPResponse puis je clique sur le bouton « déclencheur du projet actuel » (B). Ensuite, je régle le déclenhement pour que le script s’exécute à chaque heure :

Régler le déclencheur d’un script Google Sheets

Déclencher un script Google Sheets toutes les heures
Générer un mail automatique en cas d’anomalie avec Google Sheets
Pour cette partie, je me suis beaucoup inspirée de « Automating Google Spreadsheets – Email Reminders« .
Dans l’éditeur de script, j’ai placé la fonction checkStatut() :
/*****************************************************************
* Send an alert if somme http responses are not 200 OK
*****************************************************************/
function checkStatut() {
/* source https://www.withoutthesarcasm.com/automating-google-spreadsheets-email-reminders/ */
// get the spreadsheet object
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// set the first sheet as active
SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
// fetch this sheet
var sheet = spreadsheet.getActiveSheet();
// figure out what the last row is
var lastRow = sheet.getLastRow();
// the rows are indexed starting at 1, and the second row
// is the headers, so start with row 3
var startRow = 3;
// grab column 3 (the 'statut' column)
// getRange(row, column, numRows, numColumns)
var range = sheet.getRange(startRow, 3,lastRow-startRow+1,1 );
var numRows = range.getNumRows();
var statut_values = range.getValues();
// Now, grab the site name column (2)
range = sheet.getRange(startRow, 2, lastRow-startRow+1, 1);
var site_name_values = range.getValues();
var warning_count = 0;
var msg = "";
// Loop over statut values
for (var i = 0; i <= numRows - 1; i++) {
var statut = statut_values[i][0];
if(statut != 200) {
var site_name = site_name_values[i][0];
msg = msg + "Site : "+site_name+" ne fonctionne pas HTTP code "+statut+" .\n";
warning_count++;
}
}
if(warning_count) {
MailApp.sendEmail("mail@parcours-performance.com",
"Des sites en panne", msg);
}
};
Cette fonction identifie le bon onglet (0) de la feuille de calcul puis lit toutes les données de statut. Lorsqu’un statut n’est pas égal à 200 (OK), la fonction lit le nom du site correspondant. La fonction crée un message (msg) avec tous les dysfonctionnements puis, s’il y a des alertes, m’envoie un mail pour m’en informer.
Le déclencheur de la fonction est un changement dans la feuille de calcul (lorsque HTTPResponse se déclenche et indique une réponse différente de ce qui précédait) :

Déclencher un script Google Sheets lorsque la feuille change
J’ai vérifié que ça fonctionne en placant « 404 » dans l’une des cellules de statut et je reçois bien un mail d’alerte.
Et maintenant
Je suis en train de regarder comment changer d’hébergeur mais je dispose maintenant d’un système d’alerte des anomalies. Si je reçois un mail, je me connecte à mon interface client et je redémarre le VPS. En quelques minutes tous mes sites fonctionnent de nouveau.
par Anne-Laure DELPECH | 26 Nov 2016 | Hébergement web
Dans ce dernier article de la série WordPress Multisite sur OVH mutualisé, nous allons voir comment ressortir un site d’un multisite WordPress.
Le fonctionnement multisite de WordPress est très pratique et simple mais je suis contrainte de scinder un multisite (heureusement encore peu fourni) car je transfère le site sur un VPS avec Plesk et il est pour l’instant impossible d’avoir plusieurs domaines distincts avec des certificats Let’s Encrypt distincts sur un seul hébergement Plesk…
Les spécificités du multisite
Si on veut sortir un site d’un multisite, il faut le « détricoter » :
- Pour les fichiers, il faut remettre toutes les extensions du site principal dans le site devenu orphelin et il faut également lui transférer ses fichiers médias. C’est simple à faire.
- Dans la base de données, c’est plus compliqué. Il y a des tables spécifiques au site à séparer mais certaines sont partagées entre tous les sites du multisite. C’est là que le détricotage est un peu fastidieux.
Trouver l’identifiant du site à sortir
Dans le tableau de bord du multisite, aller sur mes sites > Admin du Réseau > Sites.
Passer la souris sur le nom du site à déplacer (disons « subdomain.com »). Son url complète s’affiche en bas de la fenêtre, sous la forme https://domaine.comwp-admin/network/site-info.php?id=3. Ici l’identifiant est donc « 3 ». On en aura besoin pour la suite.

Sauvegarder le multisite
Sauvegarder les fichiers
Avec Filezilla : sauvegarder le répertoire /www/wp-content/uploads/sites/3 (3 est l’identifiant du site que l’on veut sortir).
Sauvegarder la base de données
Nota du 23/11/216 : pour des raisons que j’ignore, l’export via PHPMyAdmin provoque parfois une erreur : les index et auto-incrémentations ne sont pas transférés. Dans ce cas, il faut aller dans l’interface client de l’hébergement OVH original et demander une sauvegarde de la base de données (un dump) que l’on reçoit quelques minutes plus tard par mail. Cette sauvegarde s’importe ensuite sans souci dans la base Plesk.
Noter les informations du site
On a intérêt à bien noter (copies d’écran) les informations suivantes :
- quel est le nom du thème (stargazer pour moi) et ses réglages ?
- quelles sont les extensions utilisées et faisant l’objet d’un réglage spécifique ? Pour mon cas, Cookie Notice, Floating Social Bar
- Quels sont les utilisateurs de ce site ?
Installer WordPress sur un nouvel hébergement
J’utilise maintenant un VPS avec Plesk for Resellers. J’installe donc WordPress conformément à Transférer un hébergement mutualisé OVH sur un VPS Plesk d’OVH.
Transférer les fichiers
Dans l’installation de WordPress, copier /www/wp-content/uploads/sites/3 de l’ancien site vers /www/wp-content/uploads/ dans le nouveau. Je copie aussi les fichiers de tous les plugins et thèmes que je veux utiliser. C’est plus rapide qu’une installation par le tableau de bord.
Transférer les bons éléments de la base de données
Sauvegarder la base de donnée du site cible
Disons que son prefixe est ‘cible_ ‘.
Importer la base de données du multisite d’origine
En principe elle n’a pas les mêmes préfixes (‘source_’ ) et ne va pas supprimer les tables du site cible.
Supprimer les tables ‘source_’
Les seules qu’on conserve sont :
- source_3_options ;
- source_options ;
- source_usermeta ;
- source_users.
Supprimer les tables du site cible
On ne touche pas à cible_options, cible_usermeta et cible_users) et on supprime :
- cible_comments
- cible_links
- cible_postmeta
- cible_posts
- cible_termmeta
- cible_terms
- cible_term_relationships
- cible_term_taxonomy
Renommer les tables
- source_comments en cible_comments
- source_links en cible_links
- source_postmeta en cible_postmeta
- source_posts en cible_posts
- source_termmeta en cible_termmeta
- source_terms en cible_terms
- source_term_relationships en cible_term_relationships
- source_term_taxonomy en cible_term_taxonomy
Modifier à la main certaines entrées de cible_options
Il faut faire du sur mesure… Le site que je détricotais était heureusement très simple. J’ai simplement dû aller chercher dans la table source_3_options les valeurs des éléments qui nous semblent mériter d’être transféré et copier-coller la valeur dans l’option de même nom de la table cible_options .
Conserver une trace de certaines entrées
Certaines entrées n’existent pas encore puisqu’il faut activer le thème ou l’extension, puis faire une petite modification des réglages pour qu’elles se créent.
J’ai copié-collé dans un éditeur de texte les valeurs de current_theme, theme_mods_stargazer et cookie_notice_options pour les avoir plus tard.
Modifier les enregistrements DNS
Pointer le domaine subdomain.com vers le nouvel hébergement.
Avec whatsmydns.net, voir la propagation du nouveau DNS.
Créer le certificat Let’s encrypt de subdomain.com (en cochant l’option www).
Faire les derniers réglages
Pour une raison que j’ignore, Chrome conserve longtemps l’ancienne adresse IP du site. J’ai trouvé que c’était très irritant puis maintenant c’est très pratique !
Je tape subdomain.com dans firefox (réglé pour ne conserver aucun historique) et il affiche le nouveau site. Je peux me connecter à son tableau de bord.
Pendant ce temps, Chrome continue à afficher l’ancien site et si on se connecte, on se connecte à l’ancien tableau de bord. C’est pratique si on ne trouve pas les bonnes infos dans la base de données.
Modifier à la main les données
J’ai activé le thème stargazer puis fait une toute petite modification de son apparence. Ainsi, theme_mods_stargazer apparait maintenant dans cible_options. Je peux y copier-coller la valeur qui était dans la table du site source. Et automatiquement tous les réglages sont repris (sauf pour l’image de header, qu’il faut désactiver puis réactiver pour qu’elle s’affiche).
Dans les réglages de l’extension cookie-notice, j’ai également fait une toute petite modification. Dans la table cible_options, l’option cookie_notice_options est maintenant visible. Je peux aussi y copier-coller la valeur qui était dans la table source-options.
Pour le reste, j’ai copié-collé les réglages entre l’ancien site visible sur chrome et le nouveau visible sur firefox.
Rajouter les utilisateurs du site source
Il faut rajouter à la main les utilisateurs du site source. Comme on a conservé les tables source_3_usermeta et source_3_users, on peut assez facilement retrouver les bonnes informations.
Et malheureusement si l’id des users a changé, on risque d’être obligé d’aller réaffecter les contenus aux bons users…
Modifier wp-config.php et .htaccess
Vu que le site créé est crypté (certificat Let’s encrypt), il faut modifier certains éléments. Et je veux aussi interdire l’édition de fichiers dans le tableau de bord WordPress et limiter le nombre de révisions à 5.
Dans wp-config.php (avant la ligne /* That’s all, stop editing! Happy blogging. */ ), ajouter les lignes suivantes :
// Forcer l'accès SSL (https) pour le tableau de bord WordPress
define('FORCE_SSL_ADMIN', true);
// interdire l'édition de fichiers dans le tdb WordPress
define('DISALLOW_FILE_EDIT', TRUE);
define('WP_POST_REVISIONS', 5);
// max 5 stored revisions per posts
Et dans .htaccess, le contenu devrait être le suivant :
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Et maintenant ?
Une fois que la propagation des DNS est terminée (il vaut mieux attendre 24h), je peux supprimer le site dans son multisite source. Notre site est maintenant autonome.
par Anne-Laure DELPECH | 16 Nov 2016 | php
J’essaie de toujours créer des chemins relatifs, pour éviter de devoir modifier des documents si leur racine change.
Pour lire les données de mon Pi sur un site web en PHP, j’avais besoin de trouver automatiquement l’url du site, avec son protocole http ou https selon les cas.
Je me suis inspirée de PHP Document Root, Path and URL detection.
Dans un fichier php, il suffit de placer le code suivant pour savoir à quoi chaque élément correspond :
<?php
// http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html
$base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
$doc_root = preg_replace("!${_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$base_url = preg_replace("!^${doc_root}!", '', $base_dir); # ex: '' or '/mywebsite'
$protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
$port = $_SERVER['SERVER_PORT'];
$disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
$domain = $_SERVER['SERVER_NAME'];
$full_url = "${protocol}://${domain}${disp_port}${base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc.
?>
<table>
<tbody>
<tr>
<td width="102">$base_dir</td>
<td width="512"><?php echo $base_dir ; ?></td>
</tr>
<tr>
<td width="102">$doc_root</td>
<td width="512"><?php echo $doc_root ; ?></td>
</tr>
<tr>
<td width="102">$base_url</td>
<td width="512"><?php echo $base_url ; ?></td>
</tr>
<tr>
<td width="102">$protocol</td>
<td width="512"><?php echo $protocol ; ?></td>
</tr>
<tr>
<td width="102">$port</td>
<td width="512"><?php echo $port ; ?></td>
</tr>
<tr>
<td width="102">$disp_port</td>
<td width="512"><?php echo $disp_port ; ?></td>
</tr>
<tr>
<td width="102">$domain</td>
<td width="512"><?php echo $domain ; ?></td>
</tr>
<tr>
<td width="102">$full_url</td>
<td width="512"><?php echo $full_url ; ?></td>
</tr>
</tbody>
</table>
On obtient le résultat suivant :
$base_dir |
/var/www/vhosts/domaine.com/pi.domaine.com |
$doc_root |
/var/www/vhosts/domaine.com/pi.domaine.com |
$base_url |
|
$protocol |
https |
$port |
443 |
$disp_port |
|
$domain |
pi.domaine.com |
$full_url |
https://pi.domaine.com |
A quoi ça sert ?
Si je veux que le fichier PHP ailler chercher un fichier css dans un répertoire /css, il me suffit maintenant d’ajouter dans <head> :
<?php
// http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html
$base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
$doc_root = preg_replace("!${_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$base_url = preg_replace("!^${doc_root}!", '', $base_dir); # ex: '' or '/mywebsite'
$protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
$port = $_SERVER['SERVER_PORT'];
$disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
$domain = $_SERVER['SERVER_NAME'];
$full_url = "${protocol}://${domain}${disp_port}${base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc.
?>
<link rel="stylesheet" href="<?php echo $full_url . '/css/pi-stylesheet.css' ; ?>">
par Anne-Laure DELPECH | 12 Nov 2016 | site web
Cet exemple est mis en ligne pour illustrer l’article Déclarer ses fichiers à la CNIL pour les sites sans aucune activité marchande, qui sont dispensés de déclaration CNIL . Pour les activités faisant l’objet d’une déclaration simplifiée voir les exemples de mentions légales pour une société, et pour une entreprise individuelle.
Attention, je ne garantis pas leur conformité légale. A ma connaissance elles sont conformes aux règles en vigueur au 18 octobre 2016 mais vous devriez consulter un avocat avant de les mettre en ligne.
Je vous autorise à copier tout ou partie de ce texte.
Editeur
|
Ce site internet est édité par :
Prénom NOM, ADRESSE
Tél TEL – MAIL
Directeur de la publication : DIRECTEUR |
Copyrights
|
Droits d’auteur / Copyright : ORGANISME
L’accès au site SITE vous confère un droit d’usage privé et non exclusif de ce site. Le présent site et l’ensemble des éléments qui y sont édités incluant notamment les textes, photographies, illustrations, logos, marques, … sont la propriété de ORGANISME au titre des législations sur les droits d’auteur et de la propriété intellectuelle.
Sauf autorisation expresse du Directeur de la publication, la modification, la reproduction, la représentation et le téléchargement de tout ou partie de ce site, sur quelque support que ce soit, pour un usage autre que privé, sont interdits. |
Hébergement
|
OVH, Siège social : 2 rue Kellermann – 59100 Roubaix – France |
Données personnelles
|
Les données personnelles recueillies à partir de tout formulaire de ce site font l’objet d’un traitement informatique destiné à DIRECTEUR (gérante de l’entreprise) pour répondre aux demandes de contact ou pour envoyer une lettre d’information hebdomadaire.
Conformément à la loi « informatique et libertés » du 6 janvier 1978 modifiée, vous disposez d’un droit d’accès et de rectification aux informations qui vous concernent.
Vous pouvez accéder aux informations vous concernant en vous adressant à : MAIL. Pour en savoir plus, consultez vos droits sur le site de la CNIL. |
Déclaration CNIL
|
Le site SITE fait l’objet d’une dispense de déclaration à la CNIL (Dispense n°7 : Délibération n°2006-138 du 9 mai 2006 décidant de la dispense de déclaration des traitements constitués à des fins d’information ou de communication externe). |
CGV
|
Sans (site non marchand) |
par Anne-Laure DELPECH | 5 Nov 2016 | Hébergement web
Je n’ai plus de VPS Plesk depuis un bout de temps. Je laisse cet article en ligne pour information mais je ne pourrai pas répondre aux questions éventuelles.
Nous avons déjà vu comment transformer un site http en site https dans l’article migration d’un site WordPress en http vers https (SSL). Ici nous allons voir comment faire dans un hébergement Plesk VPS Classic de chez OVH. Il y a de petites différences avec un site d’un hébergement mutualisé OVH.
L’intérêt de passer en https
J’invite tous les anglophones à lire attentivement cet article de Wired. Il explique bien pourquoi tous les propriétaires de site devraient immédiatement chercher à passer leurs sites en https. Mais il va plus loin en montrant l’importance de l’interface utilisateur pour que les internautes comprennent les risques pris lorsqu’ils intéragissent avec un site non crypté. Le témoignage de l’Iranien est particulièrement édifiant.
https://www.wired.com/2016/11/googles-chrome-hackers-flip-webs-security-model/
Obtenir un certificat SSL Let’s encrypt
La documentation de Plesk est incomplète sur ce sujet, mais le processus est très simple.
Il suffit de cliquer sur le lien « Let’s Encrypt » :

Pour les réglages, je coche « inclure www.domaine.com » même si je redirige www sur la version sans préfixe (attention ça n’est pas coché dans la copie d’écran ci-dessous mais il faut le faire) :

Une fois qu’on a cliqué sur « installer », on a au bout de quelques secondes un message en vert disant que le certificat est installé.
Transformer un site en HTTPS
On peut suivre les instructions, à partir de l’étape 2 de l’article initial migration d’un site WordPress en http vers https (SSL).
le contenu à ajouter dans .htaccess fonctionne aussi dans Plesk.
Et maintenant ?
Il faut vérifier que les redirections fonctionnent correctement. Un internaute doit pouvoir taper les url suivantes et être dirigé vers le site https://mon-domaine.com :
- www.mon-domaine.com
- mon-domaine.com
- http://mon-domaine.com
- mon-domaine.com/wp-login.php (ou wp-admin.php)
Une fois ces vérifications faites, ça y est, on a un site moderne et sécurisé.
Commentaires récents