SheevaPlug

Notification par SMS

Tuesday, 19 February 2013
|
Écrit par
Grégory Soutadé

SMS in classroom

Un serveur perso c'est bien, un serveur auto hébergé c'est très bien, mais un serveur auto hébergé qui a planté, c'est nul ! L'inconvénient du plantage système est qu'il ne prévient pas, du coup la durée d'indisponibilité peut être longue si l'on ne s'en rend pas compte.

Pour pallier à ce problème, j'ai fait un petit retour vers OVH. Mon compte n'ayant pas été clôturé après la migration du nom de domaine, j'en ai profité pour acheter un pack SMS. Pour environ 10€ TTC, j'ai 100 SMS que je peux envoyer via le web. Ce petit script bash permet de me notifier lorsque le serveur tombe. Bien sûr, il faut pouvoir l'exécuter sur un PC connecté h24...

L'idée est de faire un HEAD sur la favicon de mon blog (qui n'existe pas et qui n'apparaît pas dans les log). La requête est exécutée toutes les 10 minutes. Au bout de 3 échecs successifs (pour éviter les problèmes de changement d'IP), un SMS est envoyé et le script quitte.

#!/bin/bash BASE_URL="https://www.ovh.com/cgi-bin/sms/http2sms.cgi" ACCOUNT="sms-sgXXXXX-1" LOGIN="BBBBBB" PASSWORD="YYYYYYYY" FROM="SOUTADE" TO="%2B33666ZZZZZZ" #+33666ZZZZZZ MESSAGE="Cybelle%20is%20down" # Cybelle is down MAX_TRIES=3 TARGET="http://blog.soutade.fr/favicon.ico" request="$BASE_URL?account=$ACCOUNT&login=$LOGIN&password=$PASSWORD&from=$FROM&to=$TO&message=$MESSAGE&noStop=1" #echo $request tries=$MAX_TRIES while [ 1 ] ; do HEAD $TARGET | grep "404" >/dev/null # Found if [ $? -eq 0 ] ; then # Reset counter if [ ! $tries -eq $MAX_TRIES ] ; then tries=$MAX_TRIES fi else # Fail tries=`expr $tries - 1` fi # No more tries, send notification and exit if [ $tries -eq 0 ] ; then GET "$request" break fi sleep 10m done

PS : Pour utiliser le script, il faut créer un nouvel utilisateur et ajouter un expéditeur depuis l'interface OVH. Attention, les champs doivent être encodés sous la forme URL (voir la partie "encode" de http://soutade.fr/urlunshortener)

I believe I can fly

Sunday, 27 January 2013
|
Écrit par
Grégory Soutadé

Mon Sheeva est tombé un lundi matin (le 7 janvier). J'ai reçu l'alimentation deux semaines plus tard... Le serveur a pu redémarrer vers 16h, mais les plus attentifs auront remarqué que le blog était en ligne depuis le mardi 8 janvier 11h. C'est le résultat de mes premiers pas dans les nuages. La situation est critique : l'alimentation a lâchée, pas de serveur de secours sous la main (mais les sauvegardes sont là), pas de serveur distant, impossible de laisser tourner un PC h24 et (a priori) quelques jours à attendre avant d'avoir la pièce de rechange.

Le blog est la partie la plus visitée, il fallait au moins essayer de le remettre en ligne. Pour le coup, le passage à un blog statique simplifie énormément les choses ! Bref il faut trouver un petit espace de stockage en ligne pour pas longtemps et pas trop cher (tant pis pour les autres services, ils ne sont pas critiques et je ne voulais pas perdre du temps à configurer une instance qui sera détruite par la suite).

Goku sur son nuage

Je suis référencé chez Gandi, j'ai donc cherché par là. Concernant les sites web simples, ils ne proposent que la création via Gandi BaseKit ou Sitemaker à partir de 5€ par mois. Sinon, ils ont une solution "Simple Hosting" : un pack PHP/MySQL ou PHP/PostGre à partir de 5€/mois, ça pourrait presque être adapté, mais je ne voulais pas souscrire pour un mois. Enfin, dernière option : les nuages (le cloud) : louer une part d'un serveur que l'on peut relâcher quand on n'en a plus besoin. Bingo ! Je paye via mon compte pré payé (le surplus servira pour le renouvellement du nom de domaine). Une fois l'instance crée avec une Debian stable 64 bits (quelques minutes), un petit SSH, on installe emacs, nginx, un autre coup de scp, on reconfigure la zone DNS et roulez jeunesse, le blog est de nouveau en ligne. Les mails sont redirigés sur le webmail de Gandi. C'est une solution de secours flexible, pas chère (0.50 euros par jour) et très intéressante (surtout quand on a déjà tous les fichiers de conf) puisqu'on maîtrise tout (ce qui est plus facile pour adapter son ancienne configuration) avec en prime une addresse IPV6. Pour ce prix-là, j'ai :

  • 1 coeur dédié
  • 512Mo de mémoire
  • 12 Go de disque
  • Une connexion 10Mbits

