Proyecto Loot Figures — Parte 1: implantación en XAMPP y Ubuntu Server

1. Presentación del proyecto

En esta actividad vamos a implantar Loot Figures, una tienda web de figuras de plástico inspiradas en personajes de videojuegos.

La aplicación ya está desarrollada. Nuestro trabajo consistirá en examinar sus archivos, preparar los entornos necesarios, configurar la base de datos y conseguir que funcione en dos instalaciones diferentes:

  1. En nuestro ordenador, utilizando XAMPP.
  2. En la máquina virtual Ubuntu Server que hemos preparado en clase.

Además de conseguir que la tienda se abra en el navegador, tendremos que comprobar sus funciones y documentar el procedimiento.

Implantar una aplicación no consiste únicamente en copiar archivos. También debemos identificar sus requisitos, configurar los servicios, preparar la base de datos, ajustar permisos y comprobar que todo funciona correctamente.


2. Objetivos de aprendizaje

Al terminar esta primera parte, deberás ser capaz de:

  • Identificar los archivos y las carpetas de una aplicación PHP.
  • Abrir un proyecto completo en VS Code o PhpStorm.
  • Reconocer la función de los modelos, los DAO y los archivos que reciben datos.
  • Diferenciar el código PHP del código que ejecuta el navegador.
  • Preparar un entorno con Apache, PHP y MySQL o MariaDB.
  • Crear una base de datos e importar su estructura.
  • Configurar la conexión entre PHP y la base de datos.
  • Ejecutar un script de carga de datos.
  • Configurar Apache para servir la carpeta pública del proyecto.
  • Implantar la misma aplicación en Windows y Ubuntu Server.
  • Comprobar su funcionamiento y resolver incidencias.
  • Elaborar documentación técnica que permita repetir la instalación.

3. Material necesario

Para realizar la actividad necesitarás:

  • El archivo del proyecto: loot-figures-php-clase.zip.
  • Un ordenador con XAMPP.
  • VS Code o PhpStorm.
  • Un navegador web.
  • La máquina virtual Ubuntu Server utilizada en clase.
  • Un usuario de Ubuntu con permisos para ejecutar sudo.
  • Conexión entre tu ordenador y la máquina virtual.

La aplicación utiliza PHP 8.x, una base de datos MySQL o MariaDB y las extensiones PHP necesarias para trabajar con mysqli, sesiones y archivos.

En esta primera parte no utilizaremos Docker. Vamos a preparar los servicios directamente para comprender qué necesita la aplicación.

4. Resultado que debes conseguir

Al finalizar, tendrás dos instalaciones independientes:

EntornoAplicaciónBase de datosAcceso
Ordenador con XAMPPCopia local del proyectoBase de datos de XAMPPhttp://localhost:8080
Máquina virtual Ubuntu ServerCopia del proyecto en el servidorBase de datos de Ubuntuhttp://IP_DEL_SERVIDOR:8080

Cada instalación tendrá su propia base de datos.

Los cambios realizados en una instalación no aparecerán automáticamente en la otra.

Utilizaremos el puerto 8080 para la tienda. De esta forma, podemos conservar las páginas o servicios que ya estén utilizando el puerto 80.


Bloque A. Examinar el proyecto antes de instalarlo

5. Descargar y descomprimir los archivos

Descarga el ZIP proporcionado por el profesor y descomprímelo.

La carpeta principal del proyecto se llama:

loot-figures-clase

Comprueba que dentro aparecen, entre otras, estas carpetas:

app
config
database
docs
public
scripts

No comiences modificando archivos. Primero vamos a identificar qué contiene el proyecto.

6. Abrir el proyecto en VS Code o PhpStorm

Opción A: VS Code

  1. Abre VS Code.
  2. Selecciona Archivo → Abrir carpeta.
  3. Elige la carpeta principal loot-figures-clase.
  4. Comprueba que aparecen todas las carpetas del proyecto en el explorador lateral.
  5. Abre el archivo README.md.

Opción B: PhpStorm

  1. Abre PhpStorm.
  2. Selecciona Open / Abrir.
  3. Elige la carpeta principal loot-figures-clase.
  4. Espera a que termine de analizar el proyecto.
  5. Abre el archivo README.md.

