El repositorio incluye un Dockerfile multi-stage y un Blueprint render.yaml.
La imagen compila los assets de Vite, instala las dependencias PHP de produccion y
sirve Laravel con Apache en el puerto indicado por Render.
- Sube el repositorio a GitHub, GitLab o Bitbucket.
- En Render, selecciona New > Blueprint y conecta el repositorio.
- Completa las variables marcadas como secretas:
APP_URL: URL publica completa, por ejemplohttps://financy.onrender.com.DB_HOST,DB_PASSWORD: credenciales PostgreSQL de Supabase.- Si Supabase usa otros valores, ajusta tambien
DB_PORT,DB_DATABASEyDB_USERNAMEen Render.
- Crea el servicio. El contenedor ejecutara
php artisan migrate --forceal arrancar y Render comprobara/upantes de enviar trafico.
APP_KEY se genera una sola vez desde el Blueprint. No la cambies despues de que
la aplicacion tenga usuarios, porque invalidaria sesiones y datos cifrados. Los
logs se envian a stderr, por lo que aparecen directamente en el panel de Render.
La imagen ejecuta siempre php artisan migrate --force --no-interaction al
arrancar y no inicia Apache si una migracion falla. Esto evita desplegar codigo
que consulte columnas que todavia no existen. En un servicio pago puede moverse
esta operacion a un preDeployCommand dedicado.
El filesystem de Render es efimero. Actualmente FINANCY no guarda archivos de
usuario, pero si agregas uploads debes configurar S3/Supabase Storage o un disco
persistente. Para ejecutar la tarea recurrente, crea opcionalmente un Cron Job con
el mismo repositorio, schedule 0 11,23 * * * (UTC) y Docker Command
php artisan amounts:cron.
Configura MAIL_HOST=smtp.gmail.com, MAIL_PORT=587, MAIL_ENCRYPTION=tls,
MAIL_USERNAME con la cuenta Gmail y MAIL_PASSWORD con una contraseña de
aplicación de Google (no la contraseña normal). MAIL_FROM_ADDRESS debe ser la
misma cuenta. Ejecuta el scheduler de Laravel cada minuto o crea un cron diario
para php artisan earnings:send-reminders. Solo se envían recordatorios a
usuarios con correo verificado y nunca se duplica un aviso para la misma fecha
de claim.
FINANCY es una aplicación para gestionar las finanzas personales de los usuarios. Permite a los usuarios registrar y gestionar sus ingresos, gastos, ahorros y listas de compras. La aplicación está construida utilizando una combinación de tecnologías modernas como React, Inertia.js, Laravel, Tailwind CSS y MySQL.
- React: Utilizado para construir la interfaz de usuario interactiva.
- Inertia.js: Facilita la integración entre Laravel y React, permitiendo construir aplicaciones de una sola página (SPA) sin necesidad de una API separada.
- Laravel: Framework de PHP utilizado para manejar la lógica del servidor y las operaciones de base de datos.
- Tailwind CSS: Framework de CSS utilizado para diseñar la interfaz de usuario.
- MySQL / PostgreSQL (Supabase): Base de datos de origen y destino para la migración de datos.
- Cron de Laravel: Utilizado para ejecutar tareas programadas, como la actualización de ingresos y gastos recurrentes.
- Earning: Representa los ingresos de los usuarios. Puede ser recurrente o único.
- Expense: Representa los gastos de los usuarios. Puede ser recurrente o único.
- Box: Representa una caja de ahorros específica del usuario.
- Saving: Representa los ahorros generales del usuario.
- ShopListItem: Representa los ítems en la lista de compras del usuario.
Las migraciones se utilizan para definir la estructura de las tablas en la base de datos. Algunas de las migraciones clave incluyen:
- create_earnings_table: Define la estructura de la tabla de ingresos.
- create_expenses_table: Define la estructura de la tabla de gastos.
- create_boxes_table: Define la estructura de la tabla de cajas.
- create_savings_table: Define la estructura de la tabla de ahorros.
- create_shop_list_items_table: Define la estructura de la tabla de ítems de la lista de compras.
Los controladores manejan la lógica de la aplicación y las interacciones del usuario. Algunos de los controladores clave incluyen:
- EarningsController: Maneja las operaciones relacionadas con los ingresos, como la creación, actualización y eliminación de ingresos.
- ExpensesController: Maneja las operaciones relacionadas con los gastos, como la creación, actualización y eliminación de gastos.
- DashboardController: Muestra el tablero principal con un resumen de las finanzas del usuario.
- ShopListController: Maneja las operaciones relacionadas con la lista de compras, como la creación, actualización y eliminación de ítems de la lista de compras.
- ProfileController: Maneja las operaciones relacionadas con el perfil del usuario, como la edición y eliminación del perfil.
Las rutas definen los endpoints de la aplicación y los controladores que manejan las solicitudes a esos endpoints. Algunas de las rutas clave incluyen:
- /dashboard: Muestra el tablero principal.
- /earnings: Muestra y maneja las operaciones relacionadas con los ingresos.
- /expenses: Muestra y maneja las operaciones relacionadas con los gastos.
- /shop-list: Muestra y maneja las operaciones relacionadas con la lista de compras.
- /profile: Muestra y maneja las operaciones relacionadas con el perfil del usuario.
FINANCY utiliza la plantilla de autenticación proporcionada por Laravel para manejar el registro, inicio de sesión y gestión de usuarios. Esta plantilla incluye componentes de React para los formularios de autenticación y utiliza Inertia.js para manejar las transiciones de página sin recargar la página completa.
La aplicación utiliza el cron de Laravel para ejecutar tareas programadas, como la actualización de ingresos y gastos recurrentes. Estas tareas se definen en el comando amounts:cron y se ejecutan periódicamente para mantener actualizadas las finanzas del usuario.
Este proyecto incluye un flujo de migracion para mover un dump MySQL (.sql) hacia Supabase PostgreSQL sin perder informacion.
Usa estos valores en tu .env de despliegue (no en el repositorio):
DB_CONNECTION=pgsql
DB_HOST=YOUR_SESSION_POOLER_HOST.pooler.supabase.com
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres.YOUR_PROJECT_REF
DB_PASSWORD=your-supabase-db-password
DB_SSLMODE=requirePara Render usa los valores de Connect > Session Pooler en Supabase. La
conexion directa db.PROJECT_REF.supabase.co usa IPv6 y no es compatible con la
red de Render. Al usar variables separadas, DB_PASSWORD conserva la contrasena
literal; el percent-encoding solo es necesario dentro de una URL de conexion.
Archivo: scripts/migrate-mysql-dump-to-supabase.ps1
Requisitos:
- Docker Desktop activo.
- Proyecto Supabase creado.
- Password de base de datos de Supabase.
- Dump MySQL en formato
.sql.
Ejemplo de ejecucion:
powershell -ExecutionPolicy Bypass -File .\scripts\migrate-mysql-dump-to-supabase.ps1 `
-DumpPath "C:\ruta\a\financy_backup.sql" `
-SupabaseHost "db.TU_PROJECT_REF.supabase.co" `
-SupabasePassword "TU_SUPABASE_DB_PASSWORD"Que hace el script:
- Levanta un MySQL temporal en Docker.
- Importa tu dump
.sql. - Migra esquema + datos a Supabase con
pgloader. - Preserva identificadores con mayusculas/minusculas (
quote identifiers) para evitar romper columnas comoNextClaimyUpdatedTerm. - Verifica conteo de filas por tabla entre origen y destino.
- Genera reporte CSV en
storage/logs/supabase-row-count-check-*.csv.
Cuando no hay Docker disponible, puedes usar el SQL de datos ya adaptado para PostgreSQL/Supabase:
- Archivo generado:
database/supabase/financy-data-import.sql - Script generador:
scripts/build-supabase-data-import-from-mysql-dump.ps1
Regenerar archivo de importacion desde un dump MySQL:
powershell -ExecutionPolicy Bypass -File .\scripts\build-supabase-data-import-from-mysql-dump.ps1 `
-InputDumpPath .\u619022423_financy.sql `
-OutputSqlPath .\database\supabase\financy-data-import.sqlNotas de esta alternativa:
- Convierte identificadores MySQL con comillas invertidas a comillas dobles de PostgreSQL.
- Mantiene columnas sensibles a mayusculas/minusculas (por ejemplo
NextClaimyUpdatedTerm). - Reordena inserts para respetar dependencias de claves foraneas.
- Ajusta secuencias de
idal final del import.
Para ejecutar en Supabase:
- Crea el esquema con migraciones de Laravel apuntando a Supabase (
php artisan migrate --force). - Ejecuta el contenido de
database/supabase/financy-data-import.sqlen el SQL Editor de Supabase.
- Ejecutar la migracion sobre un proyecto Supabase nuevo o con esquema
publicvacio. - Mantener un respaldo adicional del dump original.
- No versionar credenciales reales en archivos
.envdentro del repositorio.
Despues de migrar:
php artisan config:clear
php artisan cache:clear
php artisan migrate:statusSi migrate:status muestra las migraciones historicas, la tabla migrations tambien se migro correctamente.