No description
Find a file
Alberto Martinez b596bb70cd
Some checks failed
CI / api (push) Has been cancelled
CI / web (web-panel) (push) Has been cancelled
CI / web (web-saas) (push) Has been cancelled
Migrar a PostgreSQL, Redis y R2
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## Resumen

Sustituye SQLite por **PostgreSQL** (2 bases: `panels_platform` + `panels_product` / esquemas `iam` y `core`), **Redis** (sesiones y cache) y **Cloudflare R2** para archivos. Validado en Coolify: Liquibase en el job `migrate`, API healthy, login SaaS tras `bootstrap-admin.ts platform`.

## Qué entra

- Changelogs Liquibase Postgres, roles `_owner` / `_app`, RLS por `tenant_id`.
- API Deno con postgres.js + Redis; sin FFI SQLite ni JRE en la imagen de tráfico.
- `docker-compose.yml` de Coolify: `migrate` (one-shot, `!dev`) → `api` → `web-panel` / `web-saas`. Overlay local en `overlays/compose.local.yml` (no mezclar en Coolify).
- `migrate` y `api` unidos a la red `coolify` para resolver UUIDs internos de Postgres/Redis.
- R2: ListObjects (no HeadBucket); Deno `--allow-sys` para el SDK AWS.

## Coolify / ops (no olvidar)

- Compose **solo** `docker-compose.yml`. Hosts = URL **internal**, no CONTAINER ID.
- 6 `DATABASE_URL_*` + 2 `REDIS_URL_*` expandidas; `DOCS_KEY` 64 hex; `SESSION_SECRET`; `S3_*`; `DENO_ENV=production`.
- Primer admin SaaS: `docker exec` → `bootstrap-admin.ts platform`. Usuario `admin` / `SEED_PASSWORD`. No se crea en cada boot.

## Cómo probar

- `/v1/health` con core, platform, redis y `storage.backend: "s3"`.
- Login SaaS `admin` + `SEED_PASSWORD` tras el bootstrap.

Base: `main`.
<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-556d1a5c-47ed-4a0b-bd66-06f84a8f41e1?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-556d1a5c-47ed-4a0b-bd66-06f84a8f41e1&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>
2026-09-03 06:02:38 +00:00
.github/workflows api: --allow-sys para el SDK de AWS/R2 en Deno 2026-09-03 05:49:14 +00:00
api api: --allow-sys para el SDK de AWS/R2 en Deno 2026-09-03 05:49:14 +00:00
db api: --allow-sys para el SDK de AWS/R2 en Deno 2026-09-03 05:49:14 +00:00
docs api: ping R2 con ListObjects, no HeadBucket 2026-09-03 05:42:13 +00:00
overlays compose: unir migrate y api a la red coolify 2026-09-03 05:25:53 +00:00
tmp/pdfs Nominas 2026-08-25 20:21:49 -05:00
web first commit 2026-08-21 16:55:01 -05:00
web-panel Ajustes para nomina y dashboard 2026-08-26 19:02:41 -05:00
web-saas first commit 2026-08-21 16:55:01 -05:00
.dockerignore first commit 2026-08-21 16:55:01 -05:00
.env.example api: compatibilidad S3 con Cloudflare R2 (reemplazo de Contabo) 2026-09-03 04:40:54 +00:00
.gitignore first commit 2026-08-21 16:55:01 -05:00
docker-compose.yml compose: unir migrate y api a la red coolify 2026-09-03 05:25:53 +00:00
Dockerfile.api api: --allow-sys para el SDK de AWS/R2 en Deno 2026-09-03 05:49:14 +00:00
Dockerfile.migrate deploy: Liquibase automático en cada deploy (job migrate) 2026-09-03 04:54:15 +00:00
Dockerfile.provision db/infra: ETL de datos, backups y limpieza de despliegue (fase 5-7) 2026-09-02 21:05:07 +00:00
Dockerfile.web-panel first commit 2026-08-21 16:55:01 -05:00
Dockerfile.web-saas first commit 2026-08-21 16:55:01 -05:00
package.json ops: sacar el overlay local del glob docker-compose*.yml 2026-09-03 05:19:10 +00:00