Despliegue del Backend de PHP + BBDD
| Sitio: | Campus virtual DAW - damiansu |
| Curso: | Despliegue de Aplicaciones Web |
| Libro: | Despliegue del Backend de PHP + BBDD |
| Imprimido por: | Invitado |
| Día: | miércoles, 22 de abril de 2026, 10:05 |
1. Despliegue: manual
Los pasos que vamos a seguir son los siguientes:
- Preparar servidor
- Crear base de datos
- Subir backend PHP
- Importar base de datos
- Configurar conexión
- Probar
Local
↓
Export SQL
↓
FTP código
↓
Import SQL
↓
Configurar conexión1.1. Backend php
Estructura del proyecto

config/db.php (conexión a base de datos)
<?php
class Database
{
private $host = "localhost";
private $db_name = "miapp";
private $username = "usuarioapp";
private $password = "passwordseguro";
public $conn;
public function getConnection()
{
$this->conn = null;
try {
$this->conn = new PDO(
"mysql:host=" . $this->host . ";dbname=" . $this->db_name . ";charset=utf8mb4",
$this->username,
$this->password
);
// Configuración recomendada
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $exception) {
echo "Error de conexión: " . $exception->getMessage();
}
return $this->conn;
}
}
?>
Con RDS
<?php
class Database
{
private $host = 'database-cms.caswdttygyxp.us-east-1.rds.amazonaws.com';
private $port = 3306;
private $db = 'miapp';
private $user = 'admin';
private $password = 'ChuckNorris2026';
public $conn;
public function getConnection()
{
$this->conn = null;
try {
$conn = mysqli_init();
mysqli_ssl_set($conn, NULL, NULL, "./global-bundle.pem", NULL, NULL);
if (!mysqli_real_connect($conn, $this->host, $this->user, $this->password, $this->db, $this->port, NULL, MYSQLI_CLIENT_SSL)) {
throw new Exception("Connection failed: " . mysqli_connect_error());
}
$r = mysqli_query($conn, "SELECT VERSION()");
if (!$r) {
throw new Exception("Query failed: " . mysqli_error($conn));
}
$row = mysqli_fetch_row($r);
echo $row[0], "\n";
} catch (Exception $e) {
echo "Database error: " . $e->getMessage() . "\n";
} finally {
if ($conn) {
mysqli_close($conn);
}
}
}
}
?>
index.php (backend básico)
<?php
require_once "config/db.php";
header("Content-Type: application/json; charset=UTF-8");
$database = new Database();
$db = $database->getConnection();
if (!$db) {
echo json_encode(["error" => "No se pudo conectar a la base de datos"]);
exit;
}
try {
$query = "SELECT id, nombre, email FROM usuarios";
$stmt = $db->prepare($query);
$stmt->execute();
$usuarios = $stmt->fetchAll();
echo json_encode([
"status" => "ok",
"total" => count($usuarios),
"data" => $usuarios
]);
} catch (PDOException $e) {
echo json_encode([
"status" => "error",
"mensaje" => $e->getMessage()
]);
}
?>1.2. Preparar el servidor
LAMP
Apache
sudo apt update
sudo apt install apache2 php php-mysql mariadb-server php-mysqli
sudo apt install composer
1.3. Crear la base de datos
Podemos trabajar con phpMyAdmin o bien desde linea de comandos
sudo mysql
Dentro de mariadb:
CREATE DATABASE miapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'usuarioapp'@'localhost' IDENTIFIED BY 'passwordseguro';
GRANT ALL PRIVILEGES ON miapp.* TO 'usuarioapp'@'localhost';
FLUSH PRIVILEGES;
Tabla de ejemplo en MySQL
USE miapp;
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
email VARCHAR(100)
);
INSERT INTO usuarios (nombre,email) VALUES
("Ana","ana@test.com"),
("Carlos","carlos@test.com"),
("Lucia","lucia@test.com");
Salimos de mariadb
EXIT;
Comprobar la conexión a MySQL
Desde el servidor:
mysql -u usuarioapp -p miapp
SELECT * FROM usuarios;1.4. Subir el backend PHP al servidor
Con FTP / SFTP / SCP
El directorio es /var/www/html o trabajamos con virtual host.
Desde nuestro ordenador donde estamos desarrollando (Windows/Mac/Ubuntu), subimos los archivos directamente utilizando scp (ssh). Pero podríamos utilizar ftp y apuntando a esa carpeta o bien sftp. Eso sí, el usuario tiene que tener permisos.
scp -r backend/ root@IP_SERVIDOR:/var/www/html/

Elimina el archivo index.html o bien cambia el orden de ejecución de los archivos por defecto (dir.conf)
rm /var/www/html/index.html
Nos sale la página en formato json:

1.5. Mejoras genéricas
Ocultar errores en producción
// Configuración de errores (producción)
ini_set('display_errors', 0);
error_reporting(E_ALL);
Ver logs si algo falla
sudo tail -f /var/log/apache2/error.log
Probar desde terminal
curl http://IP_SERVIDOR/index.php
curl desplegando123.com2. Despliegue: git
Con git es semimanual
Tu ordenador
↓
git push
↓
Repositorio GitHub
↓
Entrar al servidor
↓
git pull2.1. Preparar el proyecto local
Creamos el repositorio en local
git init
Creamos el .gitignore para no publicar elementos en el repositorio
# Sistema / editor
.DS_Store
Thumbs.db
# Configuración sensible del proyecto (ya lo hemos subido antes)
config/db.php
.env
# Base de datos / backups
*.sql
*.dump
# Subidas de usuarios
uploads/
# Logs
*.log
#Archivos temporales
*.tmp
*.swp
# Dependencias (composer)
vendor/
# GitHub y CI
.github/
# Test o basura
tests/
node_modules/
Añadimos todos los archivos
git add .
Primer commit
git commit -m "Primer deploy backend PHP"2.2. Crear repositorio en GitHub



2.3. Preparar el servidor
En el servidor necesitas git instalado:
sudo apt install git2.4. Clonar el proyecto en el servidor
Ve al directorio web:
cd /var/www/html
Clona el repo:
sudo git clone https://github.com/TU_USUARIO/backend-php.git
Te crea:
/var/www/html/backend-php
Ajustamos permisos
sudo chown -R www-data:www-data /var/www/html/backend-php
sudo chmod -R 755 /var/www/html/backend-php
Copio el archivo de configuración que tenía en el anterior
cp -R /var/www/html/config/ .2.5. Verificación
Haces un cambio en local (Visual Studio)
echo "Nueva versión funcionando";
Subes cambios
git add .
git commit -m "Cambio en index"
git push
Entras al servidor (VPS)
ssh usuario@IP_SERVIDOR
Actualizas
cd /var/www/html/backend-php
git pull
A lo mejor no se fía
git config --global --add safe.directory /var/www/html/backend0013. CI/CD
CI/CD
Tu ordenador
↓
git push
↓
GitHub
↓
GitHub Actions
↓
Servidor (deploy automático)4. Despliegue: Contenedores
Contenedores
Docker
Docker Compose