Por qué autoalojar su presupuesto en lugar de usar YNAB
El método de los sobres es simple: asigne cada suma que entra a una categoría con nombre (alquiler, alimentación, ahorro, fondo de emergencia) antes de gastarla. Cuando una categoría se agota, o deja de gastar, o transfiere conscientemente dinero desde otro sobre. YNAB popularizó este enfoque en una aplicación cuidada, pero cuesta 99 $ al año, almacena sus datos financieros en sus servidores y no puede auditarse. Actual Budget reproduce el método (incluida la famosa flexibilidad «roll with the punches», que permite adaptarse a los imprevistos) con todo el código fuente en GitHub bajo licencia MIT. Autoalojarlo en un VPS significa que sus transacciones, sus saldos y el historial de su presupuesto nunca salen de su infraestructura, y que el coste anual se reduce al de un VPS pequeño.
Desplegar Actual Budget con Docker en dos minutos
Actual se presenta como una única imagen Docker: sin servidor de base de datos, sin message broker, sin archivos de configuración. Un contenedor, un volumen, un puerto. En su VPS con Ubuntu 22.04, ejecute: docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-server. El servidor está listo en menos de dos segundos, en el puerto 5006. Abra http://<ip-de-su-vps>:5006 en un navegador, haga clic en «Crear un nuevo presupuesto» y ya puede gestionar su presupuesto. Toda la base de datos SQLite se almacena en el volumen Docker actual-budget: respáldela con un solo comando docker run --rm -v actual-budget:/data alpine tar -czf - /data. La carpeta montada en /data contiene dos subcarpetas, server-files y user-files: ahí vive todo el estado del servidor. Para un despliegue duradero, prefiera un archivo docker-compose.yml (la documentación oficial remite al del repositorio, packages/sync-server/docker-compose.yml) e inícielo con docker compose up --detach.
Lo que obtiene de entrada
- Presupuesto de base cero por sobres: asigne cada suma a una categoría antes de gastarla; Actual señala los excesos en tiempo real.
- Sincronización multidispositivo: teléfono, tableta y ordenador comparten el mismo presupuesto en directo a través del servidor cifrado.
- Cifrado de extremo a extremo opcional: una vez activado en los ajustes, el servidor solo almacena texto cifrado; sus transacciones solo son legibles en sus dispositivos.
- Sincronización bancaria opcional: Enable Banking (bancos europeos, función experimental), SimpleFIN Bridge (América del Norte), Akahu (Nueva Zelanda) o Pluggy.ai (Brasil); según la documentación, GoCardless ya no acepta cuentas nuevas. La importación manual de archivos OFX/QFX/CSV sigue disponible.
- Informes: curva de patrimonio neto, flujo de caja, gastos por categoría e informes totalmente personalizados.
- Importación de YNAB 4 y nYNAB: migre todo su historial en unos cinco minutos.
Requisitos cuantificados para Actual Budget
Actual es uno de los servicios más ligeros de alojar. En cuanto a la máquina: un VPS de 1 GB de RAM con Ubuntu 22.04 es más que suficiente, ya que la aplicación consume del orden de 80 MB en reposo (compruébelo en su instancia con docker stats). En cuanto a la red: un nombre de dominio, un registro DNS que apunte al VPS y los puertos 80 y 443 abiertos para el proxy inverso; el puerto 5006 puede quedar cerrado al público una vez instalado Caddy. En cuanto a las cifras del propio servidor: el puerto por defecto es el 5006, la carpeta de datos es /data (variable ACTUAL_DATA_DIR) y los envíos de archivos están limitados por defecto a 20 MB para la sincronización y a 50 MB para la sincronización cifrada. Un presupuesto muy antiguo o voluminoso puede superar esos umbrales; el restablecimiento de la sincronización comprime entonces el historial. Para la sincronización bancaria, añada una cuenta en el proveedor elegido, sus claves de API y, para Enable Banking, una aplicación de tipo Production cuya URL de redirección use HTTPS.
Añadir HTTPS para sincronizar desde cualquier lugar
Para acceder a su presupuesto desde fuera del VPS —en el móvil o desde otro país— necesita HTTPS. La vía más sencilla es Caddy. Instálelo en el mismo VPS y añada un Caddyfile de una sola línea: budget.su-dominio.com { reverse_proxy localhost:5006 }. Caddy gestiona automáticamente el certificado Let’s Encrypt. Una vez que el dominio resuelva, abra https://budget.su-dominio.com en su teléfono, pulse el botón «Añadir a la pantalla de inicio» del navegador y Actual se convierte en un verdadero icono PWA en su pantalla de inicio. Todo el tráfico de sincronización entre sus dispositivos y el servidor pasa por ese canal TLS. No es solo una comodidad. Actual necesita un contexto seguro para activar SharedArrayBuffer, que utiliza su motor SQLite: sin HTTPS, la aplicación se niega a arrancar en el navegador. La documentación oficial cita tres causas de este bloqueo: la ausencia de HTTPS, cabeceras Cross-Origin-Embedder-Policy y Cross-Origin-Opener-Policy mal definidas, o un navegador demasiado antiguo. Con el servidor por defecto actual-server, esas dos cabeceras ya se envían; si pasa por Nginx, no las duplique (véase la resolución de problemas más abajo). La sincronización bancaria añade un segundo motivo: la URL de redirección registrada en el proveedor debe usar https.
Instalación en seis pasos
Crear un VPS (1 GB de RAM, Ubuntu 22.04)
Actual consume menos de 80 MB de RAM en reposo. Incluso el plan VPS más pequeño le deja un amplio margen.
Desplegar el contenedor
docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-serverCrear su presupuesto
Abra el puerto 5006 en un navegador, haga clic en «Crear un nuevo presupuesto» y añada sus cuentas bancarias con sus saldos de apertura.
Configurar las categorías de sobres
Cree categorías (Vivienda, Alimentación, Transporte, Ahorro…) y reparta entre ellas sus ingresos mensuales previstos.
Asegurar con HTTPS
Instale Caddy, añada
budget.su-dominio.com { reverse_proxy localhost:5006 }a su Caddyfile y luego recargue.Instalar en el móvil
Abra la URL HTTPS en su teléfono y use «Añadir a la pantalla de inicio»: Actual Budget se convierte en un icono PWA.
Sincronización bancaria: Enable Banking, una función experimental
La documentación oficial de Actual enumera Enable Banking entre sus proveedores de sincronización, para bancos europeos, y la califica de función experimental: puede tener errores, carencias, documentación incompleta y ser retirada en una versión futura. También puede no figurar en la última versión estable; la página aconseja activar las funciones experimentales y usar las imágenes nightly para la implementación más reciente. Los comentarios de los usuarios se centralizan en la incidencia n.º 7799 de GitHub (abierta en mayo de 2026, etiquetada «experimental feature», todavía abierta cuando la revisamos). No contiene ninguna lista de bancos garantizados: le corresponde comprobar, en el asistente de Actual, que su país y su banco aparecen, y probar con una sola cuenta antes de fiarse. Recuerde también que las claves del proveedor viven en su servidor: un VPS bien reforzado y copias de seguridad protegidas forman parte del dispositivo.
Configurar Enable Banking en Actual en cinco pasos
Crear la aplicación en Enable Banking
Inicie sesión en su cuenta de Enable Banking, cree una nueva aplicación y elija el tipo Production.
Declarar la URL de redirección en HTTPS
Use su dominio seguido de
/enablebanking/auth_callback, por ejemplohttps://budget.example.com/enablebanking/auth_callback, y pulse Register. El esquema debe serhttps.Vincular sus cuentas en Enable Banking
Vincule primero las cuentas deseadas en la interfaz de Enable Banking; de lo contrario, advierte la documentación, no verá ni la lista de bancos ni la de cuentas en Actual.
Introducir el identificador de aplicación y la clave
Copie el Application ID (con el formato
12345678-1234-1234-1234-123456789012) sin espacios antes ni después. En Actual: More → Bank Sync → Set up Enable Banking, pegue el identificador y aporte el archivo de clave privada.pem.Vincular una cuenta de Actual a su banco
En una cuenta de Actual, elija Link account → Enable Banking, seleccione su país y su banco y siga la autorización en el banco. Compruebe las primeras transacciones importadas antes de pasar a otra cuenta.
Cómo respaldar su presupuesto
Todos los datos residen en el volumen Docker actual-budget. Una copia de seguridad cron diaria cabe en un solo comando: docker run --rm -v actual-budget:/data -v /backups:/out alpine tar czf /out/actual-budget-$(date +%Y%m%d).tar.gz /data. Para restaurar, descomprima el archivo tar en un volumen nuevo antes de arrancar el contenedor. Actual dispone además de una exportación integrada: desde Ajustes, en la sección Datos, pulse «Export data». Eso crea un ZIP portable de todo su presupuesto, que puede importar en cualquier otra instancia de Actual. Dos precisiones. Primero, ese volumen contiene también las credenciales de sincronización bancaria: la documentación indica que se almacenan en el servidor, fuera del cifrado de extremo a extremo, de modo que cualquiera con acceso a la base de datos puede leerlas. Trate el archivo como un secreto: permisos restringidos y una copia cifrada fuera del VPS. Segundo, tras una restauración, la documentación recomienda un restablecimiento de la sincronización (Ajustes → Avanzado → Reset Sync), hecho desde el dispositivo con los cambios más recientes, para que la copia no se resincronice hacia su estado anterior. Pruebe una restauración completa en una instancia desechable al menos una vez: una copia que nunca se ha restaurado sigue siendo una hipótesis.
Cifrado de extremo a extremo: qué cubre y qué no cubre
El cifrado de extremo a extremo de Actual es opcional. Para activarlo, abra el presupuesto, vaya a los ajustes, sección Cifrado, pulse «enable encryption» y elija una contraseña: una clave derivada de ella cifra sus datos antes de que salgan del dispositivo. Algunos puntos que conviene conocer antes de pulsar. Es irreversible: no se puede desactivar, y volver a un archivo sin cifrar pasa por una copia de seguridad y una restauración. Si pierde la contraseña, la documentación es clara: sus datos cifrados son irrecuperables, salvo que conserve una copia local, con la que puede restablecer la clave. Cada dispositivo nuevo debe introducir esa contraseña una vez, y debe ser distinta de la contraseña del servidor. La activación exige un restablecimiento de la sincronización, y el cifrado supone una ligera ralentización al sincronizar. Por último, solo cubre los datos del presupuesto: las claves de sincronización bancaria permanecen en el servidor y los datos locales del dispositivo no están cifrados, de ahí el interés de cifrar el disco.
Actualizar Actual sin perder sus datos
Actualizar consiste en sustituir la imagen, no los datos. Con Docker Compose: docker compose pull && docker compose up -d. Con el comando docker run de esta guía, la documentación describe tres gestos: docker stop, luego docker container rm sobre el contenedor y, por último, el mismo docker run relanzado con --pull=always. Mientras se conserve el volumen actual-budget, el presupuesto sobrevive a la sustitución del contenedor. Antes de cada actualización, haga la copia de seguridad de la sección anterior; es especialmente cierto si usa una imagen nightly para probar la sincronización bancaria, pues la documentación recomienda copiar antes de probar esa rama. Una trampa conocida: al volver de una imagen nightly a una etiqueta estable puede aparecer «This budget cannot be loaded with this version of the app»; la página de restauración remite entonces a una migración manual de SQLite, que conviene no improvisar sobre la única copia de sus datos. Tras actualizar, abra la aplicación y compruebe la última transacción sincronizada y el saldo de una cuenta.
Resolución de problemas: mensajes reales y causas conocidas
SharedArrayBufferMissing(error fatal al cargar): sin HTTPS, cabeceras COOP/COEP ausentes o duplicadas, o navegador demasiado antiguo. Con Nginx, oculte las cabeceras de origen (proxy_hide_header Cross-Origin-Embedder-Policy;yproxy_hide_header Cross-Origin-Opener-Policy;) y defínalas una sola vez:require-corpysame-origin.Enable Banking API error: status=403 body={"code":403,"message":"Application is not active"}: la aplicación de Enable Banking aún no está activada; la lista de cuentas queda vacía sin error en la interfaz (comunicado en la incidencia n.º 7799).- Aplicación no encontrada aunque el identificador sea correcto: un espacio al principio del Application ID basta para que falle la conexión; elimínelo (un usuario pidió en la incidencia que se ignore el espacio y se aclare el mensaje).
URL "app://actual/enablebanking/auth_callback" uses unsupported scheme: el soporte de Enable Banking solo admite redireccioneshttps; sugirió una redirección HTTPS que luego reenvíe al esquema de la aplicación.Could not validate the credentials. Please check your Application ID and secret key.: comunicado solo en Firefox con valores que funcionaban en Chromium; no consta ninguna solución, pruebe otro navegador para la configuración inicial.- Beneficiarios vacíos o idénticos a las notas, saldo de tarjeta erróneo: estos comportamientos constan en la incidencia n.º 7799 (por ejemplo, el primer saldo devuelto, a veces el crédito disponible, se muestra en lugar de la deuda contabilizada). Son límites de la implementación experimental, no un error de su instalación: compare con el extracto del banco.
PostError: network-failure,Wrong transactions period requested, varias aplicaciones de Enable Banking: comunicados en la misma incidencia sin solución registrada. Si creó una segunda aplicación, desvincule las cuentas y agrúpelas todas bajo una sola: la sincronización de las vinculadas mediante la primera falló tras añadir la segunda.- Registros detallados: añada
DEBUG=actual-sensitive:enable-banking,actual-sensitive:bank-syncal entorno del contenedor, reinicie, reproduzca el error y luego retire la variable.
No publique nunca los registros «sensitive» tal cual
La documentación advierte de que estos registros pueden contener credenciales, información bancaria u otros datos privados: no los pegue en una incidencia pública ni en Discord. Evite también DEBUG=* o DEBUG=actual*, que activan igualmente la salida sensible; para una depuración ordinaria basta DEBUG=actual:*. Revise y tache el extracto antes de enviarlo al mantenedor que le ayuda y restablezca el valor anterior de DEBUG cuando termine el diagnóstico.