Support par Brimir

Birmir n'étant plus mis à jour, le support est maintenant gérer avec Zammad.

Présentation

Brimir is a simple helpdesk system that can be used to handle support requests via incoming email.

Brimir est actuellement installé sur le serveur Tails.

Utilisation

Start/Stop

sudo service uwsgi [start|stop|status] brimir

Labels

Ajouter une adresse email d'envoi

Possible par l'interface, mais il y a une vérification. On peut aussi trifouiller la base SQL (tant que c'est un ajout et fait proprement) en ajoutant une ligne avec default à false, les dates à expression NOW() et token sur null.

Installation

Prérequis : base SQL

On choisi PostgreSQL, parce que c'est le bien :)

  1. On commence par créer l'utilisateur :

    11:07 alevavas@maia ~ % sudo -u postgres createuser -E -I -P brimir
    [sudo] password for alevavas:
    Saisir le mot de passe pour le nouveau rôle :
    Le saisir de nouveau :
    Le nouveau rôle est-il super-utilisateur ? (o/n) n
    Le nouveau rôle est-il autorisé à créer des bases de données ? (o/n) n
    Le nouveau rôle est-il autorisé à créer de nouveaux rôles ? (o/n) n
  2. on créé la base sudo -u postgres createdb -E utf8 -O brimir brimir on ajoute l'autorisation de se connecter : sudo nano /etc/postgresql/9.1/main/pg_hba.conf

    • on ajoute la ligne suivante : host brimir brimir 172.22.2.56/32 md5
  3. enfin on recharge : sudo service postgresql reload
    [ ok ] Reloading PostgreSQL 9.1 database server: main.

Brimir