De loin on pourrait dire que c'est à peu près la même chose que le Sheeva (hors débit de la connexion), sauf qu'en fait ça va VRAIMENT plus vite. Suite à l'aller-retour de l'alimentation en Angleterre (...), j'ai quand même ré installé la majorité des services sur l'instance.

En réalité, ça fait quelques semaines que j'y pensais. Lorsque ce sera possible, il faudrait installer un serveur de secours (fallback) pour faire face à un problème matériel, un crash de disque ou même une connexion qui tombe. C'est un gros problème de l'auto hébergement : pas de réplication des ressources. Tandis que dans les gros datacenter de Gandi, tout est virtuel, dupliqué 15 fois sur plusieurs sites physiques et avec des débits plus qu'intéressants. Bref, avoir deux serveurs physiques c'est presque jouable (ami, famille ...). Les problèmes sont les suivants :

  • Le DNS : si l'IP change tout le temps des deux côtés, c'est galère. On doit s'appuyer sur un serveur DNS fixe et éditer les zones en évitant les conflits (ou activer/désactiver manuellement l'édition des zones sur le serveur qui va bien). Il faut au moins avoir une IP fixe sur les deux (pour avoir un DNS primaire/secondaire).
  • Les données utilisateurs : un simple rsync suffit
  • Les projets versionnés : a priori une simple copie des fichiers suffit, mais c'est plus élégant de faire un clone/checkout des dépôts
  • Base de données : la plupart des moteurs incluent un système de maître/esclave

Il existe quelques solutions qui prennent en compte tous ces paramètres ou faire un script perso, reste plus qu'à le mettre en place si j'achète un nouveau serveur !

Concernant ma solution dans les nuages, je pourrais aussi faire un script de migration (copie, installation et configuration des paquets sur un nouveau serveur virtuel).

Et pour le plaisir :

Alimentation SheevaPlug et CuBox

Sunday, 27 January 2013
|
Écrit par
Grégory Soutadé

Le SheevaPlug est mort, vive le SheevaPlug !

Suite à mon dernier article concernant le travail le dimanche, mon SheevaPlug a décidé de se mettre en grève ! À mon réveil lundi matin (7 janvier) : plus rien ! Ma première idée est qu'il y a eu une coupure de courant et qu'il a eu du mal à redémarrer sur la clé USB, Ubuntu ayant pour sa part planté. Pourtant, je n'arrive pas à me connecter par le lien série. Les symptômes sont :

  • Une seule des deux LED du frontpanel est allumée
  • Les deux LED de l'ethernet sont allumées

