Installer Kresus sur un Raspberry 3



  • Salouté,

    Voici un cht’y tuté sur celui de Phyks qui vous permet d’installer Kresus sur un Raspberry 3 en local.

    Prérequis :

    • Raspbian d’installer sur votre RPI
    • Accès SSH actif

    Préparation à l’installation de Kresus

    Installation de nodejs et yarn :

    Récupérer les repository et les installer avec les commandes suivantes

    curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
    sudo apt-get install -y nodejs
    
    curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
    sudo echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
    sudo apt-get update && sudo apt-get install yarn
    

    Installer Weboob

    Préparer l’installation de weeboob en ajoutant les outils suivants :

    sudo apt-get update && sudo apt-get install git python3-dev python3-pip libffi-dev libxml2-dev libxslt-dev libyaml-dev libtiff-dev libjpeg-dev libwebp-dev python3-pil python3-lxml autotools-dev automake autoconf libtool
    

    Installer la dernière version git de weboob

    git clone https://git.weboob.org/weboob/devel/ weboob
    cd weboob && sudo pip3 install .
    

    Ajouter une tache cron qui vous permet de garder weboob à jour

    crontab -e
    

    On ajoute la règle qui mettra à jour weboob tout les mois à 23h23 :magie:

    23 23  * *  * cd /home/pi/weboob && git pull origin master
    

    Créer un utilisateur kresus

    sudo adduser kresus --disabled-password
    
    sudo chsh kresus
    

    Utiliser l’utilisateur kresus

    sudo su kresus -s /bin/bash
    

    Installation de Kresus

    Récupérer et lancer l’installation de kresus

    cd && git clone https://framagit.org/kresusapp/kresus
    cd kresus && npm install prebuild && npm install
    

    Construisez la version de production

    NODE_ENV=production make build
    

    Tester si l’installation est fonctionnelle

    NODE_ENV=production KRESUS_PYTHON_EXEC=python3 KRESUS_WEBOOB_DIR=/usr/bin/weboob node bin/kresus.js
    

    Ajouter un service Kresus

    Créer une commande de lancement automatique de kresus

    sudo nano /etc/systemd/system/kresus.service
    

    Copier/coller le code ci-dessous

    [Unit]
    Description=Gestionnaire de finances personnelles
    After=network.target
    
    [Service]
    WorkingDirectory=/home/kresus/kresus
    Environment=NODE_ENV=production
    Environment=KRESUS_PYTHON_EXEC=python3
    Environment=KRESUS_WEBOOB_DIR=/home/pi/weboob
    ExecStart=/usr/bin/node bin/kresus.js
    
    Type=simple
    Restart=always
    
    User=kresus
    
    StandardOutput=journal
    StandardError=inherit
    SyslogIdentifier=kresus
    
    [Install]
    WantedBy=multi-user.target
    

    Relancer les daemon, Activer au démarrage et démarrer kresus

    sudo systemctl daemon-reload
    sudo systemctl enable kresus.service
    sudo systemctl start kresus.service
    

    Installer nginx

    sudo apt install nginx apache2-utils -y
    sudo systemctl enable nginx
    

    Editer le vhost nginx

    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            root /home/kresus/kresus/build/client;
    
            # Add index.php to the list if you are using PHP
            index index.html index.htm index.nginx-debian.html;
    
            server_name _;
    
            location / {
                # Only proxy the API calls
                location /api {
                        proxy_pass             http://127.0.0.1:9876;
                        proxy_set_header       Host $host;
                        proxy_set_header Proxy "";
    
                        # Longer timeouts on my (slow) Raspberry Pi
                        proxy_connect_timeout       300;
                        proxy_send_timeout          300;
                        proxy_read_timeout          300;
                        send_timeout                300;
                }
            }
    }
    

    Sécuriser Kresus

    Ajout d’une authentification d’accès

    Pour demander une authentification d’accès il vous suffit de créer un ou des utilisateur :

    sudo htpasswd -c /home/kresus/kresus/.htpasswd theworms
    

    Et d’ajouter ces lignes à votre configuration nginx

    ## Authentificates
            auth_basic "Private Area";
            auth_basic_user_file /home/kresus/kresus/.htpasswd;
    

    Restreindre l’accès

    Pour restreindre l’accès il vous suffit d’ajouter ces lignes à votre configuration nginx

    # Bloquer une ip
                #deny    192.168.1.1;
                # Autoriser une plage ip 192.168.1.0/24
                allow   192.168.1.0/24;
                # Bloquer tout le reste
                deny    all;
    

    Ajout d’un nom de domaine

    Après je vous conseil de créer un nom de domaine et d’éditer votre hosts

    sudo nano /etc/hosts
    

    Ajouter :

    192.168.1.3 mabanque.perso
    

    votre kresus est désormais accessible via le lien http://mabanque.perso

    Du coup vous devez activer votre fichier host et supprimer les anciens

    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mabanque.perso
    sudo ln -s /etc/nginx/sites-available/mabanque.perso /etc/nginx/sites-enabled/
    sudo rm /etc/nginx/sites-available/default
    sudo rm /etc/nginx/sites-enable/default
    

    Ensuite éditer votre configuration pour la mettre à jour:

    sudo nano /etc/nginx/sites-available/mabanque.perso
    

    modifier le début :

    server {
            listen 80;
            listen [::]:80;
    
            server_name mabanque.perso www.mabanque.perso;
    
    sudo systemctl restart nginx
    

    Mise en place d’un certificat SSL

    Pour ma part j’ai créé un certificat de 10 ans :oui:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
    

    Dès que vos clés sont générés, il vous faut renseigner nginx.
    vhost :

    # Forcer le https
    server {
    	listen  80;
    	listen	[::]:80;
    	server_name	mabanque.perso www.mabanque.perso 192.168.1.3; #Si accès IP renvoi sur ndd
    	return	301 https://$server_name$request_uri; #Redirection 
    }
    
    server {
    	listen 443 ssl http2;
            listen  [::]:443 ssl http2;
    
    	server_name mabanque.perso www.mabanque.perso;
    
    	root /home/kresus/kresus/build/client;
    		try_files $uri $uri/index.html @kresus;
    
            location / {
    		# Only proxy the API calls
    			location /api {
    				proxy_pass             http://127.0.0.1:9876;
    				proxy_set_header       Host $host;
    				proxy_set_header Proxy '';
    				proxy_redirect off;
    
    				client_max_body_size	8M;
    				proxy_connect_timeout       300;
    				proxy_send_timeout          300;
    				proxy_read_timeout          300;
    				send_timeout                300;
                }
    		# Block ip
    		#deny    192.168.1.1;
    		# Enable IP Range 192.168.1.0/24
    		allow   192.168.1.0/24;
    		# Deny  
    		deny    all;
            }
    
    	location /\.(css|js|png|jpe?g|svg|eot|woff2?)$ {
    		add_header Cache-Control 'max-age=2592000, must-revalidate, public';
    		gzip_types text/plain text/css application/javascript text/javascript;
    		gzip on;
    		try_files $uri $uri/index.html @kresus;
    	}
    
            ## Authentificates
            auth_basic "Private Area";
            auth_basic_user_file /home/kresus/kresus/.htpasswd;
    
    	## Certificates
            ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
            ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    
    	## Protocol
    	ssl_protocols TLSv1.2;
    
    	## Diffie-Hellman
    	ssl_ecdh_curve secp384r1;
    
    	## Ciphers
    	ssl_ciphers EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES;
    	ssl_prefer_server_ciphers on;
    
    	## TLS parameters
    	ssl_session_cache shared:SSL:10m;
    	ssl_session_timeout 5m;
    	ssl_session_tickets off;
    
    	## HSTS
    	add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";
    
            add_header x-xss-protection "1; mode=block";
            add_header x-frame-options "DENY";
            add_header X-Content-Type-Options "nosniff";
            add_header Content-Security-Policy "worker-src 'none'; object-src 'none'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; ";
            add_header Referrer-Policy "no-referrer";
    
    }
    

    Relancer nginx

    sudo systemctl restart nginx
    

    Valider le certificat

    [center]https_selfhosting2.png
    https_selfhosting1.png[/center]

    Et le tour est joué :ok:

    [center]kresus.png [/center]