Debes abrir la carpeta completa, no únicamente un archivo PHP ni solo la carpeta public.

El editor nos permite consultar y modificar el código. Para ejecutar la aplicación necesitaremos un servidor PHP.

7. Reconocer las carpetas del proyecto

Examina la estructura y completa una tabla como esta en tu documentación:

Carpeta o archivo¿Para qué sirve?
app/modelosClases que representan clientes, productos, pedidos y mensajes
app/daoClases que realizan las consultas a la base de datos
app/Conexion.phpCódigo que abre la conexión con MySQL mediante mysqli
configConfiguración de la aplicación
database/schema.sqlInstrucciones SQL para crear las tablas
publicArchivos que debe servir Apache al navegador
public/apiArchivos PHP que reciben peticiones y devuelven datos
public/partialsPartes comunes: cabecera, navegación y pie
public/assetsJavaScript, CSS, logo e imágenes
public/uploadsImágenes subidas desde la administración
scripts/seed.phpScript que introduce los datos de ejemplo
docsDocumentación del proyecto

Preguntas que debes responder

  1. ¿Qué diferencia hay entre app/modelos y app/dao?
  2. ¿Qué archivo contiene la configuración de la base de datos?
  3. ¿Qué carpeta debe publicar Apache?
  4. ¿Por qué la configuración y los scripts de instalación no deben quedar dentro del directorio público?
  5. ¿Qué diferencia hay entre un archivo PHP y un archivo JavaScript?
  6. ¿Qué función tienen header.php, nav.php y footer.php?

8. Seguir una operación sencilla

Abre estos archivos:

public/api/contacto.php
app/modelos/Mensaje.php
app/dao/MensajeDAO.php

Localiza el recorrido de los datos:

  1. Se reciben los datos del formulario.
  2. Se validan.
  3. Se crea un objeto Mensaje.
  4. Se crea el DAO.
  5. El DAO inserta el mensaje en la base de datos.
  6. PHP devuelve una respuesta JSON.

Identifica estas instrucciones:

$mensaje = new Mensaje(0, $nombre, $email, $texto);

$dao = new MensajeDAO($conexion);

$dao->insertar($mensaje);

No es necesario comprender todavía todo el proyecto. En esta fase debes poder explicar qué responsabilidad tiene cada archivo.

Evidencia: incluye una captura del proyecto abierto en el editor y una explicación breve de este recorrido.


Bloque B. Implantación local con XAMPP

9. Preparar XAMPP

Si todavía no tienes XAMPP, descárgalo desde su web oficial:

Descargar XAMPP

Las instrucciones siguientes utilizan una instalación de Windows situada en:

C:\xampp

Si tu instalación está en otra ubicación, adapta las rutas.

Abre el panel de control de XAMPP e inicia:

  • Apache.
  • MySQL.

Aunque el panel muestre el nombre MySQL, XAMPP puede incluir MariaDB como motor de base de datos.

Comprueba estas direcciones:

http://localhost
http://localhost/phpmyadmin

phpMyAdmin nos permitirá gestionar la base de datos de esta instalación. En la configuración básica de XAMPP se accede a él desde el propio equipo. apachefriends.org

Evidencia: captura del panel con Apache y MySQL iniciados.

10. Colocar el proyecto

Crea esta carpeta:

C:\proyectos

Coloca dentro el proyecto descomprimido:

C:\proyectos\loot-figures-clase

Comprueba que existe:

C:\proyectos\loot-figures-clase\public\index.php

La carpeta del proyecto estará fuera de htdocs. Configuraremos Apache para que publique únicamente su carpeta public.

Después, abre esta ubicación definitiva en VS Code o PhpStorm.

11. Configurar Apache para la tienda

11.1. Revisar la carga de VirtualHosts

Abre este archivo:

C:\xampp\apache\conf\httpd.conf

Busca la línea:

Include conf/extra/httpd-vhosts.conf

Si aparece comentada con #, elimina ese carácter.

Guarda el archivo.

11.2. Añadir la configuración

Abre:

C:\xampp\apache\conf\extra\httpd-vhosts.conf

Añade al final:

Listen 8080

<VirtualHost *:8080>
    ServerName localhost

    DocumentRoot "C:/proyectos/loot-figures-clase/public"

    <Directory "C:/proyectos/loot-figures-clase/public">
        Options -Indexes
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

Importante: si ya existe una instrucción Listen 8080 en la configuración de Apache, no la añadas otra vez.

En la configuración de Apache hemos escrito las rutas con /.

¿Qué significa esta configuración?

InstrucciónFunción
Listen 8080Apache escucha también en el puerto 8080
VirtualHost *:8080Define el sitio que responderá en ese puerto
DocumentRootIndica la carpeta pública de la aplicación
AllowOverride AllPermite aplicar las instrucciones de .htaccess
Require localPermite el acceso desde el propio ordenador

Detén y vuelve a iniciar Apache desde XAMPP.

Si no arranca, revisa los mensajes y registros del servicio antes de continuar.

12. Crear la base de datos

Abre:

http://localhost/phpmyadmin

Selecciona la pestaña SQL y ejecuta:

CREATE DATABASE loot_figures
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

CREATE USER 'loot_app'@'localhost'
IDENTIFIED BY 'CambiaEstaClaveBD!';

GRANT SELECT, INSERT, UPDATE, DELETE
ON loot_figures.*
TO 'loot_app'@'localhost';

Hemos creado:

  • La base de datos loot_figures.
  • El usuario loot_app.
  • Los permisos necesarios para las operaciones de la tienda.

La aplicación utilizará este usuario, no la cuenta root.

Si la base o el usuario ya existen por un intento anterior, revisa lo que has creado antes de repetir las instrucciones. No elimines bases de datos para resolver un error sin comprobar su contenido.

13. Importar las tablas

En phpMyAdmin:

  1. Selecciona la base de datos loot_figures.
  2. Abre la pestaña Importar.
  3. Selecciona el archivo:
C:\proyectos\loot-figures-clase\database\schema.sql
  1. Ejecuta la importación.
  2. Comprueba que aparecen estas tablas:
users
products
orders
order_items
messages
login_attempts

La importación debe realizarse con la cuenta de administración de la base de datos, porque crea las tablas.

No vuelvas a importar el esquema sobre una instalación que ya tiene sus tablas.

Evidencia: captura de la base de datos con las tablas creadas.

14. Crear el archivo de configuración

Dentro de config, copia:

config.example.php

y llama a la copia:

config.php

Puedes hacerlo desde el editor o el explorador de archivos.

Edita config.php y utiliza estos valores:

<?php

return [
    'db' => [
        'host' => 'localhost',
        'port' => 3306,
        'name' => 'loot_figures',
        'user' => 'loot_app',
        'password' => 'CambiaEstaClaveBD!'
    ],

    'secure_cookie' => false,
    'debug' => false
];

Si tu servicio de base de datos utiliza otro puerto, debes cambiar el valor port.

En esta práctica trabajamos con HTTP local, por eso secure_cookie permanece en false.

No copies config.docker.php: esa configuración corresponde a otro entorno.

15. Comprobar PHP y cargar los datos de ejemplo

Abre una terminal de PowerShell.

Comprueba el PHP de XAMPP:

& "C:\xampp\php\php.exe" -v

Después, sitúate en el proyecto:

Set-Location "C:\proyectos\loot-figures-clase"

Ejecuta:

& "C:\xampp\php\php.exe" scripts/seed.php

El script creará los usuarios y productos de demostración.

Si aparece un error, comprueba:

  • Que MySQL está iniciado.
  • Que existe config/config.php.
  • Que la contraseña y el puerto son correctos.
  • Que has importado las tablas.

El archivo seed.php se ejecuta desde la terminal. No tienes que abrirlo mediante una URL.

16. Abrir la tienda en localhost

Abre:

http://localhost:8080

La tienda debería mostrar la home, el logo, las imágenes y los productos.

No abras index.php haciendo doble clic. Tampoco utilices Live Server para ejecutar esta aplicación PHP. Debes acceder mediante Apache.

Cuentas de demostración

RolCorreoContraseña
Administradoradmin@loot.localAdminDemo!2026
Clientecliente@loot.localClienteDemo!2026

Estas cuentas utilizan direcciones ficticias. No necesitas disponer de esos correos.

17. Comprobar el funcionamiento local

Realiza estas pruebas:

Zona pública

  1. Abre la home.
  2. Accede al catálogo.
  3. Busca una figura.
  4. Filtra por rareza.
  5. Cambia el orden de los productos.
  6. Abre el detalle de una figura.

Registro y cuenta

  1. Crea una cuenta con datos ficticios.
  2. Cierra sesión.
  3. Vuelve a entrar.
  4. Accede a tu perfil.
  5. Cambia el teléfono y comprueba que se guarda.

Carrito y compra

  1. Entra como cliente.
  2. Añade una figura al carrito.
  3. Cambia la cantidad.
  4. Añade otra figura.
  5. Elimina una línea.
  6. Introduce una dirección ficticia.
  7. Confirma el pedido.
  8. Comprueba que aparece en el historial.

La compra es una simulación y no realiza ningún cobro.

Administración

  1. Entra como administrador.
  2. Accede al listado de productos.
  3. Modifica el nombre, precio o stock de una figura.
  4. Comprueba el resultado en el catálogo.
  5. Crea un usuario de prueba.
  6. Modifica sus datos.
  7. Cambia su contraseña.
  8. Comprueba que puede iniciar sesión con la nueva contraseña.
  9. Sube una fotografía a un producto.

Contacto

  1. Envía un mensaje desde la página de contacto.
  2. Entra como administrador.
  3. Comprueba que el mensaje aparece en el panel.

El mensaje se guarda en la base de datos. No se envía un correo electrónico.

18. Observar una petición JSON

Abre las herramientas de desarrollo del navegador y selecciona la pestaña Red / Network.

Recarga el catálogo y localiza la petición a:

api/listar_productos.php

Examina su respuesta.

Responde:

  1. ¿Qué información contiene el JSON?
  2. ¿Qué campos identifican el nombre y el precio del producto?
  3. ¿El navegador recibe el código fuente PHP?
  4. ¿Qué archivo JavaScript utiliza esos datos para construir las tarjetas?

Después, visita:

http://localhost:8080/ejemplo_clase.php

Este formulario permite observar un envío clásico por POST.

Utiliza otra cuenta ficticia para probarlo. Después del envío verás la respuesta JSON directamente en el navegador.

Explica la diferencia entre este formulario y el registro habitual de la tienda.


Bloque C. Implantación en Ubuntu Server

19. Preparar la máquina virtual

Utiliza la máquina virtual creada en clase.

Antes de comenzar:

  1. Comprueba que puedes iniciar sesión.
  2. Identifica tu usuario.
  3. Comprueba que puedes ejecutar sudo.
  4. Anota la versión de Ubuntu.
  5. Comprueba la dirección IP.
  6. Realiza una instantánea si el programa de virtualización lo permite.

Ejecuta:

whoami
cat /etc/os-release
ip -br a

También puedes consultar:

hostname -I

En los siguientes ejemplos utilizaremos:

192.168.1.50

Es una IP de ejemplo. Debes sustituirla por la dirección real de tu servidor.

20. Comprobar la comunicación con la máquina virtual

Desde tu ordenador, intenta acceder por SSH si ya lo configuraste en clase:

ssh alumno@192.168.1.50

Sustituye alumno por tu usuario real.

Si la máquina utiliza NAT

Puede ser necesario configurar una redirección de puertos en el programa de virtualización.

Por ejemplo:

Puerto del ordenadorPuerto de UbuntuUso
222222SSH
80818080Tienda

Con esa configuración, SSH se utilizaría así:

ssh -p 2222 alumno@127.0.0.1

Y la tienda de Ubuntu se abriría desde el ordenador mediante:

http://localhost:8081

Si utilizas una red en la que el ordenador puede acceder directamente a la IP de Ubuntu, no necesitas esas redirecciones.

Documenta el modo de red que estás utilizando.

21. Instalar los servicios necesarios

En Ubuntu Server ejecuta:

sudo apt update

Después:

sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql php-cli unzip

Apache atenderá las peticiones web; PHP ejecutará el código del servidor; MySQL almacenará los datos. La documentación de Ubuntu recoge la instalación de Apache y de PHP con su módulo para Apache. Ubuntu Server documentation

Si algunos paquetes ya estaban instalados, revisa el resultado del comando: no es necesario reinstalarlos manualmente.

Activa los servicios:

sudo systemctl enable --now apache2
sudo systemctl enable --now mysql

Comprueba su estado:

systemctl status apache2 --no-pager
systemctl status mysql --no-pager

Ambos deben aparecer activos.

Evidencia: captura de los servicios funcionando.

22. Comprobar la versión y las extensiones de PHP

Ejecuta:

php -v

Después:

php -m

Comprueba que aparecen:

mysqli
mysqlnd
fileinfo
session

Anota la versión de PHP de Ubuntu y compárala con la de XAMPP.

23. Transferir el proyecto al servidor

Para esta instalación, utiliza el ZIP original entregado por el profesor. Crearemos una base de datos nueva en Ubuntu.

Puedes transferir el archivo mediante SFTP o con scp.

Ejemplo, ejecutado desde tu ordenador y desde la carpeta donde está el ZIP:

scp loot-figures-php-clase.zip alumno@192.168.1.50:~/

Si utilizas la redirección SSH del ejemplo anterior:

scp -P 2222 loot-figures-php-clase.zip alumno@127.0.0.1:~/

Observa que scp utiliza -P mayúscula para indicar el puerto.

En Ubuntu comprueba que ha llegado:

ls -lh ~/loot-figures-php-clase.zip

Descomprime:

cd ~
unzip loot-figures-php-clase.zip

Comprueba:

ls ~/loot-figures-clase

Mueve el proyecto:

sudo mv ~/loot-figures-clase /var/www/

La ubicación final será:

/var/www/loot-figures-clase

Si ya existe una carpeta con ese nombre por un intento anterior, revisa su contenido antes de repetir el movimiento.

24. Configurar Apache en Ubuntu

24.1. Añadir el puerto

Abre:

sudo nano /etc/apache2/ports.conf

Añade:

Listen 8080

Conserva las instrucciones existentes y no dupliques Listen 8080 si ya aparece.

24.2. Crear el sitio

Ejecuta:

sudo nano /etc/apache2/sites-available/loot-figures.conf

Introduce:

<VirtualHost *:8080>
    DocumentRoot /var/www/loot-figures-clase/public

    <Directory /var/www/loot-figures-clase/public>
        Options -Indexes
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/loot-figures-error.log
    CustomLog ${APACHE_LOG_DIR}/loot-figures-access.log combined
</VirtualHost>

Guarda el archivo.

Activa el sitio:

sudo a2ensite loot-figures.conf

Comprueba la sintaxis:

sudo apache2ctl configtest

Si aparece:

Syntax OK

reinicia Apache:

sudo systemctl restart apache2

No desactives los sitios anteriores de clase: esta tienda utiliza otro puerto.

25. Crear la base de datos en Ubuntu

Accede a MySQL:

sudo mysql

La instalación de MySQL mediante los paquetes de Ubuntu permite administrar el servicio y crear cuentas para las aplicaciones. Ubuntu Server documentation

Ejecuta:

CREATE DATABASE loot_figures
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

CREATE USER 'loot_app'@'localhost'
IDENTIFIED BY 'CambiaEstaClaveBD!';

GRANT SELECT, INSERT, UPDATE, DELETE
ON loot_figures.*
TO 'loot_app'@'localhost';

Sal:

EXIT;

Importa las tablas:

sudo mysql loot_figures < /var/www/loot-figures-clase/database/schema.sql

Comprueba el resultado:

sudo mysql -e "SHOW TABLES FROM loot_figures;"

Debes encontrar las mismas tablas que en XAMPP.

26. Configurar la conexión de la aplicación

Copia la plantilla:

sudo cp /var/www/loot-figures-clase/config/config.example.php /var/www/loot-figures-clase/config/config.php

Edita:

sudo nano /var/www/loot-figures-clase/config/config.php

Utiliza:

