Aujourd’hui, nous avons décidés de lancer une communauté Slack pour l’ASBL 6×7. 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 :

<span class="nv">$ </span><span class="nb">cd</span> /tmp/
<span class="nv">$ </span>wget node-v4.1.2.tar.gz
<span class="nv">$ </span>wget https://nodejs.org/dist/v4.1.2/node-v4.1.2.tar.gz
<span class="nv">$ </span><span class="nb">tar</span> <span class="nt">-zxvf</span> node-v4.1.2.tar.gz
<span class="nv">$ </span><span class="nb">cd </span>node-v4.1.2
<span class="nv">$ </span>./configure
<span class="nv">$ </span>make
<span class="nv">$ </span><span class="nb">sudo </span>make install

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

<span class="nv">$ </span><span class="nb">sudo </span>apt-get install npm
<span class="nv">$ </span>npm install <span class="nt">-g</span> slackin

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

slackin <span class="o">[</span>votre-sous-domaine-slack] <span class="o">[</span>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 {#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 :

<span class="nv">$ </span>touch /var/www/slackin/server.js
<span class="nx">require</span><span class="p">(</span><span class="s1">'slackin'</span><span class="p">)({</span>
  <span class="na">token</span><span class="p">:</span> <span class="s1">'[api-token-slack]'</span><span class="p">,</span> <span class="c1">// required</span>
  <span class="na">interval</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>
  <span class="na">org</span><span class="p">:</span> <span class="s1">'[votre-sous-domaine-slack]'</span><span class="p">,</span> <span class="c1">// required</span>
  <span class="c1">//channels: 'channel,channel,...' // for single channel mode</span>
  <span class="na">silent</span><span class="p">:</span> <span class="kc">false</span> <span class="c1">// suppresses warnings</span>
<span class="p">}).</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>

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

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 :

<span class="nv">$ </span><span class="nb">sudo </span>ln <span class="nt">-s</span> /etc/nginx/sites-available/slack.6x7asbl.be /etc/nginx/sites-enabled/

On vérifie que la configuration est correcte :

<span class="nv">$ </span><span class="nb">sudo</span> /usr/sbin/nginx <span class="nt">-t</span>
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf <span class="nb">test </span>is successful

Et on relance le service nginx :

<span class="nv">$ </span><span class="nb">sudo</span> /etc/init.d/nginx restart

Configuration de upstart

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

description <span class="s2">"node.js server for slack.6x7asbl.be"</span>
author      <span class="s2">"akyrho - http://cedric.io"</span>

<span class="c"># used to be: start on startup</span>
<span class="c"># until we found some mounts weren't ready yet while booting:</span>
start on started mountall
stop on shutdown

<span class="c"># Automatically Respawn:</span>
respawn
respawn limit 99 5

script
    <span class="c"># Not sure why $HOME is needed, but we found that it is:</span>
    <span class="nb">export </span><span class="nv">HOME</span><span class="o">=</span><span class="s2">"/home/deploy"</span>

    <span class="nb">exec</span> /usr/local/bin/node /var/www/slackin/server.js <span class="o">>></span> /var/log/slack.6x7asbl.be.log 2>&1
end script

post-start script
   <span class="c"># Optionally put a script here that will notifiy you node has (re)started</span>
   <span class="c"># /root/bin/hoptoad.sh "node.js has started!"</span>
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 :

<span class="nv">$ </span>start slack6x7asblbe
slack6x7asblbe start/running, process 31541

Pour arrêter le processus :

<span class="nv">$ </span>stop slack6x7asblbe
slack6x7asblbe stop/waiting