NodeJS et demon

Pour compléter l’article sur la manière de créer un service sous Debian. Voici comment créer un service à partir d’une application NodeJS.

J’utilise forever. Pour l’installer, rien de plus simple avec NPM.

npm install -g forever

Je crée un répertoire dans lequel forever viendra écrire ses fichiers PID.

mkdir /var/run/forever

Voici maintenant le fichier de service :

#!/bin/sh

# configure env 
export PATH=$PATH:/usr/local/bin
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules
export SERVER_PORT=80
export SERVER_IFACE='0.0.0.0'

# Chemin vers l'application
APP_DIR=/var/app


case "$1" in
  start)
  #exec forever --sourceDir=$APP_DIR -p /var/run/forever start -c "npm start" 
  exec forever --sourceDir=$APP_DIR -p /var/run/forever start bin/www 
$APP_DIR
  ;;

  stop)
  exec forever stop --sourceDir=$APP_DIR bin/www
  ;;
esac

exit 0

 

Sources  :

https://thomashunter.name/blog/running-a-node-js-process-on-debian-as-an-init-d-service

https://www.npmjs.com/package/forever-service

Script de création d’un daemon sous Debian

Pour la station météo, certains programmes doivent fonctionner en tache de fond. Pour cela on utilise des démons.

Dans mon exemple j’ai un script Python à lancer. Ce script est capable de fonctionner en mode autonome mais je souhaite l’intégrer au système. Mon service s’appelle « launcher ».

#!/bin/sh

### BEGIN INIT INFO
# Provides:          launcher
# Required-Start:    $remote_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run weathergh
# Description:       Run weatherg-hardware as daemon.
### END INIT INFO

. /lib/lsb/init-functions

[ -f /etc/default/rcS ] && . /etc/default/rcS
PATH=/bin:/usr/bin:/sbin:/usr/sbin

SCRIPT_DIR=/home/rep/
SCRIPT=script_a_lancer.py

case "$1" in
  start)
    log_begin_msg "Running launcher"
    cd $SCRIPT_DIR
    python $SCRIPT --daemon
    log_end_msg 0
    ;;
  stop)
    log_begin_msg "Stopping launcher"

    cd $SCRIPT_DIR
    python $SCRIPT --quit
    log_end_msg 0
    ;;
  force-reload|restart)
    $0 stop
    $0 start
    ;;
  status)
    exit 0
    ;;
  *)
    log_success_msg "Usage: /etc/init.d/launcher {start|stop|restart|force-reload|status}"
    exit 1
esac

exit 0

Copier le script launcher dans le répertoire /etc/init.d/ et donner les droits d’exécution chmod +x /etc/init.d/launcher

Enregistrer le service et le démarrer :

update-rc.d launcher defaults
services start launcher

Sources :

https://openclassrooms.com/courses/faire-un-demon-sous-linux

Configuration du Raspberry Pi en mode « kiosk screen » pour la station météo

La station météo a vocation à être posée sur un meuble. Donc souhaite afficher en plein écran les informations importantes. De manière transparente on ne souhaite pas montrer qu’il s’agit d’un ordinateur.

Faire de la place

J’ai décidé de supprimer quelques programmes dont je n’ai pas usage pour libérer un peu la carte SD. Entre autres : Minecraft ou LibreOffice, Sonic, etc…

D’abord une mise à jour :

sudo apt-get update && sudo apt-get upgrade -y

Puis on supprime les programmes inutiles :

sudo apt-get autoremove --purge wolfram-engine minecraft-pi sonic-pi libreoffice*

Enfin le ménage :

sudo apt-get clean

Installation

Ensuite nous avons besoin de Chromium et de quelques outils que l’on installe

sudo apt-get install chromium x11-xserver-utils unclutter

Nous allons utiliser Chromium en mode kiosque c’est à dire en plein écran, sans barre d’outils ni décoration de fenêtre.

Edit : Pour installer Chromium sur Jessie

wget -qO - http://bintray.com/user/downloadSubjectPublicKey?username=bintray | sudo apt-key add -
echo "deb http://dl.bintray.com/kusti8/chromium-rpi jessie main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install chromium-browser rpi-youtube -y

Configuration

Nous allons indiquer à LXDE qu’il faut lancer Chromium automatiquement au démarrage. Editer le fichier /etc/xdg/lxsession/LXDE/autostart

# Commenter la ligne suivante afin désactiver l'écran de veille
#@xscreensaver -no-splash

# Les lignes suivantes désactivent la gestion de l'énergie. Elles empêchent l'écran de s'éteindre. 
@xset s off
@xset -dpms
@xset s noblank


# Cette ligne permet d'éviter d'afficher les messages d'erreur éventuels au démarrage
@sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium/Default/Preferences

# On indique à Chromium qu'il doit démarrer et sur quelle page il doit fonctionner 
@chromium --noerrdialogs --kiosk http://www.page-to.display

# --incognito Rajouter cette option si vous souhaitez démarrer en mode privée 

Et voici ! Il ne reste plus qu’à relancer la bête framboise !

Sources

https://www.danpurdy.co.uk/web-development/raspberry-pi-kiosk-screen-tutorial/

