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
PlanMemoriaAlmacenamientoConexiones de la app (con pool)Conexiones directasServidor
small256 MB5 GB1,00010compartido
medium512 MB10 GB2,00040compartido
large4 GB80 GB5,000100dedicado
xlarge12 GB200 GB10,000200dedicado, 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)
small3,88 $/mes3,88 $/mes
medium7,74 $/mes7,74 $/mes
large62,13 $/mes62,13 $/mes
xlarge229,24 $/mesno 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
  • attach guarda en la app la URL con pool como DATABASE_URL y la URL directa como DATABASE_DIRECT_URL (Redis: REDIS_URL). Las URLs nunca pasan por tu script.
  • attach nunca reemplaza una variable sin avisar. Si la app ya tiene DATABASE_URL (o REDIS_URL) con otro valor, no se guarda nada y la respuesta es 409 con conflicts y un suggested_env_key libre. Envía "env_key": "DATABASE_URL_2" para guardar con ese nombre (la URL directa pasa a ser DATABASE_DIRECT_URL_2), o "overwrite": true para 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)
PostgreSQLpuerto 6432, PgBouncer en modo transacciónpuerto 5432
MariaDBpuerto 6033, ProxySQLpuerto 3306
Conexioneshasta el límite con pool del plan; por encima del pool esperan (hasta 120 s) en lugar de fallarel límite directo del plan (10 en small)
Úsala paratu app: peticiones web, workers, todas las copias de la appmigraciones, 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}
MotorFormato de la URL
PostgreSQLpostgresql://user:password@host:port/db?sslmode=require
MariaDBmysql://user:password@host:port/db?ssl-mode=REQUIRED
Redisrediss://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: de small a medium sigue funcionando. De large a xlarge mueve 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íticaCuando la memoria está llenaÚsala para
allkeys-lruQuita las claves usadas hace más tiempocachés
noeviction (por defecto)Rechaza las escrituras con un error; las lecturas siguen funcionandocolas, sesiones, datos que no deben desaparecer
volatile-lru, allkeys-lfu, volatile-lfu, allkeys-random, volatile-random, volatile-ttlLas demás políticas de Rediscasos 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#

EstadoSignificado
403Verifica primero tu dirección de email en la consola, o al token le falta un permiso.
409La base de datos todavía no está lista, o la Idempotency-Key se usó para otra base de datos.
422Motor, plan o región desconocidos, ninguna suscripción de servidor activa, un cambio de plan que no admite ahora o falta confirm.
503Las bases de datos gestionadas no están disponibles por un momento. No se ha cambiado nada; vuelve a intentarlo.
¿Atascado, o te falta un endpoint? Escríbenos en app.hostwolf.net/contact o a [email protected].