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:
- Elige el motor:
mysqlopostgres(los motores disponibles dependen de lo que el operador haya habilitado para tu instancia). - 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.