<?php

return [
    'db' => [
        'host' => 'localhost',
        'port' => 3306,
        'name' => 'loot_figures',
        'user' => 'loot_app',
        'password' => 'CambiaEstaClaveBD!'
    ],

    'secure_cookie' => false,
    'debug' => false
];

La base de datos está dentro de la propia máquina Ubuntu, por eso la aplicación utiliza localhost como servidor de base de datos.

No debes poner la IP del ordenador Windows en esta configuración.

27. Preparar propietarios y permisos

Apache necesita leer los archivos del proyecto. Además, debe poder escribir en la carpeta donde se guardan las imágenes subidas.

Configura el propietario y el grupo:

sudo chown -R root:www-data /var/www/loot-figures-clase

Configura los directorios:

sudo find /var/www/loot-figures-clase -type d -exec chmod 750 {} \;

Configura los archivos:

sudo find /var/www/loot-figures-clase -type f -exec chmod 640 {} \;

Permite que Apache gestione las imágenes subidas:

sudo chown -R www-data:www-data /var/www/loot-figures-clase/public/uploads

Comprueba:

ls -ld /var/www/loot-figures-clase/public/uploads
ls -l /var/www/loot-figures-clase/config/config.php

Preguntas

  1. ¿Qué representa el usuario www-data?
  2. ¿Por qué Apache necesita permiso de escritura en uploads?
  3. ¿Por qué no necesita escribir en todos los archivos PHP?
  4. ¿Qué diferencia hay entre los permisos de un archivo y los de un directorio?

No utilices chmod 777 para resolver problemas de permisos. Debes identificar qué usuario necesita acceso y qué operación debe realizar.

28. Cargar los datos de ejemplo

Ejecuta el script utilizando el usuario que puede leer los archivos del proyecto:

sudo -u www-data php /var/www/loot-figures-clase/scripts/seed.php

Comprueba los productos:

sudo mysql -e "SELECT id, name, stock FROM loot_figures.products;"

Comprueba los usuarios sin mostrar los hashes de contraseña:

sudo mysql -e "SELECT id, name, email, role FROM loot_figures.users;"

Evidencia: captura de los datos creados.

29. Comprobar el acceso web

Desde tu ordenador abre:

http://192.168.1.50:8080

Sustituye la IP por la del servidor.

Si utilizas la redirección NAT propuesta, abre:

http://localhost:8081

Si no puedes acceder

Comprueba el estado de Apache:

systemctl status apache2 --no-pager

Comprueba los puertos:

sudo ss -lntp

Revisa el cortafuegos:

sudo ufw status

Si UFW está activo, permite el puerto de la tienda:

sudo ufw allow 8080/tcp

No es necesario activar ni desactivar el cortafuegos para realizar esta comprobación.

Consulta el registro de errores del sitio:

sudo tail -n 50 /var/log/apache2/loot-figures-error.log

Importante: escribir localhost en el navegador de tu ordenador apunta a tu ordenador. No apunta a Ubuntu, salvo que hayas configurado una redirección de puertos.

30. Repetir las pruebas funcionales

Realiza en Ubuntu las mismas pruebas que hiciste en XAMPP:

  • Navegación pública.
  • Catálogo y filtros.
  • Registro.
  • Login y cierre de sesión.
  • Edición del perfil.
  • Carrito y pedido.
  • Historial.
  • Administración de productos.
  • Administración de clientes.
  • Cambio de contraseña.
  • Subida de una imagen.
  • Envío y consulta de un mensaje.

Comprueba especialmente la subida de imágenes: permite verificar que los permisos de uploads están preparados correctamente.

31. Comprobar qué está publicando Apache

Intenta abrir:

http://IP_DEL_SERVIDOR:8080/config/config.php
http://IP_DEL_SERVIDOR:8080/database/schema.sql
http://IP_DEL_SERVIDOR:8080/scripts/seed.php

Estas direcciones no deben permitir acceder a esos archivos, porque están fuera de la carpeta pública.

En cambio, debe funcionar:

http://IP_DEL_SERVIDOR:8080/api/listar_productos.php

Esta dirección devolverá los productos en JSON.

