mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 12:43:18 +00:00
api: compatibilidad S3 con Cloudflare R2 (reemplazo de Contabo)
El SDK de AWS v3 manda checksums CRC32 que R2 no acepta; se calculan solo cuando el API lo exige. Docs y .env.example apuntan a R2. Co-authored-by: alberto.martinez <alberto.martinez@mrdev.mx>
This commit is contained in:
parent
1ac04996b6
commit
c2ea43818c
3 changed files with 13 additions and 12 deletions
|
|
@ -66,12 +66,12 @@ IAM_REDIS_PASSWORD=
|
||||||
CORE_REDIS_PASSWORD=
|
CORE_REDIS_PASSWORD=
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Contabo Object Storage (Fase 4c) -- expedientes/PDFs/logos cifrados.
|
# Object storage S3-compatible (Cloudflare R2) -- expedientes/PDFs/logos.
|
||||||
# Sin esto, cae a disco local bajo el volumen panel-data (solo dev; en
|
# Sin esto, cae a disco local (solo dev).
|
||||||
# producción un volumen local no escala horizontalmente, ver el plan).
|
# R2: S3_ENDPOINT=https://<ACCOUNT_ID>.r2.cloudflarestorage.com S3_REGION=auto
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
S3_ENDPOINT=
|
S3_ENDPOINT=
|
||||||
S3_BUCKET=
|
S3_BUCKET=
|
||||||
S3_REGION=
|
S3_REGION=auto
|
||||||
S3_ACCESS_KEY_ID=
|
S3_ACCESS_KEY_ID=
|
||||||
S3_SECRET_ACCESS_KEY=
|
S3_SECRET_ACCESS_KEY=
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,9 @@ import { config, DATA_DIR } from "./config.ts";
|
||||||
* otra capa. El contenido YA viene cifrado con AES-GCM (docs_crypto.ts)
|
* otra capa. El contenido YA viene cifrado con AES-GCM (docs_crypto.ts)
|
||||||
* antes de llegar aquí -- el bucket nunca ve texto plano.
|
* antes de llegar aquí -- el bucket nunca ve texto plano.
|
||||||
*
|
*
|
||||||
* Backend real: Contabo Object Storage (S3-compatible). Si no hay
|
* Backend real: S3-compatible (Cloudflare R2). Si no hay credenciales S3
|
||||||
* credenciales S3 configuradas (dev local sin Contabo), cae a disco local
|
* (dev local), cae a disco bajo DATA_DIR. En staging/producción el volumen
|
||||||
* bajo DATA_DIR -- útil para desarrollar/probar sin depender de Contabo,
|
* local no escala: hay que configurar S3_*.
|
||||||
* pero NO es la ruta recomendada para staging/producción (ver Fase 4c del
|
|
||||||
* plan: un volumen local no escala horizontalmente).
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
let client: S3Client | null = null;
|
let client: S3Client | null = null;
|
||||||
|
|
@ -72,8 +70,11 @@ function getClient(): S3Client {
|
||||||
if (!client) {
|
if (!client) {
|
||||||
client = new S3Client({
|
client = new S3Client({
|
||||||
endpoint: config.s3Endpoint,
|
endpoint: config.s3Endpoint,
|
||||||
region: config.s3Region,
|
region: config.s3Region || "auto",
|
||||||
forcePathStyle: true,
|
forcePathStyle: true,
|
||||||
|
// R2 no implementa los checksums CRC32 que el SDK v3 manda por defecto.
|
||||||
|
requestChecksumCalculation: "WHEN_REQUIRED",
|
||||||
|
responseChecksumValidation: "WHEN_REQUIRED",
|
||||||
credentials: {
|
credentials: {
|
||||||
accessKeyId: config.s3AccessKeyId,
|
accessKeyId: config.s3AccessKeyId,
|
||||||
secretAccessKey: config.s3SecretAccessKey,
|
secretAccessKey: config.s3SecretAccessKey,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|-----|--------|
|
|-----|--------|
|
||||||
| Postgres gestionado en Coolify | **1 instancia** por ambiente, con **2 bases**: `panels_platform`, `panels_product` (esquemas `iam`/`core`) |
|
| Postgres gestionado en Coolify | **1 instancia** por ambiente, con **2 bases**: `panels_platform`, `panels_product` (esquemas `iam`/`core`) |
|
||||||
| Redis gestionado en Coolify | **1 instancia** por ambiente, con **2 usuarios ACL** (`panels_iam_redis`, `panels_core_redis`) |
|
| Redis gestionado en Coolify | **1 instancia** por ambiente, con **2 usuarios ACL** (`panels_iam_redis`, `panels_core_redis`) |
|
||||||
| Object storage | Contabo Object Storage (S3-compatible) para expedientes/PDFs/logos cifrados |
|
| Object storage | Cloudflare R2 (S3-compatible) para expedientes/PDFs/logos cifrados |
|
||||||
| Contenedores de la app | **3** (`api`, `web-panel`, `web-saas`) |
|
| Contenedores de la app | **3** (`api`, `web-panel`, `web-saas`) |
|
||||||
| Volumen persistente | **1** → `/app/data` en `api` (solo fallback local si no hay Contabo configurado -- no usar así en producción) |
|
| Volumen persistente | **1** → `/app/data` en `api` (solo fallback local si no hay Contabo configurado -- no usar así en producción) |
|
||||||
|
|
||||||
|
|
@ -65,7 +65,7 @@ openssl rand -hex 24 # passwords de roles Postgres/Redis
|
||||||
| `API_KEY` | Auth alternativa por header `X-API-Key` **+ `X-Tenant-Id` obligatorio** (ya no ve todos los tenants, ver revisión de seguridad) |
|
| `API_KEY` | Auth alternativa por header `X-API-Key` **+ `X-Tenant-Id` obligatorio** (ya no ve todos los tenants, ver revisión de seguridad) |
|
||||||
| `VCARD_BASE` | Prefijo QR/vCard gafetes |
|
| `VCARD_BASE` | Prefijo QR/vCard gafetes |
|
||||||
| `SMTP_HOST` / `SMTP_PORT` / `SMTP_USER` / `SMTP_PASS` / `SMTP_FROM` | Correo por env (alternativa al panel `/smtp`) |
|
| `SMTP_HOST` / `SMTP_PORT` / `SMTP_USER` / `SMTP_PASS` / `SMTP_FROM` | Correo por env (alternativa al panel `/smtp`) |
|
||||||
| `S3_ENDPOINT` / `S3_BUCKET` / `S3_REGION` / `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` | Contabo Object Storage (Fase 4c). Sin esto, cae a disco local -- **no recomendado en producción** |
|
| `S3_ENDPOINT` / `S3_BUCKET` / `S3_REGION` / `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` | Cloudflare R2. Endpoint `https://<ACCOUNT_ID>.r2.cloudflarestorage.com`, `S3_REGION=auto`. Sin esto, cae a disco local -- **no recomendado en producción** |
|
||||||
|
|
||||||
`web-panel` y `web-saas` **no** necesitan variables de entorno en runtime (estáticos + proxy nginx).
|
`web-panel` y `web-saas` **no** necesitan variables de entorno en runtime (estáticos + proxy nginx).
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue