Volver

Conectar una base de datos

Aprovisiona una base de datos MySQL o PostgreSQL administrada y conecta tu app a ella.

Web Hosting no espera que pegues una cadena de conexión tuya: la base de datos se aprovisiona desde el panel y la plataforma inyecta las credenciales en tu aplicación automáticamente.

1. Aprovisionar

En la pestaña Base de datos:

  1. Elige el motor: mysql o postgres (los motores disponibles dependen de lo que el operador haya habilitado para tu instancia).
  2. Confirma el aprovisionamiento.

La plataforma crea el contenedor de base de datos desde una plantilla controlada, sin puertos publicados al exterior (solo es alcanzable desde el contenedor de tu aplicación), y genera credenciales únicas para tu instancia.

2. Usar las credenciales desde tu app

Tras aprovisionar, el panel reinyecta automáticamente las variables de conexión en el entorno de tu aplicación y la redespliega para que tome los cambios. No necesitas copiar ni pegar ninguna cadena de conexión a mano.

Tu app las recibe como variables de entorno normales (no las declares tú mismo en la pestaña Entorno: son reservadas y la plataforma las sobrescribe en cada despliegue, ver Variables de entorno):

Variable Contenido
DATABASE_URL Cadena de conexión completa, lista para pasarle a la mayoría de librerías/ORMs
DB_ENGINE mysql o postgres
DB_HOST Host del contenedor de base de datos (solo alcanzable desde tu app)
DB_PORT Puerto
DB_NAME Nombre de la base de datos
DB_USER Usuario
DB_PASSWORD Contraseña

DATABASE_URL tiene el formato mysql://usuario:contraseña@host:puerto/nombre (motor mysql) o postgresql://usuario:contraseña@host:puerto/nombre (motor postgres). La mayoría de librerías de conexión aceptan esa URL directamente; si la tuya necesita los campos por separado, tienes dos opciones: leer las variables individuales (DB_HOST, DB_PORT, etc.) o descomponer DATABASE_URL con el parser de URL propio del lenguaje. Ambas formas se muestran a continuación.

import os
from urllib.parse import urlparse

# Opción A: variables individuales
db_host = os.environ["DB_HOST"]
db_port = int(os.environ["DB_PORT"])
db_name = os.environ["DB_NAME"]
db_user = os.environ["DB_USER"]
db_password = os.environ["DB_PASSWORD"]
db_engine = os.environ["DB_ENGINE"]  # "mysql" o "postgres"

# Opción B: descomponer DATABASE_URL
url = urlparse(os.environ["DATABASE_URL"])
db_host = url.hostname
db_port = url.port
db_name = url.path.lstrip("/")   # quita el "/" inicial
db_user = url.username
db_password = url.password
db_engine = url.scheme           # "mysql" o "postgresql"
using System;

// Opción A: variables individuales
string dbHost = Environment.GetEnvironmentVariable("DB_HOST");
int dbPort = int.Parse(Environment.GetEnvironmentVariable("DB_PORT"));
string dbName = Environment.GetEnvironmentVariable("DB_NAME");
string dbUser = Environment.GetEnvironmentVariable("DB_USER");
string dbPassword = Environment.GetEnvironmentVariable("DB_PASSWORD");
string dbEngine = Environment.GetEnvironmentVariable("DB_ENGINE"); // "mysql" o "postgres"

// Opción B: descomponer DATABASE_URL
var uri = new Uri(Environment.GetEnvironmentVariable("DATABASE_URL"));
string scheme = uri.Scheme;                   // "mysql" o "postgresql"
string host = uri.Host;
int port = uri.Port;
string database = uri.AbsolutePath.TrimStart('/');
string[] userInfo = uri.UserInfo.Split(':');
string user = userInfo[0];
string password = userInfo[1];
import java.net.URI;

// Opción A: variables individuales
String dbHost = System.getenv("DB_HOST");
int dbPort = Integer.parseInt(System.getenv("DB_PORT"));
String dbName = System.getenv("DB_NAME");
String dbUser = System.getenv("DB_USER");
String dbPassword = System.getenv("DB_PASSWORD");
String dbEngine = System.getenv("DB_ENGINE"); // "mysql" o "postgres"

// Opción B: descomponer DATABASE_URL
URI uri = new URI(System.getenv("DATABASE_URL"));
String scheme = uri.getScheme();              // "mysql" o "postgresql"
String host = uri.getHost();
int port = uri.getPort();
String database = uri.getPath().substring(1); // quita el "/" inicial
String[] userInfo = uri.getUserInfo().split(":", 2);
String user = userInfo[0];
String password = userInfo[1];
// Opción A: variables individuales
const dbHost = process.env.DB_HOST;
const dbPort = Number(process.env.DB_PORT);
const dbName = process.env.DB_NAME;
const dbUser = process.env.DB_USER;
const dbPassword = process.env.DB_PASSWORD;
const dbEngine = process.env.DB_ENGINE; // "mysql" o "postgres"

// Opción B: descomponer DATABASE_URL
const url = new URL(process.env.DATABASE_URL);
const scheme = url.protocol.replace(":", "");  // "mysql" o "postgresql"
const host = url.hostname;
const port = Number(url.port);
const database = url.pathname.slice(1);        // quita el "/" inicial
const user = decodeURIComponent(url.username);
const password = decodeURIComponent(url.password);

3. Respaldos

Desde la misma pestaña puedes:

  • Crear un respaldo manual en cualquier momento.
  • Descargar cualquier respaldo anterior.
  • Restaurar un respaldo (sobrescribe los datos actuales: se te pide confirmación).

4. Rotar credenciales

Si sospechas que una credencial se filtró, usa Rotar credenciales: genera un usuario/contraseña nuevos y actualiza automáticamente el entorno de tu aplicación.

5. Eliminar la base de datos

Deprovision borra el contenedor y sus datos de forma permanente. Solo puede haber una base de datos activa por instancia: si quieres cambiar de motor, primero debes eliminar la actual.

Límites y seguridad

  • Solo un administrador de la instancia puede aprovisionar, respaldar, restaurar o rotar credenciales.
  • Estas acciones están limitadas en frecuencia (por ejemplo, aprovisionar o respaldar admite unas pocas operaciones por hora) para evitar abuso accidental.
  • Los mensajes de error más comunes se explican en Errores comunes.