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.