Alojar Firefly III en un VPS administrado: sus finanzas en su propio servidor

Alojar Firefly III en un VPS administrado significa guardar sus cuentas, sus presupuestos y sus gastos en una máquina propia, que nuestros equipos mantienen actualizada y supervisan día y noche. Firefly III es un gestor de finanzas personales libre y de código abierto, con licencia AGPL. Esta guía sigue su documentación oficial: la instalación con Docker Compose, la APP_KEY, HTTPS, la primera cuenta, la tarea cron, la base de datos, el importador de datos, los correos electrónicos, las copias de seguridad y las actualizaciones.

Simon Vasconcelos Lee Por Publicado el 10 de noviembre de 202613 minutos de lectura

Todas las guías

Lo esencial

  1. La licencia AGPL-3.0-or-later permite ejecutar Firefly III libremente; si lo modifica, ofrece el código fuente de su versión a quienes la usan.
  2. Instálelo a partir de los tres archivos oficiales: docker-compose.yml, .env y .db.env. Elija la contraseña de la base de datos antes del primer arranque.
  3. APP_KEY tiene exactamente 32 caracteres, se mantiene en secreto y se guarda en las copias de seguridad junto con los datos.
  4. Detrás de un proxy inverso en HTTPS, indique TRUSTED_PROXIES=* y su dirección en APP_URL, y cree enseguida su cuenta: la primera persona que se registra se convierte en propietaria, y los registros se cierran a continuación.
  5. El servicio cron del archivo oficial ejecuta cada noche los presupuestos automáticos y las transacciones periódicas. Haga copia de la base, del volumen de archivos subidos y de .env antes de cada actualización.

Qué hace Firefly III

Firefly III es un gestor de finanzas personales pensado para el autoalojamiento. Registra sus gastos y sus ingresos, con presupuestos, categorías y etiquetas, para que vea adónde va su dinero. Su README lo describe como completamente autoalojado y aislado: no contacta con ningún servidor externo hasta que usted se lo indica de forma explícita.

Una sola instancia acoge a tantos usuarios como quiera, cada uno con una administración financiera totalmente separada de las demás. La documentación describe un modelo para compartir una misma administración, actualmente en desarrollo.

Lo que permite la licencia AGPL

Firefly III se publica bajo la GNU Affero General Public License, versión 3 o, a su elección, cualquier versión posterior: es el identificador SPDX AGPL-3.0-or-later de su archivo composer.json. El texto afirma un permiso ilimitado para ejecutar el programa sin modificar. Puede, por tanto, usar la imagen publicada por el proyecto para usted, su familia o su empresa, sin ninguna licencia que comprar.

El artículo 13 añade una condición propia de la AGPL: si modifica el programa, su versión debe ofrecer a todos los que la usan a distancia, por la red, el modo de obtener gratuitamente su código fuente. El importador de datos tiene la misma licencia.

La instalación con Docker Compose

La documentación presenta Docker Compose como la forma más sencilla de instalar Firefly III. En un servidor con Docker instalado, cree una carpeta y descargue en ella los tres archivos oficiales, en bruto: sus espacios cuentan, y la documentación pide no copiarlos desde el navegador.

Terminal
mkdir firefly-iii && cd firefly-iii
curl -o docker-compose.yml https://raw.githubusercontent.com/firefly-iii/docker/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/.env.example
curl -o .db.env https://raw.githubusercontent.com/firefly-iii/docker/main/database.env

Los ajustes que hay que cambiar antes del primer arranque

Genere dos cadenas de 32 caracteres con el comando que indica el archivo .env: una para la clave y otra para la contraseña de la base.

Terminal
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
.env, las líneas que hay que cambiar
SITE_OWNER=you@example.com
APP_KEY=
DB_PASSWORD=
APP_URL=https://finances.example.com
.db.env
MYSQL_PASSWORD=

Elija la contraseña de la base de datos antes del primer arranque. La base la guarda en su volumen en cuanto se crea: si la cambia después, deja de coincidir, y la FAQ de Docker solo ofrece una salida, eliminar los contenedores y los volúmenes y volver a empezar.