Explica por qué unas rutas son accesibles y otras no.


Bloque D. Comparación, documentación y entrega

32. Comparar las dos instalaciones

Completa esta tabla con los datos reales de tu trabajo:

AspectoXAMPPUbuntu Server
Sistema operativo
Versión de PHP
Motor y versión de base de datos
Ubicación del proyecto
Carpeta pública
Archivo de configuración del sitio Apache
Dirección de acceso
Puerto web
Usuario de la base de datos
Gestión de permisos de uploads
Ubicación de los registros de errores

Responde también:

  1. ¿Qué pasos son iguales en los dos entornos?
  2. ¿Qué pasos cambian?
  3. ¿Qué tareas facilita XAMPP?
  4. ¿Qué servicios has tenido que preparar en Ubuntu?
  5. ¿Por qué el editor no sustituye al servidor web?
  6. ¿Dónde se ejecuta PHP?
  7. ¿Dónde se ejecuta JavaScript?
  8. ¿Por qué necesitas copiar archivos y preparar también la base de datos?

33. Registrar las pruebas

Incluye una tabla de comprobación para cada instalación:

PruebaResultado esperadoResultado obtenidoEvidencia
Abrir la homeSe muestran diseño e imágenes
Consultar catálogoSe muestran los productos
Registrar clienteSe crea la cuenta
Iniciar sesiónSe accede a la cuenta
Crear pedidoSe guarda y aparece en el historial
Editar productoEl cambio aparece en el catálogo
Cambiar contraseñaFunciona la nueva contraseña
Subir imagenSe guarda y se muestra
Enviar contactoEl administrador puede leerlo

No marques una prueba como correcta sin realizarla.

34. Documentar incidencias

Si encuentras un problema, registra:

  • Qué estabas intentando hacer.
  • El mensaje de error.
  • Qué comprobaste.
  • La causa que identificaste.
  • La solución aplicada.
  • Cómo verificaste que funcionaba.

Si no encuentras incidencias, indica las comprobaciones preventivas que has realizado: configuración, servicios, puertos, permisos y conexión a la base de datos.

35. Documentación que debes entregar

Prepara un README.md con estas secciones:

  1. Título, autor y objetivo.
  2. Descripción de la aplicación.
  3. Requisitos.
  4. Estructura del proyecto.
  5. Instalación en XAMPP.
  6. Instalación en Ubuntu Server.
  7. Configuración de Apache y base de datos.
  8. Pruebas funcionales.
  9. Incidencias y soluciones.
  10. Comparación de los entornos.
  11. Conclusiones personales.

Guarda las capturas en una carpeta:

capturas

Puedes insertarlas así:

![Panel de XAMPP con los servicios iniciados](capturas/xampp-servicios.png)

Los comandos deben aparecer en bloques de código:

```bash
sudo systemctl status apache2 --no-pager
```

La documentación debe explicar tu instalación real, con tus rutas, tu IP, tus versiones y tus resultados.

No entregues únicamente una copia de este enunciado.

36. Entrega final

Entrega un ZIP con:

  • README.md.
  • La carpeta capturas.
  • Los fragmentos de configuración necesarios para comprender tu instalación, con las contraseñas sustituidas por un marcador.

Por ejemplo:

'password' => 'CONTRASEÑA_OCULTA'

No es necesario incluir los discos de la máquina virtual ni una copia completa de XAMPP.

Conserva las dos instalaciones funcionando para poder demostrarlas en clase.

37. Comprobación final antes de entregar

  • La aplicación funciona en XAMPP.
  • La aplicación funciona en Ubuntu Server.
  • Has comprobado las funciones de cliente y administrador.
  • La subida de imágenes funciona en ambos entornos.
  • Apache sirve únicamente la carpeta public.
  • Has identificado los modelos, DAO y archivos de operaciones.
  • Has observado una respuesta JSON.
  • La documentación contiene pasos, comandos y evidencias.
  • Las capturas se visualizan correctamente en el README.
  • Puedes explicar qué has configurado y por qué.

La actividad se considerará completada cuando puedas mostrar las dos instalaciones y explicar el recorrido de una petición desde el navegador hasta la base de datos.