finanzas.home

17 Mar

Las cuentas de casa, en casa.

Tiempo hacía que le tenía ganas al programa. Y tiempo hacía que había intentado instalarlo medio en serio, medio en pruebas, pero que abandonaba porque hay aplicaciones que necesitan un entorno más complejo de lo que uno pensaba.

Pero un artículo en el blog de El atareao me ha hecho pensar en que podía hacerlo de manera sencilla. Y a ello me he puesto, a ver si al menos consigo ponerlo en marcha.

¿ El programa ? Ah, se llama Firefly III, y está hecho por James Cole muy a su manera. Manera que coincide con la mía y por eso le tenía tantas ganas.

Instalación

He optado por la instalación vía docker porque el programa está hecho en PHP y requiere la versión 7.4 que, obviamente, aún no está en Debian. Empiezo a estar mosqueado con lo de los contenedores porque a la mínima la situación se desmadra y lo que parece fácil se convierte en infernal. Y eso que todo el mundo te dice, machaconamente, que levantas el contenedor en cinco segundos. Técnicamente tienen razón, son segundos escasos, pero no te cuentan el resto, que es lo que más tiempo y más frustración se acumula.

Los ajustes que he realizado en la red de casa son:

  • DNS: crear una entrada para el servidor virtual: finanzas.home.
  • Dependencias:
    • Docker
    • PostgreSQL (porque el programa puede)
    • Apache2 con funciones de proxy
  • Instalación del contenedor
  • Instalación del motor de base de datos: incluyendo base de datos para el programa, usuario y credenciales de acceso
  • Creación de servidor virtual para http://finanzas.home (de momento sin conexión cifrada)
  • Puesta en marcha del tinglado

Detalles a tener en cuenta

Como todo contenedor, éste debe ser efímero. Cualquier información que quiera ser conservada o bien está en un servidor al que tenga que acceder (de base de datos o de lo que sea) o hay que emplear volúmenes y el mecanismo de docker para enlazarlos con el contenedor.

En el caso de Firefly III los volúmenes que conviene crear son los siguientes:

  • upload: /var/www/html/storage/upload
  • export: /var/www/html/storage/export

El resto está muy bien descrito en la documentación del programa empleando docker, incluyendo qué hay que hacer para crear copias, por lo que no voy a añadir si acaso algún detalle.

Gestionando el contenedor

Se supone que los contenedores están hechos para que hagan una única cosa. En el momento en el que tienes varios actuando juntos o que se necesitan para un todo es mejor emplear cosas como docker-compose. En caso contrario y dados los problemas que tiene docker para actúar conjuntamente con systemd (existe incluso un software puente expreso) llegas a la conclusión de que es mejor un pequeño script hecho en bash para ponerlo en marcha y detenerlo.

Una versión de este script la mantengo actualizada en mi repositorio: https://git.astillas.net/firefly-tools.git

#!/usr/bin/env bash

# Variables
VERSION=0.2
OPERATION=${1:-status}
ENVFILE=${2:-/etc/firefly_iii/environment}

# Parámetros para docker
firefly_name="firefly"
firefly_image="jc5x/firefly-iii:latest"
firefly_ports="-p 8080:8080"
firefly_volumes="-v firefly_iii_upload:/var/www/html/storage/upload \
 -v firefly_iii_export:/var/www/html/storage/export"
firefly_env=${ENVFILE}

# Funciones 
_log() {
 local msg="$*"
 echo "${msg}"
}
_die() {
 local msg="$*"
 echo "$(basename $0): ERROR ${msg}" >&2
 exit 1
}
_docker_run() {
 local op=$1
 case ${op} in 
 start)
 docker run --env-file ${firefly_env} --name ${firefly_name} \
 --rm true \
 ${firefly_volumes} \
 ${firefly_ports} \
 ${firefly_image}
 if [ $? -ne 0 ]; then
 _die "no he podido poner en marcha el contenedor ${firefly_image}"
 fi
 ;;
 stop)
 docker stop --name ${firefly}
 if [ $? -ne 0 ]; then
 _die "no he podido detener el contenedor ${firefly_image}"
 fi
 ;;
 esac
}
_docker_status() {
 running=$(docker ps -q | egrep ${firefly_name})
 if [ -z "${running}" ]; then 
 return 1
 else
 return 0 
 fi
}
_check_volumes() {
 upload=$(docker volume ls -q | egrep firefly_iii_upload)
 if [ -z "${upload}" ]; then 
 docker volume create firefly_iii_upload || \
 _die "no puedo crear el volumen firefly_iii_upload"
 fi
 exports=$(docker volume ls -q | egrep firefly_iii_exports)
 if [ -z "${exports}" ]; then 
 docker volume create firefly_iii_exports || \
 _die "no puedo crear el volumen firefly_iii_exports"
 fi
}

# Comprobamos el archivo de configuración
if [ -z "${ENVFILE}" ]; then 
 _die "el archivo de configuración en está definido"
fi
if [ ! -r "${ENVFILE}" ]; then 
 _die "no tengo acceso al archivo de configuración ${ENVFILE}"
fi

# Según la operación 
case ${OPERATION} in 
start)
 _check_volumes
 _docker_run "start"
 ;;
stop)
 _docker_status
 if [ $? -eq 0 ]; then
 _docker_run "stop"
 else
 _die "${firefly_name} is not running"
 fi
 ;;
status)
 _docker_status
 if [ $? -ne 0 ]; then 
 _log "${firefly_name} is not running"
 else
 _log "${firefly_name} is running" 
 fi
 ;;
*)
 _die "${OPERATION} no es una operación reconocida"
 ;;
esac

Servidor virtual en apache2

Se emplea el módulo proxy de apache y la configuración, sin certificado digital porque estoy en una red doméstica, sería la siguiente:

<VirtualHost    *:80>
        ServerName      finanzas.home
        ServerAdmin     root@home

       LogLevel info
       ErrorLog        /var/log/apache2/finanzas.home/error.log
       CustomLog       /var/log/apache2/finanzas.home/access.log combined

        ProxyPreserveHost On 
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Y ahora a emplearlo

He visto que existe una aplicación para Android que es capaz de conectarse (incluyendo certificados autofirmados) y un buen puñado de páginas de referencia de uso. Cuando empiece a usarlo en serio volveré a escribir sobre ello.

Referencias