DesarrolladoresBases de datos gestionadas
Bases de datos gestionadas
Las bases de datos gestionadas se ejecutan en servidores de bases de datos de Hostwolf, separados de tus servidores de aplicaciones. Tus apps llegan a ellas por TLS, así que todas las copias de una app, en cualquier servidor y cualquier ciudad, usan los mismos datos. Eso es lo que permite escalar horizontalmente la capa de aplicaciones.
- Motores: PostgreSQL, MariaDB (compatible con MySQL) y Redis.
- Seguridad: TLS es obligatorio, y una base de datos solo acepta conexiones desde los servidores de tu equipo.
- Pooling de conexiones: PostgreSQL y MariaDB incluyen un pooler, así que miles de conexiones de la app comparten unas pocas conexiones a la base de datos.
- Almacenamiento: crece solo; el almacenamiento por encima del plan se factura por GB.
- Copias de seguridad: cada noche, se guardan 7 días, fuera del servidor. PostgreSQL también tiene recuperación a un momento concreto de los últimos 7 días.
- Eliminar: la facturación se detiene al momento; soporte puede restaurar una base de datos eliminada durante 7 días.
- Facturación: por hora (el precio mensual ÷ 730), en tu próxima factura de servidores. Antes necesitas una suscripción de servidor activa.
Planes y precios#
hw $API/managed-databases/catalog | jq
| Plan | Memoria | Almacenamiento | Conexiones de la app (con pool) | Conexiones directas | Servidor |
|---|---|---|---|---|---|
small | 256 MB | 5 GB | 1,000 | 10 | compartido |
medium | 512 MB | 10 GB | 2,000 | 40 | compartido |
large | 4 GB | 80 GB | 5,000 | 100 | dedicado |
xlarge | 12 GB | 200 GB | 10,000 | 200 | dedicado, 8 vCPU |
El catálogo lista las regiones (por ejemplo vultr:ams para Ámsterdam) con el precio mensual y por hora de cada plan, en USD, y los límites de arriba (pooled_clients, direct_connections, pool_size). Elige la región más cercana a tus servidores de aplicaciones. Precios a 11 de octubre de 2026:
| Plan | Ámsterdam (vultr:ams) | Newark (vultr:ewr) |
|---|---|---|
small | 3,88 $/mes | 3,88 $/mes |
medium | 7,74 $/mes | 7,74 $/mes |
large | 62,13 $/mes | 62,13 $/mes |
xlarge | 229,24 $/mes | no se vende |
Crear y conectar#
DB=$(hw -X POST $API/managed-databases \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"engine": "postgres", "plan": "small", "region": "vultr:ams"}' | jq -r .uuid)
# A few minutes later: status goes creating → ready
hw $API/managed-databases/$DB | jq -r .status
# Save the connection URLs on an app, then redeploy it
hw -X POST $API/managed-databases/$DB/attach -d "{\"application_uuid\": \"$APP\"}"
hw -X POST $API/applications/$APP/start
attachguarda en la app la URL con pool comoDATABASE_URLy la URL directa comoDATABASE_DIRECT_URL(Redis:REDIS_URL). Las URLs nunca pasan por tu script.attachnunca reemplaza una variable sin avisar. Si la app ya tieneDATABASE_URL(oREDIS_URL) con otro valor, no se guarda nada y la respuesta es409conconflictsy unsuggested_env_keylibre. Envía"env_key": "DATABASE_URL_2"para guardar con ese nombre (la URL directa pasa a serDATABASE_DIRECT_URL_2), o"overwrite": truepara reemplazarlas.- La cabecera
Idempotency-Key(un UUID) hace que la llamada se pueda repetir sin riesgo: la misma clave nunca crea una segunda base de datos. Usar una clave otra vez con ajustes distintos responde 409. - Las acciones sobre bases de datos están limitadas a 10 por minuto.
URLs con pool y directas#
Cada base de datos PostgreSQL y MariaDB tiene dos URLs a los mismos datos:
Con pool (url, DATABASE_URL) | Directa (direct_url, DATABASE_DIRECT_URL) | |
|---|---|---|
| PostgreSQL | puerto 6432, PgBouncer en modo transacción | puerto 5432 |
| MariaDB | puerto 6033, ProxySQL | puerto 3306 |
| Conexiones | hasta el límite con pool del plan; por encima del pool esperan (hasta 120 s) en lugar de fallar | el límite directo del plan (10 en small) |
| Úsala para | tu app: peticiones web, workers, todas las copias de la app | migraciones, LISTEN/NOTIFY, ajustes de sesión (SET), bloqueos consultivos, tablas temporales y transacciones largas |
Usa la URL con pool en tu app. Con la URL directa, mantén el pool de la app dentro del límite directo del plan, contando todas las copias de la app. Las sentencias preparadas funcionan a través del pooler. Ejecuta las migraciones con la URL directa, por ejemplo DATABASE_URL=$DATABASE_DIRECT_URL npx prisma migrate deploy como comando post-despliegue (ajustes de la app, Ciclo de vida del despliegue). El comando pre-despliegue se ejecuta en la copia que sigue en marcha, antes de que empiece la nueva compilación: ejecutaría las migraciones de la versión anterior y se omite en el primer despliegue.
Para leer las URLs tú mismo, el token necesita Lectura de datos sensibles:
hw $API/managed-databases/$DB/connection | jq
# {"env_key": "DATABASE_URL", "url": "postgresql://…@db-….db.app.hostwolf.net:6432/…?sslmode=require",
# "direct_url": "postgresql://…@db-….db.app.hostwolf.net:5432/…?sslmode=require", "direct_connections": 10}
| Motor | Formato de la URL |
|---|---|
| PostgreSQL | postgresql://user:password@host:port/db?sslmode=require |
| MariaDB | mysql://user:password@host:port/db?ssl-mode=REQUIRED |
| Redis | rediss://user:password@host:port/0 |
El nombre de host (db-<id>.db.app.hostwolf.net) no cambia con los cambios de plan ni con los traslados. Los certificados son públicos (Let's Encrypt), así que no hace falta ningún archivo de CA: sslmode=verify-full y ssl-mode=VERIFY_IDENTITY funcionan con el almacén de certificados de tu sistema, tanto en el puerto con pool como en el directo. Se rechazan las conexiones desde fuera de los servidores de tu equipo, incluido tu propio ordenador. Para inspeccionar datos, usa una shell en uno de tus servidores (la Terminal de la consola) o una herramienta que se ejecute en una de tus apps.
Almacenamiento que crece#
El disco del servidor de bases de datos crece solo antes de llenarse, sin reiniciar. Tu plan incluye su almacenamiento (5, 10, 80 o 200 GB). Por encima de eso, cada GB completo se factura por hora: 0,13 $ al mes por 1 GB, 1,24 $ por 10 GB, 12,38 $ por 100 GB. extra_storage en la base de datos muestra los GB extra actuales y su precio, y metrics muestra su tamaño.
Cambiar a un plan superior#
Cuando una base de datos va más cargada de lo que da su plan en 3 de cada 4 horas (CPU, conexiones o un Redis lleno), advice indica qué plan le conviene y los administradores del equipo reciben un correo. No cambia nada hasta que subas de plan. upgrades lista los planes a los que puede cambiar ahora:
hw $API/managed-databases/$DB | jq '.upgrades, .advice'
# [{"plan": "medium", "how": "in_place"}, {"plan": "large", "how": "move"}]
hw -X POST $API/managed-databases/$DB/upgrade -d '{"plan": "large"}'
# 422 {"message": "The large plan costs $62.13/month (now $3.88), billed hourly from the change. … Send \"confirm\": true to go ahead.", "confirm_required": true, "quote": {…}}
hw -X POST $API/managed-databases/$DB/upgrade -d '{"plan": "large", "confirm": true}' # 202
in_place: desmallamediumsigue funcionando. Delargeaxlargemueve el disco a un servidor más grande, con alrededor de un minuto sin servicio.move: la base de datos se copia a otro servidor. No está disponible durante la copia (unos 20 segundos para 200.000 filas) y después el nombre de host apunta al servidor nuevo.- El nuevo precio se aplica desde el cambio. Los planes nunca bajan.
Memoria de Redis#
Una base de datos Redis guarda como máximo la memoria de su plan (256 MB, 512 MB, 4 GB o 12 GB). La política de expulsión decide qué pasa cuando se llena:
| Política | Cuando la memoria está llena | Úsala para |
|---|---|---|
allkeys-lru | Quita las claves usadas hace más tiempo | cachés |
noeviction (por defecto) | Rechaza las escrituras con un error; las lecturas siguen funcionando | colas, sesiones, datos que no deben desaparecer |
volatile-lru, allkeys-lfu, volatile-lfu, allkeys-random, volatile-random, volatile-ttl | Las demás políticas de Redis | casos especiales |
Elígela al crear la base de datos ("eviction_policy": "allkeys-lru") o cámbiala en cualquier momento; se aplica al instante, sin reiniciar:
hw -X PATCH $API/managed-databases/$DB -d '{"eviction_policy": "allkeys-lru"}'
metrics muestra la memoria usada, el máximo y las claves expulsadas hasta ahora.
Copias de seguridad#
hw -X POST $API/managed-databases/$DB/backups # an extra backup now (202)
Las copias nocturnas se hacen de todos modos. En la consola, Puntos de restauración en la base de datos las muestra.
PostgreSQL se puede restaurar desde la consola a cualquier minuto de los últimos 7 días: la restauración crea una base de datos nueva tal como estaba en ese momento, con su propia URL y facturada como cualquier base de datos. La base de datos actual sigue funcionando. Para restaurar una copia de MariaDB o Redis, escribe a soporte con el uuid de la base de datos y la hora.
Eliminar#
hw -X DELETE $API/managed-databases/$DB
La facturación se detiene en el acto. Las apps que la usaban conservan el DATABASE_URL antiguo hasta que lo cambies.
Errores que puedes ver#
| Estado | Significado |
|---|---|
| 403 | Verifica primero tu dirección de email en la consola, o al token le falta un permiso. |
| 409 | La base de datos todavía no está lista, o la Idempotency-Key se usó para otra base de datos. |
| 422 | Motor, plan o región desconocidos, ninguna suscripción de servidor activa, un cambio de plan que no admite ahora o falta confirm. |
| 503 | Las bases de datos gestionadas no están disponibles por un momento. No se ha cambiado nada; vuelve a intentarlo. |