Les étapes sont assez simple (une fois qu'on a trouvé ce qui cloche, comme par exemple le fait que le gem execjs vient sans moteur JS et qu'il faut installer NodeJS) :

  1. on créé un emplacement et on récupère le code :

    root@tails /srv # mkdir brimir
    root@tails /srv # cd brimir
    root@tails /srv/brimir # ll
    total 0
    root@tails /srv/brimir # git clone https://github.com/ivaldi/brimir.git .
    root@tails /srv/brimir # git checkout tags/0.6.1
    HEAD is now at b084fd6... Recognize CC an BCC addresses as well
    
    root@tails /srv/brimir # useradd -M -c "Brimir" -r brimir -l -d /srv/brimir/
    root@tails /srv/brimir # chown -R brimir:www-data .
  2. on installe les dépendances :

    root@tails /srv/brimir # apt-get install ruby ruby-dev libpq-dev 
    root@tails /srv/brimir # gem install bundler
    root@tails /srv/brimir # curl --silent --location https://deb.nodesource.com/setup_0.12 | bash -
    root@tails /srv/brimir # apt-get install nodejs
  3. on met la configuration comme il faut

    • nano config/database.yml avec les bonnes infos
    • nano config/environments/production.rb on rajoute :
      # Conf ResEl
      config.action_mailer.default_options = { from: 'support@resel.fr' }
      config.action_mailer.default_url_options = { host: 'support.resel.fr' }
  4. on récupère les dépendances (Gems) avec sudo -u brimir bundle install --without mysql sqlite development test --path vendor/bundle --deployment (attention à l'utilisateur, sudo, pour toute commande lié à l'application comme bundle à partir de maintenant)

  5. on va générer un secret qui servira pour les cookies, on peut le faire avec sed -i "s/<%= ENV\[\"SECRET_KEY_BASE\"\] %>/bin/rake secret/g" config/secrets.yml ou sed -i "s/<%= ENV[\"SECRET_KEY_BASE\"] %>/dd if=/dev/urandom bs=1 count=1024 | sha512sum/g" config/secrets.yml`

  6. on peut alors commencer l'installation de l'application : sudo -u brimir bundle exec rake db:schema:load RAILS_ENV=production sudo -u brimir bundle exec rake assets:precompile RAILS_ENV=production

  7. enfin on peut ajouter un 1er utilisateur à la main : sudo -u brimir bundle exec rails console production

uWSGI

Bon l'application est prête, il lui faut un container serveur d'application, uWSGI est probablement le candidat idéal en plus du fait qu'il gère plus d'un langage (Python, Ruby, Perl, ...).

  1. On installe : sudo apt-get install uwsgi uwsgi-plugin-rack-ruby1.9.1
  2. On va créer un fichier de configuration nano /etc/uwsgi/apps-available/brimir.ini (la conf est dérivée de celle de Redmine)

    
    [uwsgi]
    master = true
    lazy-apps = true
    ;idle = 3600
    processes = 1
    
    chdir = /srv/brimir
    plugin = rack
    rack = config.ru
    rbrequire = bundler/setup
    env = RAILS_ENV=production
    
    uid = brimir
    gid = brimir
    chmod-socket = 770
    chown-socket = www-data:www-data
    
    ; lazy-apps
    ;rbrequire = rubygems
    ;env = BUNDLE_GEMFILE=/srv/brimir/Gemfile
  3. On ajoute l'application aux actives : cd /etc/uwsgi/apps-enabled/ && ln -s ../apps-available/brimir.ini .

  4. On peut lancer l'application avec service uwsgi start brimir et uWSGI met à disposition le socket pour y accéder dans /run/uwsgi/app/brimir/socket.

Nginx

Un serveur web qu'on ne présente plus, léger avec une syntaxe de configuration légère.

  1. On commence par l'installer : sudo apt-get install nginx
  2. On créé le fichier de conf qui va bien sudo nano /etc/nginx/sites-enabled/support.conf (de nouveau, basé sur l'exemple Redmine) :
    server {
      listen        172.22.42.20:443 ssl;
    
      server_name   support.resel.fr;
    
      ssl_certificate       /etc/nginx/ssl/resel.pem;
      ssl_certificate_key   /etc/nginx/ssl/resel.key;
    
      access_log /var/log/nginx/access_support.resel.fr.log;
      error_log /var/log/nginx/errors_support.resel.fr.log;
    
      root        "/srv/brimir/public";
    
      # "API" de création des tickets par email .. désolé mais on filtre, que pour l'interne
      # Seul le serveur mail / les serveurs internes peuvent envoyer, pour les autres, on envoi un vrai faux 404
      # http://stackoverflow.com/questions/26369128/how-to-deny-with-404-on-nginx
      location = /fake-internal-404.html {
        internal; #return 404
      }
      location = /tickets.json {
        error_page 403 404 /fake-internal-404.html;
        # https://trac.nginx.org/nginx/ticket/633 : la ligne suivante ne fonctionne pas ..
    #    limit_except GET {
          #allow all;
          allow ipv4-adm-brest/23;
          allow ipv4-pub-brest/23;
          allow ipv4-adm-rennes/23;
          allow ipv4-pub-rennes/23;
          allow ipv6-adm-brest/64;
          allow ipv6-pub-brest/64;
          allow ipv6-adm-rennes/64;
          allow ipv6-pub-rennes/64;
          deny all;
    #    }
        try_files $uri @brimir;
      }
    
      location / {
        try_files $uri @brimir;
      }
    
      location @brimir {
        include                 uwsgi_params;
        uwsgi_modifier1   7;
        uwsgi_pass          unix:/run/uwsgi/brimir.sock;
      }
    
    }

Bonus :


tails ~ % cat /etc/nginx/sites-enabled/http-redirect.conf
server {
  listen        [::]:80 default_server;

  # http://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom
  return       301 https://$server_name$request_uri;
}
  1. On ajoute le site aux sites actifs : cd /etc/nginx/sites-enabled/ && ln -s ../sites-available/support.conf .

  2. On peut lancer ou relancer nginx

Réception de mail

L'envoi des mails à l'appli de support est très propre et fait simplement appel à cURL. Il faut mettre en place le script script/post-mail sur le serveur de mail (par exemple dans /srv/scripts/brimir/), puis modifier le fichier d'aliases (/etc/aliases) pour y ajouter :

brimir: "|/bin/sh /srv/scripts/brimir/post-mail https://support.resel.fr/tickets.json" 
support: brimir
inscription: brimir

et enfin recharger la base d'aliases postalias /etc/aliases puis recharger postfix pour un effet imémdiat service postfix reload.

Débug

On peut utiliser curl pour débuguer :

curl --data-urlencode message@- -v https://support.resel.fr/tickets.json <<EOF
Date: Tue, 7 Feb 2017 01:45:22 +0100 (CET)
From: stupid@resel.fr
To: support@resel.fr
Message-ID: <random_id@test>
Subject: coucou :)

Yo !

EOF

Quelques liens :