Bilancio online con Gnucash + MySQL + SSH
Gnucash è un’ottimo strumento per tenere un bilancio familiare, e dalla versione 2.4.0 supporta il collegamento ad un database SQLite, MySQL o PostgreSQL per l’archiviazione dei dati. Usando un database locale sono tuttavia legato ad un computer specifico per il suo utilizzo. Io voglio invece poter aprire una sessione di Gnucash da qualsiasi computer e collegarmi sempre ad un’unica base dati remota.
Aprire il database alla rete è decisamente poco sicuro, ma un tunnel SSH mi offre una alternativa leggera e affidabile. Per implementare il tutto ho usato:
Lato server:
Lato client:
Tutti questi software girano indifferentemente su piattaforme Linux, Windows e Mac, il che offre un’ampia flessibilità. Per me che ho a casa un server Linux collegato alla rete il tutto è stato molto semplice, ma non escludo che anche un hosting non troppo costoso offra un supporto sufficiente per implementare il tutto.
Server
La configurazione del server SSH non richiede niente di particolare, se non assicurarsi che il firewall sia correttamente configurato per permettere l’accesso alla porta 22, o qualunque altra voi abbiate impostato. Se volete una sicurezza maggiore consiglio di usare un’autenticazione tramite chiavi, come descritto qui.
Il prossimo passo è creare il database e l’utente che dovrà utilizzarlo. Dato che creeremo un tunnel SSH è anche possibile usare phpMyAdmin da remoto come spiegato ad esempio https://shallop.com/2011/04/howto-use-phpmyadmin-to-remote-admin-mysql-dbs-via-ssh-tunnel/, ma la procedura è così semplice che io decido di farlo da terminale. Dopo aver ottenuto l’accesso al server la sequenza è la seguente:
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4012
Server version: 5.1.49-3 (Debian)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database gnucash;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on gnucash.* to gnucash@localhost identified by 'PASSWORD' with grant option;
Query OK, 0 rows affected (0.12 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.13 sec)
mysql> exit
Bye
#
Il che significa che, dopo aver ottenuto l’accesso come utente root a mysql creo il database gnucash e con il comando GRANT creo direttamente l’utente gnucash, gli assegno i permessi per l’uso del datatbase e imposto la PASSWORD di accesso. Nella documentazione di Gnucash non ho trovato nulla riguardo i permessi necessari all’utente per l’utilizzo del programma, quindi li assegno tutti, anche se probabilmente è possibile limitarli e migliorare la sicurezza dell’accesso.
Client
Prima di avviare Gnucash su un qualsiasi client è necessario creare il tunnel SSH, che si esegue abbastanza semplicemente su qualsiasi piattaforma.
OpenSSH Client (Linux e Mac)
Da un terminale si digita:
ssh -L 3307:localhost:3306 -i /media/USB/private.key utente@miosito.com
l’opzione -i specifica la posizione della chiave privata per l’autenticazione, se necessaria, che io tengo nella chiavetta USB, mentre con l’opzione -L creo il tunnel fino al mio server che si trova in miosito.com, specificando tre parametri:
3307 è la porta locale a cui mi dovrò collegare per entrare nel tunnel
localhost è l’indirizzo dove è disponibile il server MySQL. Dato che il mio tunnel “esce” sulla stessa macchina l’indirizzo è localhost.
3306 è la porta alla quale collegarmi per accedere al server MySQL
Putty (Windows)
Nella finestra di configurazione di Putty inserisco i seguenti dati:
Session: inserisco l’host name, miosito.com, e la porta del server SSH, 22 o altro.
Connection->Data: in Login details posso inserire il nome utente per il collegamento SSH, per evitare che mi venga chiesto ogni volta.
Connection->SSH->Auth: specifico la posizione del file contenente la private key per l’autenticazione, se necessaria.
Connection->SSH->Tunnels: in source port inserisco la porta locale di accesso, e in destination inserisco l’indirizzo del server MySQL e la porta di destinazione con la sintassi localhost:3306
Prima di aprire la connessione ho la possibilità, ritornando alla finestra Session, di salvare i parametri della sessione per poterli richiamare senza reinserirli nuovamente. Clicco su Open e dopo aver inserito la password il prompt del terminale mi indicherà che il tunnel è attivo.
Gnucash
Ora posso lanciare Gnucash e aprire un nuovo file indicando come formato dei dati mysql, come host la macchina da cui abbiamo aperto il tunnel e la porta di accesso, nel nostro caso 127.0.0.1:3307, il nome del database, gnucash, il nome dell’utente MySQL, gnucash, e la PASSWORD di accesso. Il programma crea in autmatico tutte le tabelle necessarie a seconda della struttura dei conti da noi indicata.
Come nome di host ho indicato l’indirizzo IP perchè su macchine Linux, per motivi che ignoro, se indico localhost:3307 mi viene restituito un errore e il collegamento abortisce. Su macchine Windows funzionano entrambe le sintassi.
Sono pronto ora per inserire i dati. Ogni volta che vorrò modificarli da qualsiasi posto mi trovi sarà sufficiente aprire il tunnel e da Gnucash aprire il file esistente inserendo gli stessi parametri sopra indicati.
Se utilizzate una chiave privata è sconsigliabile sparpagliarla su tutte le macchine dove lavorate, mentre è pratico e abbastanza sicuro tenerla su una chiavetta USB dove può trovare posto anche Putty, che non necessita di installazione e occupa pochissimo spazio.
Auguro un buon pareggio di bilancio a tutti 🙂