https://www.raspberrypi.org/forums/viewtopic.php?t=121195

Installer NodeJS, NPM et Bower sous Debian

node.js-bower

Pour une installation d’un environnement de développement sous Debian.

Installer les dépendances

sudo apt-get update 
sudo apt-get install git-core curl build-essential openssl libssl-dev

Télécharger NodeJS

Et lancer la compilation

tar xvf node-v5.4.0.tar.gz
cd node-v5.4.0
configure
make

Editer le fichier /etc/profiles ou ~/.profile

# PATH
NODEJS_HOME=$HOME/prgm/node-v5.4.0-linux-x64

PATH="$NODEJS_HOME/bin:$PATH"

Tester l’installation

node -v
npm -v

Installer Bower

npm install -g bower

Installer Grunt

npm install -g grunt

Let’s Hack !

Configuration Wifi avec SSID masqué sous Raspbian

Dans le cas ou tout comme moi vous avez masquez votre SSID, éditer le fichier /etc/network/interfaces

# /etc/network/interfaces
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ap-scan 1
wpa-scan-ssid 1
wpa-ssid "SSID"
wpa-proto RSN
wpa-pairwise CCMP
wpa-key-mgmt WPA-PSK
wpa-psk "PASS"

Sources :

framboise314.fr

Limiter l’accès de certains pays avec Nginx

Je suis récemment tombé sur un article décrivant comment bloquer l’accès de certains pays avec Nginx. J’ai donc décidé de bloquer les pays responsables de spams (commentaires indésirables). Je vais ici décrire la procédure sur Debian Jessie.

Tout d’abord vérifier que le module GOIP est  activé :

nginx -V

Si c’est le cas, la commande vous retournera quelque chose comme cela. C’est normalement la configuration par défaut sur Debian :

nginx version: nginx/1.x.x 
TLS SNI support enabled 
configure arguments: [...] --with-http_geoip_module [...]

Installer GEOIP :

apt-get install geoip-database libgeoip1

Puis créer le fichier /etc/nginx/conf.d/geo.conf

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default yes;
    BE no;
    FR no;
}

Via cette configuration, la France et la Belgique (désolé amis frontaliés) sont bloquées. Je vous laisse le soin d’ajouter d’autres pays…

Dans la le fichier de configuration du site web concerné, ajouter :

if ($allowed_country = no) {
        return 444;
}

Redémarrer le serveur :

service nginx configtest
service nginx restart

Au besoin, il possible de mettre à jour la base de données GEOIP

cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

A surveiller dans la durée dans vos logs. La manipulation fonctionne, je l’ai tester depuis un poste extérieur.

Source : JBNet.fr

Documentation Nginx : HttpGeoipModule

Liste des codes pays : ICI

 

Matomo encountered an error: Uncaught Error: Class "Piwik\Plugins\CustomVariables\CustomVariables" not found in /var/www/piwik/core/Tracker/TrackerCodeGenerator.php:101 Stack trace: #0 /var/www/piwik/plugins/SitesManager/API.php(160): Piwik\Tracker\TrackerCodeGenerator->generate() #1 [internal function]: Piwik\Plugins\SitesManager\API->getJavascriptTag() #2 /var/www/piwik/core/API/Proxy.php(255): call_user_func_array() #3 /var/www/piwik/core/Context.php(29): Piwik\API\Proxy->Piwik\API\{closure}() #4 /var/www/piwik/core/API/Proxy.php(158): Piwik\Context::executeWithQueryParameters() #5 /var/www/piwik/core/API/Request.php(274): Piwik\API\Proxy->call() #6 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(46): Piwik\API\Request->process() #7 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(18): WP_Piwik\Request\Php->call() #8 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php(63): WP_Piwik\Request\Php->request() #9 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1038): WP_Piwik\Request->perform() #10 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1205): WP_Piwik->request() #11 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php(16): WP_Piwik->updateTrackingCode() #12 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(296): WP_Piwik\TrackingCode->__construct() #13 /var/www/thegtricks/wp-includes/class-wp-hook.php(324): WP_Piwik->addJavascriptCode() #14 /var/www/thegtricks/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #15 /var/www/thegtricks/wp-includes/plugin.php(517): WP_Hook->do_action() #16 /var/www/thegtricks/wp-includes/general-template.php(3080): do_action() #17 /var/www/thegtricks/wp-content/themes/twentyfifteen-child/footer.php(45): wp_footer() #18 /var/www/thegtricks/wp-includes/template.php(810): require_once('...') #19 /var/www/thegtricks/wp-includes/template.php(745): load_template() #20 /var/www/thegtricks/wp-includes/general-template.php(92): locate_template() #21 /var/www/thegtricks/wp-content/themes/twentyfifteen/archive.php(68): get_footer() #22 /var/www/thegtricks/wp-includes/template-loader.php(106): include('...') #23 /var/www/thegtricks/wp-blog-header.php(19): require_once('...') #24 /var/www/thegtricks/index.php(17): require('...') #25 {main} thrown (which lead to: Session must be started before any output has been sent to the browser; output started in /var/www/thegtricks/wp-includes/script-loader.php/2938)