Et pourtant, rien ne marche :( En consultant le net, je retombe régulièrement sur LE problème du SheevaPlug : son alimentation. Ce serait donc la PSU (Power Supply Unit) qui aurait lâché. Quatre coups de tournevis plus tard (et surtout en suivant ces instructions), je découvre ça :

SheevaPlug broken PSU
Je ne comprends pas grand-chose en électronique, mais je me dis que ça a vraiment été monté à l'arrache. Elle aura quand même tenu 2 ans et demi (donc la garantie de 12 mois a expirée depuis bien longtemps), ce qui est quand même très bien (ça fait du 3.61€ par mois). J'ai ensuite commandé une nouvelle alimentation sur newit (ils ont tout prévu !) : 26.5€ avec les frais de port. J'aurais pu en acheter une chez un marchand d'élec, mais je ne voulais pas qu'elle pende lamentablement à l'extérieur, ni avoir à souder. J'espère que celle-ci tiendra au moins aussi longtemps que la précédente.

SheevaPlug with new PSU


PS : Lors du voyage par Royal Air Mail, ils ont oublié de préciser les informations additionnelles, du coup elle a fait un joli aller-retour et j'ai pris deux semaines dans les dents + le prix d'un transporteur TNT. Du coup le transport a coûté plus cher que l'alimentation en elle-même.

Une fois la nouvelle alimentation installée : Oh miracle ! Ça fonctionne !!!! J'ai même pu tuner mon Sheeva avec un embout blanc sur un fond noir.

Sheevaplug working


CuBox

cubox.jpg

Régulièrement je regarde le site newit pour voir les nouveautés. GlobalScale Technologies (le constructeur du SheevaPlug) s'est rapidement éloigné de la philosophie du Sheeva (le GuruPlug a eu un succès mitigé) : on rajoute un disque dur, on rajoute le wifi, on rajoute le bluetooth, on rajoute le HDMI... Mais on garde le même processeur et la même quantité de mémoire... Alors qu'il fallait faire tout l'inverse : garder un appareil petit avec quelques connexions (le double ethernet peut être sympa) tout en augmentant la puissance (processeur et mémoire). Solid Run (une startup de seulement 7 personnes !) l'a bien compris en sortant la CuBox. Pour moi c'est le digne successeur du SheevaPlug :

  • Marvel PJ4 (Dual Cortex A8) @ 800Mhz
  • 1GB de DDR3 32 bits @ 800Mhz
  • GPU OpenGL ES / Décodeur HD / HDMI (c'était dans le SoC)
  • InfraRouge
  • 1 Gigabit Ethernet / 2 USB / 1 eSata / 1 SPDIF / 1 MicroSD
  • 55mm x 55mm x 42mm

Plus petit (le Sheevaplug fait 110 mm x 69.5 mm x 48.5 mm), plus puissant et le tout pour 3 Watts (comme le Sheeva). Le prix est identique à celui du Sheeva (130 €). Et pour ceux qui sont un minimum patient, une version à 2GB (CuBox pro) devrait sortir fin janvier. Si elle avait été disponible de suite (ou pré commandable depuis le site de Solid Run, qui ne livre pas en France...), je l'aurais bien échangé contre mon Sheeva qui commence un peu à ramer quand on lui demande du PHP ou du Python ! Au passage, j'ai remplacé ma clé USB Toshiba par une SDCard 16GB class 10 : en plus d'accélérer les entrées/sorties elle devrait être plus fiable.

La CuBox sera incontestablement ma prochaine acquisition pour un serveur perso (à faible charge, s'entend). D'ici là, c'est bien de voir comment va se comporter le hard, qui vient tout juste de paraître (on n'est pas sans rappeler les défauts d'alimentation du Sheeva...).

Activate eSata on Sheevaplug with Debian

Monday, 08 October 2012
|
Écrit par
Grégory Soutadé

esata.png

Activate eSata on Sheevaplug with Debian I recently bought an external hard disk with an eSata interface, it was not easy to find (almost are with USB2/3, other are expensive advanced NAS), but I did. The purpose of this disk is to make backups. But, on my Sheevaplug, the main partitions (/root, /boot...) are on an USB key (Toshiba 16 GB) running Debian stable. When I plugged my new hdd it was not recognized ! Actually I first configured my sheevaplug following some tutorials (http://www.cyrius.com/debian/kirkwood/sheevaplug/ for example). It was said to set the boot variable "arcNumber" to 2097. Why ? In facts ARM SoC doesn't have peripherals discovery mode, so you need to tell which board you're running on.

After looking a bit into Debian's kernel, it seems that eSata interface is activated only if arcNumber is set to 2678 ! If I do that, original Ubuntu on NAND flash (factory installation) doesn't recognize the current SoC because arcNumber 2678 is a patch from Debian (in original installation, eSata is activated by default). The second point is that if you set the board as an eSata board, Debian will try to boot on the eSata hard disk (even if you specify different kernel root=XX values).

So what to do ? The solution is to specify your partitions not using classic /dev/sdXXX format, but using UUID numbers. They are not human readable, nevertheless they refer to an unique partition ! The first step consists in listing your partitions UUID :

ls -l /dev/disk/by-uuid/ lrwxrwxrwx 1 root root 10 Sep 27 07:34 1642ad57-77aa-494c-aa77-6998d420eb8f -> ../../sda3 lrwxrwxrwx 1 root root 10 Sep 27 07:34 198239b4-ff16-4dda-8df0-37b106005817 -> ../../sda1 lrwxrwxrwx 1 root root 10 Sep 27 07:34 2e0cd399-3839-4e4e-bc57-5e6628841bc1 -> ../../sda2 lrwxrwxrwx 1 root root 10 Sep 27 07:34 dd27350b-2522-46a6-862e-0cbc072b535f -> ../../sda4

Then, edit /etc/fstab to use UUID and not /dev/sdXXX (it's fastidious I know) After that, you need to reboot with the serial console connected and stop automatic boot (type a key) to edit uBoot configuration. We'll set arcNumber to 2678 by default.

setenv arcNumber 2678

Then edit bootargs_options (for me it's bootargs_options_usb) to set correct UUID value

setenv usb_bootargs_root "root=UUID=2e0cd399-3839-4e4e-bc57-5e6628841bc1"

Last step is to edit the global boot_cmd to set arcNumber to 2097 before booting to NAND (in my case, if USB boot fails it will try to boot on MMC then on NAND) :

setenv bootcmd 'setenv arcNumber 2678; saveenv; run usb_boot; setenv arcNumber 2097; saveenv; run bootcmd_mmc; run bootcmd_nand'

Finally save environment variables to flash and boot

saveenv boot

My final environment variables

ethact=egiga0 bootargs_root=ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs mtdpartitions=mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) ethaddr=00:50:43:01:4C:56 bootargs_console=console=ttyS0,115200 bootargs_root_nand=ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs bootcmd_nand=setenv bootargs $(bootargs_console) $(mtdpartitions) $(bootargs_root_nand); \ nand read.e 0x00800000 0x00100000 0x00400000; bootm 0x00800000 bootargs_root_mmc=root=/dev/mmcblk0p2 rootdelay=5 bootcmd_mmc=setenv bootargs $(bootargs_console) $(bootargs_root_mmc); mmcinit;\ ext2load mmc 0:1 0x800000 /uImage; bootm 0x00800000 real_bootcmd=run bootcmd_mmc; run bootcmd_nand filesize=32D62A usb_bootargs_console=console=ttyS0,115200 usb_bootcmd_usb=usb start; ext2load usb 0:1 0x01100000 /uInitrd; ext2load usb 0:1 0x00800000 /uImage usb_boot=setenv bootargs $(usb_bootargs_console) $(usb_bootargs_root); run usb_bootcmd_usb;\ bootm 0x00800000 0x01100000 mainlineLinus=yes bustargs_root_usbroot=/dev/sda2 usb_bootargs="root=UUID=2e0cd399-3839-4e4e-bc57-5e6628841bc1" stdin=serial stdout=serial stderr=serial mainlineLinux=yes enaMonExt=no enaCpuStream=no enaWrAllo=no pexMode=RC disL2Cache=no setL2CacheWT=yes disL2Prefetch=yes enaICPref=yes enaDCPref=yes sata_dma_mode=yes netbsd_en=no vxworks_en=no bootdelay=3 disaMvPnp=no enaAutoRecovery=yes

I added a rule in fstab to mount my hdd at startup

UUID=590f30b1-7727-4d0a-a86a-2360ec0b3f88 /media/backup ext4 defaults 0 1

A simple backup script based on rsync that power down disk after backup is done.

Proxy a subdomain with nginx

Thursday, 09 August 2012
|
Écrit par
Grégory Soutadé

A lot of things has been written about nginx and Apache : proxy_pass, proxy_redirect, subdomains... I just want to publish my configuration that is in test but works. This is a response to my requirements : I want nginx to serve the subdomain blog.soutade.fr but transfer all other requests to an Apache server (soutade.fr, www.soutade.fr, indefero.soutade.fr ...).

 

First step is to install nginx. Nginx current version is 0.7.23 (thanks to debian stable). Then edit /etc/nginx/sites-available/default :

server { listen 80 default; ## listen for ipv4 server_name soutade.fr *.soutade.fr; access_log /var/log/nginx/soutade.fr.access.log; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; resolver localhost; proxy_pass http://$host:8000; } } server { listen 80; ## listen for ipv4 server_name blog.soutade.fr; access_log /var/log/nginx/soutade.fr.access.log; location / { root /var/www/blog; index index.html; } location = /favicon.ico { access_log off; log_not_found off; } location ~ /\. { deny all; access_log off; log_not_found off; } }

The first block tells nginx to redirect all request from soutade.fr and *.soutade.fr to a local Apache server listening on port 8000. The second block creates a special rule for blog.soutade.fr : files will be served by nginx server and no redirection will be applied. We also disable favicon.ico error log and deny serving \.* files. There is a tip in the first block : we need to set up a local DNS server ("resolver localhost" directive). If this option is not set, it will try to do another DNS request to resolve $host address. So we'll simply install bind9 and configure it. Edit /etc/bind/named.conf.local

zone "soutade.fr" { type master; file "/etc/bind/db.soutade.fr"; };

Finally edit /etc/bind/db.soutade.fr with :

$TTL 604800 @ IN SOA soutade.fr. root.soutade.fr. ( 07082012 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. @ IN A 127.0.0.1 * IN CNAME soutade.fr. @ IN AAAA ::1

And restart bind : sudo service bind9 restart. root.soutade.fr. is the mail address of the administrator. Now everything might be ok.