Aujourd'hui, nous avons décidés de lancer une communauté Slack pour l'ASBL 6x7. Si vous ne le savez pas encore, Slack est un outil de communication collaboratif qui a le vent en poupe.

Le problème, c'est bien évidemment de gérer les invitations. En effet, par défaut, Slack ne permet qu'aux administrateurs du compte d'inviter d'autres membres. Hors, nous souhaitions que les membres potentiels se manifestent d'eux même pour faciliter le processus.

Bien sûr, nous aurions pu mettre en place un Google Form relié à une adresse e-mail, mais le processus n'en aurait pas été plus automatisé.

En farfouillant sur GitHub, je suis tombé sur Slackin, qui permet de gérer ça de manière automatique, et qui offre même un petit badge à afficher sur n'importe quelle page web :

Slackin

NodeJS

Slackin est un module NodeJS, nous devons donc commencer par le faire tourner sur la machine qui hébergera le service :

Terminal
1
2
3
4
5
6
7
8
$ cd /tmp/
$ wget node-v4.1.2.tar.gz
$ wget https://nodejs.org/dist/v4.1.2/node-v4.1.2.tar.gz
$ tar -zxvf node-v4.1.2.tar.gz
$ cd node-v4.1.2
$ ./configure
$ make
$ sudo make install

Passons à l'installation de npm et du package slackin :

Terminal
1
2
$ sudo apt-get install npm
$ npm install -g slackin

Et pour terminer, on démarre le processus pour faire un premier essais :

Terminal
1
slackin [votre-sous-domaine-slack] [api-token-slack]
  • Remplacez [votre-sous-domaine-slack] par la bonne valeur, dans notre cas : 6x7asbl
  • Remplacez [api-token-slack] par une clé API valide. Trouvez la vôtre ici.
  • Pour quitter le processus, faites ctrl+c

Par défaut, le port utilisé est le :3000, on peut donc ouvrir notre navigateur sur ip.du.serveur:3000 et y découvrir l'interface de Slackin :

6x7 asbl Slack Community Landing Page

Créer le serveur node

Jusque ici, tout fonctionne pour le mieux dans le meilleur des mondes. Mais l'idéal serait de créer un daemon pour controller le démarrage et l'arrêt du processus. On pourra également gérer le démarrage au reboot ou encore le monitorer.

Pour ce faire, nous allons créer un serveur Node.js qui lancera Slackin en tant que module. Le serveur écoutera, comme la commande utilisée précédemment, sur le port 3000.

On crée un fichier /var/www/slackin/server.js :

Terminal
1
$ touch /var/www/slackin/server.js
/var/www/slackin/server.js
1
2
3
4
5
6
7
require('slackin')({
  token: '[api-token-slack]', // required
  interval: 1000,
  org: '[votre-sous-domaine-slack]', // required
  //channels: 'channel,channel,...' // for single channel mode
  silent: false // suppresses warnings
}).listen(3000);

Comme précédemment, il faut remplacer les valeurs de token et org par nos propres valeurs :

  • Remplacez [votre-sous-domaine-slack] par la bonne valeur, dans notre cas : 6x7asbl
  • Remplacez [api-token-slack] par une clé API valide. Trouvez la vôtre ici.

Une fois le fichier sauvegardé, on peut passer à l'étape suivante, la configuration du serveur web.

Configuration de Nginx

/etc/nginx/sites-available/slack.6x7asbl.be
1
2
3
4
5
6
7
8
9
server{
  listen 80;
  server_name slack.6x7asbl.be;
  location / {
    proxy_set_header  X-Real-IP   $remote_addr;
    proxy_set_header  Host        $http_host;
    proxy_pass        http://127.0.0.1:3000;
  }
}

La configuration est assez simple à comprendre : Nginx écoutera sur le port 80 pour le domaine slack.6x7asbl.be et renverra les requêtes sur la machine locale (127.0.0.1) sur le port 3000, celui là même que nous avons choisi précédemment dans notre application NodeJS.

Une fois le fichier sauvegardé, nous l'activons en créant un lien symbolique du depuis le dossier sites-available vers le dossier sites-enabled :

Terminal
1
$ sudo ln -s /etc/nginx/sites-available/slack.6x7asbl.be /etc/nginx/sites-enabled/

On vérifie que la configuration est correcte :

Terminal
1
2
3
$ sudo /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Et on relance le service nginx :

Terminal
1
$ sudo /etc/init.d/nginx restart

Configuration de upstart

Pour pouvoir utiliser upstart, nous créons un nouveau fichier de configuration : /etc/init/slack6x7asblbe.conf.

/etc/init/slack6x7asblbe.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
description "node.js server for slack.6x7asbl.be"
author      "akyrho - http://cedric.io"

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="/home/deploy"

    exec /usr/local/bin/node /var/www/slackin/server.js >> /var/log/slack.6x7asbl.be.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

Attention :

  • N'oubliez pas de personnaliser la valeur de HOME à la ligne 15
  • A la ligne 17, vérifiez bien les différents path
  • Le nom du fichier détermine le nom de la commande upstart, dans notre cas, il s'agit de slack6x7asblbe

Il ne reste plus qu'a lancer le service :

1
2
$ start slack6x7asblbe
slack6x7asblbe start/running, process 31541

Pour arrêter le processus :

1
2
$ stop slack6x7asblbe
slack6x7asblbe stop/waiting

Bébé en balade : une journée à Trèves

Ce week-end, nous nous sommes rendu à Trèves. Cette petite ville allemande est située à seulement quelques kilomètres de la frontière avec le Grand Duché de Luxembourg. Nous nous y rendons régulièrement depuis quelques années pour changer d’air et faire un peu de shopping. Le centre-ville est très agréable et facilement accessible en poussette. Une … Lire la suite de Bébé en balade : une journée à Trèves
Continue reading

Ruby et les dépendances : RubyGems, Gemfile et Ruby Toolbox

Le nombre de Gems disponible ne fait qu'augmenter, mais il faut faire bien attention à certains détails avant d'en installer une. Continue reading

Mon stage chez les para, fin

Published on June 21, 2007

Entrevue avec Greg, rédacteur de xMonkeyMosherx

Published on December 01, 2007