Un puerto publicado en local

El archivo oficial publica la aplicación en el puerto 80 de todas las direcciones del servidor. Para servirla en HTTPS detrás de un proxy inverso en la misma máquina, cambie esta única línea del servicio app:

docker-compose.yml, en el servicio app
ports:
  - 127.0.0.1:8080:8080
Terminal
docker compose -f docker-compose.yml up -d --pull=always
docker compose -f docker-compose.yml logs -f

En el primer arranque, el contenedor crea y migra la base de datos por sí mismo. Cuando termina la instalación, Firefly III le da las gracias en el registro por haberlo instalado: pase entonces al proxy inverso.

La documentación no da ninguna cifra de memoria; su FAQ de Docker sugiere PHP_MEMORY_LIMIT=512M o más si PHP se queda sin memoria. El tamaño depende del número de usuarios, del volumen de transacciones y del importador de datos. En un VPS administrado, descríbanos su uso y le recomendamos el tamaño adecuado.

HTTPS y el proxy inverso

Firefly III sirve la aplicación en HTTP por el puerto 8080 dentro del contenedor, y HTTPS reside en el proxy inverso colocado delante. La aplicación lee la cabecera X-Forwarded-Proto para saber que el visitante llegó en HTTPS, siempre que confíe en el proxy:

.env
TRUSTED_PROXIES=*

La FAQ de Docker es clara en este punto: sin TRUSTED_PROXIES=*, los enlaces se quedan en http, los formularios y los gráficos dejan de funcionar y fallan las cabeceras de seguridad CSP. Con el puerto publicado en 127.0.0.1, solo el proxy del propio servidor llega a la aplicación. Recree el contenedor después de cada cambio en el archivo .env:

Terminal
docker compose up -d --force-recreate app

Con Caddy

Caddy obtiene por sí mismo el certificado de Let’s Encrypt, y su directiva reverse_proxy establece por defecto las cabeceras X-Forwarded-For, X-Forwarded-Proto y X-Forwarded-Host:

Caddyfile
finances.example.com {
  reverse_proxy 127.0.0.1:8080
}

Con Nginx y Certbot

Este bloque sigue las cabeceras de la FAQ de instalación, y los búferes que esta sugiere contra los errores 502 cuando la aplicación devuelve un token en una cabecera larga. Escucha en el puerto 80 para que Certbot pueda instalar HTTPS:

Bloque Nginx
server {
    listen 80;
    listen [::]:80;
    server_name finances.example.com;

    client_max_body_size 64M;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 300s;
    }
}

Certbot instala después el certificado y se encarga de renovarlo:

Terminal
sudo certbot --nginx

La primera cuenta y los registros

La primera persona que se registra se convierte en propietaria de la instancia. Como medida de seguridad, los registros se cierran entonces por sí solos: la mayoría de la gente instala Firefly III solo para sí misma.

  1. Abra su dirección HTTPS en cuanto el proxy responda y cree su cuenta: recibe el rol de propietario.
  2. Active la doble autenticación en su perfil y guarde los ocho códigos de respaldo que muestra.
  3. Para abrir la instancia a otras personas, vaya a /settings, abra las opciones de configuración de Firefly III, desmarque la opción que desactiva los registros y guarde.

La tarea cron

Varias funciones solo se ponen en marcha con una tarea programada: los presupuestos automáticos, las transacciones periódicas, los avisos de suscripción y los tipos de cambio actualizados. La imagen Docker no ejecuta cron por sí misma; el archivo oficial añade para ello un pequeño servicio cron, que llama a la aplicación cada día a las 3 de la madrugada.

Se autentica con un token estático. Genere una tercera cadena con el mismo comando y colóquela en .env:

.env
STATIC_CRON_TOKEN=

Este token tiene exactamente 32 caracteres: el código de la versión 6.7.9 no acepta ninguna otra longitud. Este es el servicio tal como lo declara el archivo oficial; el doble $$ es intencionado y remite a las líneas TZ y STATIC_CRON_TOKEN del archivo .env:

docker-compose.yml, el servicio cron
cron:
  image: alpine
  restart: always
  container_name: firefly_iii_cron
  env_file: .env
  init: true
  command: ["sh", "-c", "apk add tzdata && \
    (ln -s /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \
    echo \"0 3 * * * wget -qO- http://app:8080/api/v1/cron/$$STATIC_CRON_TOKEN;echo\" \
    | crontab - && \
    exec crond -f -L /dev/stdout"]
  networks:
    - firefly_iii
  depends_on:
    - app

Una sola tarea basta para todos los usuarios de la instancia. Para comprobar que se ha ejecutado, lea el registro del contenedor: cada tarea informa en JSON, con job_fired y job_succeeded.

Terminal
docker logs firefly_iii_cron

Para lanzarla a mano, la FAQ de Docker pide pasar por el usuario www-data en lugar de root: la FAQ relaciona este error con problemas de permisos en los archivos de registro:

Terminal
docker exec --user www-data firefly_iii_core /usr/local/bin/php /var/www/html/artisan firefly-iii:cron --force

MariaDB, PostgreSQL o SQLite

El archivo oficial incluye MariaDB, con la imagen mariadb:lts. Firefly III admite también PostgreSQL y SQLite, que se eligen con DB_CONNECTION en .env:

BasePuesta en marchaCopia de seguridad
MariaDB o MySQLEl servicio db del archivo oficial; DB_CONNECTION=mysql, puerto 3306Una exportación con mariadb-dump, o el volumen de la base, con el servicio detenido
PostgreSQLDB_CONNECTION=pgsql, puerto 5432, la imagen postgres y las variables POSTGRES_* en .db.envUna exportación con pg_dump, o el volumen de la base, con el servicio detenido
SQLiteDB_CONNECTION=sqlite, sin servicio db, y un volumen montado en /var/www/html/storage/databaseEl volumen de la base, con el servicio detenido
.env (PostgreSQL)
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432

Para PostgreSQL, la documentación cambia además el servicio db a la imagen postgres, que instala PostgreSQL 18, y monta su volumen en /var/lib/postgresql. En .db.env, las variables MYSQL_* pasan a ser POSTGRES_USER, POSTGRES_DB y POSTGRES_PASSWORD.

Tome esta decisión antes de introducir sus primeras transacciones. La FAQ indica que pasar de una base de datos a otra sigue siendo posible, sin que Firefly III lo admita oficialmente, y que la exportación de la aplicación no se lleva todos los datos.

El importador de datos

El Firefly III Data Importer es una herramienta aparte, con su propia instalación y sus propias actualizaciones; su versión 2.3.5 salió el 23 de septiembre de 2026. Importa archivos CSV y CAMT.053, y puede también recuperar las transacciones de sus bancos a través de proveedores de datos externos, cada uno con sus propias condiciones.

El repositorio Docker oficial lo ofrece en un segundo archivo, docker-compose-importer.yml, que conserva los mismos servicios y añade importer. Sus ajustes van en un archivo .importer.env, tomado del .env.example del importador. Sírvalo con su propio nombre de dominio, con un puerto publicado en local y un segundo bloque de proxy: la FAQ pide no colocarlo en un subdirectorio.

.importer.env, las líneas que hay que cambiar
FIREFLY_III_URL=http://app:8080
VANITY_URL=https://finances.example.com
TRUSTED_PROXIES=*

Los correos electrónicos: la configuración SMTP

Por defecto, MAIL_MAILER=log escribe los mensajes en los registros en lugar de enviarlos. Para recibir las notificaciones, como los avisos de suscripción, configure el envío en .env. La documentación pide cambiar siempre MAIL_FROM y SITE_OWNER; de lo contrario, no saldrá ningún correo.

En un VPS de Simafri, el envío pasa por un relé SMTP autenticado, en el puerto 587: la dirección de una cuenta de correo que ya tenga, o Simafri Suite.

.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_FROM=finances@example.com
MAIL_USERNAME=finances@example.com
MAIL_PASSWORD=account_password
MAIL_ENCRYPTION=tls

Las copias de seguridad

