Kresus, un gestionnaire Web de finances personnelles

Vous connaissez peut-être déjà Cozy, si ce n'est pas le cas, il s'agit une application Web de cloud personnel. Et parmi les applications qu'elle propose, il y a Kresus qui permet de centraliser ses relevés bancaires, etc. J'aime beaucoup le principe de cette application, car ça me permet d'éviter d'aller me connecter sur le site de ma banque à chaque fois, puis ça me permet de centraliser les informations de mes différents comptes à un seul endroit.

Kresus

Sauf que j'ai déjà un ownCloud et que je ne peux pas le remplacer par Cozy, parce que déjà j'en suis très content, et ensuite je n'en suis pas le seul utilisateur. Cozy étant mono-utilisateur, ça ne fera pas l'affaire…

Eh bien bonne nouvelle, Kresus peut fonctionner en mode standalone, sans Cozy ! Voici donc comment faire.

Pré-requis

On va avoir besoin de NodeJS, pour ma part j'utilise les dépôts de NodeSource pour avoir une version à jour sur ma Debian :

curl -sL https://deb.nodesource.com/setup_4.x | bash -  
apt install nodejs  
npm install -g npm  

On installe quelques outils nécessaire à l'installation de Kresus :

apt install git build-essential python-dev libffi-dev libxml2-dev libxslt-dev libyaml-dev libjpeg-dev libyaml-dev python-virtualenv  

Installation Kresus

Pour l'installation de Kresus, on va lui créer un utilisateur dédié, on va cloner le dépôt Git dans son répertoire ~/app et après s'être placé dans celui-ci on va lancer l'installation des dépendances :

adduser kresus --disabled-password --gecos Kresus  
su - kresus  
mkdir ~/app ~/www ~/logs  
git clone https://github.com/bnjbvr/kresus.git ~/app  
cd ~/app  
npm install  

On teste le lancement de Kresus, en paramétrant la variable d'environnement KRESUS_DIR avec l'emplacement où on a cloné le projet.

export KRESUS_DIR=/home/kresus/app  
node ~/app/bin/kresus.js  

Si tout va bien, l'installation a du se finaliser et les messages de la console devraient se terminer par :

[2016-03-18 19:49:21:873] info - init | Server is ready, let's start the show!

Lancement au démarrage

On va donc créer un service systemd à notre instance de Kresus, afin que celle-ci puisse se lancer tout seul au démarrage du serveur. Pour ceci on créer un fichier /etc/systemd/system/kresus.service :

[Unit]
Description=Personal finance manager  
After=network.target

[Service]
WorkingDirectory=/home/kresus/app  
Environment=NODE_ENV=production  
Environment=KRESUS_DIR=/home/kresus/app  
ExecStart=/usr/bin/node bin/kresus.js

Type=simple  
Restart=always

User=kresus

StandardOutput=journal  
StandardError=inherit  
SyslogIdentifier=kresus

[Install]
WantedBy=multi-user.target  

On active notre nouveau service, on le lance, et on vérifie son état pour être sûr que tout va bien :

systemctl enable kresus  
systemctl start kresus  
systemctl status kresus  

Configuration de Apache

Je pars du principe que vous avez déjà un Apache fonctionnel, avec du HTTPS, où il n'y aurait plus qu'à activer le module de proxy.

a2enmod proxy_http  

À noter qu'il nous faut également ajouter une couche d'authentification, car initialement Kresus repose sur le mécanisme de connexion de Cozy. Je ne sais pas vous, mais moi ça m'enchante pas spécialement de laisser mes relevés bancaires à la vue de tous.

On créer donc un fichier .htpasswd avec, par exemple, l'utilisateur myusername.

htpasswd -c /home/kresus/.htpasswd myusername  

Ensuite on créer le VirtualHost pour notre Kresus, dans le fichier /etc/apache2/sites-available/kresus.conf par exemple. Voici à quoi ressemble le mien, utilisant Let's Encrypt comme autorité de certification :

<VirtualHost *:80>  
    ServerName  kresus.example.net
    ServerAdmin me@example.net

    DocumentRoot /home/kresus/www

    Alias /.well-known/acme-challenge /home/kresus/www/.well-known/acme-challenge

    <Directory /home/kresus/www/.well-known/acme-challenge>
        AllowOverride All
        Require all granted
    </Directory>

    Redirect permanent / https://kresus.example.net/

    ErrorLog  /home/kresus/logs/error.log
    CustomLog /home/kresus/logs/access.log combined
</VirtualHost>

<IfModule mod_ssl.c>  
    <VirtualHost *:443>
        ServerName  kresus.example.net
        ServerAdmin me@example.net

        ProxyPass        "/" "http://127.0.0.1:9876/"
        ProxyPassReverse "/" "http://127.0.0.1:9876/"

        DocumentRoot /home/kresus/www

        Alias /.well-known/acme-challenge /home/kresus/www/.well-known/acme-challenge

        <Directory /home/kresus/www/.well-known/acme-challenge>
            AllowOverride All
            Require all granted

            AuthType None
            Satisfy Any
        </Directory>

        <Location />
            AuthUserFile  /home/kresus/.htpasswd
            AuthName      "Authentification"
            AuthType      Basic
            Require       valid-user
        </Location>

        SSLEngine on

        SSLCertificateKeyFile /etc/letsencrypt/live/kresus.example.net/privkey.pem
        SSLCertificateFile    /etc/ssl/certs/kresus.example.net.pem
        SSLCACertificateFile  /etc/ssl/certs/ca-certificates.crt

        Header always set Strict-Transport-Security "max-age=15768000"

        <FilesMatch "\\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>

        ErrorLog  /home/kresus/logs/error.log
        CustomLog /home/kresus/logs/access.log combined
    </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Et pour terminer il n'y a plus qu'à activer notre site et relancer Apache :

a2ensite kresus  
systemctl restart apache2  
Vus : 1064
Publié par Nicolas KAROLAK : 5