Firefly III no incluye ninguna rutina de copia de seguridad: la documentación recomienda las herramientas del propio sistema, y precisa que la función de exportación de la aplicación no es una copia de seguridad. Con Docker, esto es lo que hay que conservar:

ElementoLo que guardaCopia de seguridad
La base de datos (firefly_iii_db)Cuentas, transacciones, presupuestos, reglas y usuariosObligatoria
Los archivos adjuntos (firefly_iii_upload)Los archivos adjuntos a las transaccionesObligatoria
.envLos ajustes, y sobre todo APP_KEYObligatoria, cifrada
.db.envLos accesos a la base de datosObligatoria, cifrada
docker-compose.yml y .importer.envSu versión de los archivos oficialesRecomendada

La base, con el servicio en marcha

Con MariaDB, mariadb-dump exporta la base sin detener el servicio; su opción --single-transaction ofrece una copia coherente de las tablas InnoDB sin bloquearlas. Ejecutado desde la carpeta del archivo Compose, el comando lee los accesos en el entorno del contenedor:

Terminal
docker exec firefly_iii_db sh -c 'mariadb-dump --single-transaction -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > firefly-$(date +%F).sql

Con PostgreSQL, la misma idea pasa por pg_dump:

Terminal
docker exec firefly_iii_db sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > firefly-$(date +%F).sql

Programe esta exportación en el servidor al menos una vez al día, y haga limpieza entre los archivos, que se acumulan.

Los volúmenes, con el servicio detenido

La documentación archiva cada volumen con un contenedor desechable. Docker Compose antepone a los nombres de los volúmenes el nombre del proyecto, que por defecto es el de la carpeta: compruebe los nombres exactos antes de lanzar el archivado.

Terminal, en la carpeta firefly-iii
docker volume ls
docker compose stop
docker run --rm -v "firefly-iii_firefly_iii_db:/tmp" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -czvf /backup/firefly_db.tar /tmp
docker run --rm -v "firefly-iii_firefly_iii_upload:/tmp" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -czvf /backup/firefly_upload.tar /tmp
docker compose start

Un nombre de volumen mal escrito no produce ningún error: Docker crea un volumen vacío con ese nombre y lo archiva, lo que sobrescribe la copia anterior. La documentación pide comprobar que el volumen existe antes de cada archivado.

Guarde una copia de .env y de estos archivos fuera del servidor, cifrada, ya que contiene la clave y los accesos a la base. Colocados en el disco del servidor, estos archivos entran también en sus copias de seguridad nocturnas.

Restaurar

La documentación restaura un volumen con el comando inverso, con el servicio detenido; el volumen de los archivos adjuntos se restaura del mismo modo:

Terminal
docker run --rm -v "firefly-iii_firefly_iii_db:/recover" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -xvf /backup/firefly_db.tar -C /recover --strip 1

Una exportación SQL se vuelve a cargar en la base en funcionamiento:

Terminal
docker exec -i firefly_iii_db sh -c 'mariadb -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < firefly-YYYY-MM-DD.sql

Restaure también .env con su APP_KEY, vuelva a arrancar y abra sus cuentas. La documentación lo repite tras cada método: lo primero que hay que hacer con una copia de seguridad es restaurarla, para comprobar que funciona.

Las actualizaciones y las migraciones

Firefly III se actualiza por sí mismo, incluso desde versiones tan antiguas como la 4.7, y migra su base de datos al arrancar el contenedor. La documentación advierte de que algunas actualizaciones eliminan o depuran datos, y pide una copia de seguridad de la base y de los volúmenes antes de cada una, sobre todo entre versiones mayores. Desde la carpeta del archivo Compose:

Terminal
docker compose stop
docker compose pull
docker compose -f docker-compose.yml up -d --remove-orphans

El importador se actualiza del mismo modo, con docker compose rm -f entre la parada y la descarga de las imágenes, según su documentación.

Quién hace qué en un VPS administrado

El autoalojamiento exige mantener el servidor además de la aplicación. En un VPS administrado, nuestros equipos se encargan del servidor y siguen su instancia de forma proactiva; Firefly III sigue siendo su software, con sus ajustes y sus datos financieros.

TemaNuestros equiposUsted
El servidorActualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidasEl momento que mejor convenga a su actividad
La supervisiónServidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamadaLa lectura de los registros de su instancia
Firefly IIISeguimiento proactivo: errores, lentitud, tarea cron y espacio en disco detectados, corrección recomendadaSu instalación, sus actualizaciones y sus ajustes, que aplica usted o su asistente de IA
Las cuentas y los datosEl servidor que los soporta, vigilado y con copias de seguridadLos usuarios, la doble autenticación, el importador de datos y sus proveedores de datos
Las copias de seguridadCada noche, cifradas y guardadas fuera de la máquina; restauración incluidaLas exportaciones propias de Firefly III, y la petición de restauración, cuando la necesite
La migraciónSu servidor actual migrado, gratisEl momento del cambio

Si prefiere que nuestros equipos intervengan en la propia aplicación, ese servicio se factura por horas o a precio cerrado, con un presupuesto comunicado antes de la intervención.

Firefly III, en un servidor que cuidamos por usted

Con un VPS administrado de Simafri, nuestros equipos mantienen actualizado el servidor de su instancia de Firefly III, lo vigilan día y noche e intervienen sin esperar su llamada; también siguen su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted o su asistente de IA. Las copias de seguridad se cifran cada noche y se guardan fuera de la máquina, su restauración está incluida, y la migración de su servidor actual es gratuita.

Descubrir los VPS administrados

Preguntas frecuentes

¿Firefly III es gratuito?

Sí. Firefly III tiene licencia AGPL-3.0-or-later: puede ejecutarlo para usted, su familia o su empresa sin ninguna licencia que comprar. Si lo modifica, su versión debe ofrecer su código fuente a quienes la usan por la red. Queda el coste del servidor que lo ejecuta.

¿Cómo instalar Firefly III con Docker Compose?

Descargue los tres archivos oficiales, docker-compose.yml, .env y .db.env. Defina una APP_KEY de 32 caracteres y la misma contraseña en DB_PASSWORD y MYSQL_PASSWORD, antes del primer arranque, y ejecute docker compose up -d. Coloque después delante un proxy inverso en HTTPS.

¿Para qué sirve APP_KEY en Firefly III?

APP_KEY es la clave de cifrado de las sesiones. Tiene exactamente 32 caracteres, sin caracteres especiales como = o #, y se mantiene en secreto. La documentación pide guardarla en la copia de seguridad junto con los volúmenes: forma parte de lo necesario para restaurar una instancia.

¿Por qué los enlaces de Firefly III se quedan en http detrás de un proxy?

La FAQ de Docker indica que falta TRUSTED_PROXIES=* en el archivo .env: sin esa línea, Firefly III ignora la cabecera X-Forwarded-Proto del proxy, los enlaces se quedan en http y los formularios y los gráficos dejan de funcionar. Indique también su dirección pública en APP_URL.

¿Cómo configurar la tarea cron de Firefly III con Docker?

El archivo Compose oficial incluye un servicio cron que llama a la aplicación cada día a las 3 de la madrugada. Defina en .env un STATIC_CRON_TOKEN de exactamente 32 caracteres y reinicie el conjunto. Una sola tarea sirve a todos los usuarios de la instancia.

¿Cómo abrir Firefly III a varios usuarios?

La primera persona que se registra se convierte en propietaria, y los registros se cierran a continuación. La propietaria los vuelve a abrir en /settings, en las opciones de configuración de Firefly III. Cada usuario conserva después una administración financiera separada de las demás.

¿Cómo hacer copia de seguridad de Firefly III?

Haga copia de la base de datos, con una exportación mariadb-dump o pg_dump, del volumen de los archivos adjuntos y de los archivos .env y .db.env, cifrados. La función de exportación de la aplicación no es una copia de seguridad. Pruebe la restauración justo después de la primera copia.

¿Un VPS administrado cubre Firefly III?

Un VPS administrado cubre el servidor: sistema, seguridad, supervisión y copias de seguridad. Nuestros equipos siguen también su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted. Una intervención en la aplicación se factura por horas o a precio cerrado.

Fuentes y documentación oficial

Contáctenos