6.2 Aplicación simple con estructura precaria de laravel
En este tema vamos a crear una aplicación simple con una estructura de carpetas precaria, que nos servirá para aprender a desplegar aplicaciones web en un servidor remoto. La aplicación será una simple página que muestra información del servidor y de la base de datos.
En este caso, vamos a utilizar esta aplicación como ejemplo para aprender a desplegar aplicaciones web en un servidor remoto donde tendremos que modificar la estructura de carpetas para que se adapte a las limitaciones del servidor.
Lo aprendido en nos servirá para comprender el despliegue de laravel y otras aplicaciones web más complejas, ya que la mayoría de los servidores tienen limitaciones similares y es importante conocer cómo adaptarse a ellas.
Nota
Vamos a utilizar un servidor gratuito de InfinityFree para realizar el despliegue, pero los conceptos son aplicables a cualquier servidor web. En este caso, vamos a utilizar GitHub Actions para automatizar el proceso de despliegue y aprender a configurar un flujo de trabajo básico. Por tanto es indispensable que tengamos una cuenta en GitHub, que tengamos conocimientos básicos de Git y GitHub, y que tengamos el repositorio creado para seguir esta práctica.
6.1 Estructura de carpetas en local
El fichero index.php es el punto de entrada de la aplicación y se encargará de cargar la configuración y mostrar información del servidor. Los archivos db.php y server.php son archivos de configuración que se cargarán en el index.php. Nuestro script index.php detectará si se está ejecutando en local o en producción y cargará la configuración adecuada.
Contenido del archivo index.php:
<?php
if (file_exists(__DIR__ . '/../config/db.php')) {
echo "ejecución en local <br>";
$configPath = __DIR__ . '/../config/';
} elseif (file_exists(__DIR__ . '/src/config/db.php')) {
echo "ejecución en producción <br>";
$configPath = __DIR__ . '/src/config/';
} else {
die("Error: No se encontró el directorio config.");
}
require_once $configPath . 'db.php';
require_once $configPath . 'server.php';
phpinfo();
Contenido del archivo db.php:
Contenido del archivo server.php:
6.2 Primer despliegue, primer contacto con GitHub Actions
Ahora tenemos que despegar la aplicación anterior en un servidor compartido remoto, donde se nos obliga a que todas las aplicaciones se suban a una carpeta llamada htdocs. En este caso, vamos a utilizar un servidor gratuito de InfinityFree.
Lo más sencillo sería utilizar FTP y subir los archivos a la carpeta htdocs. Pero para aprender a automatizar el proceso de despliegue, vamos a utilizar GitHub Actions para realizar el despliegue de manera automática.
Como podemos ver el contenido de /src va a una carpeta /src dentro de /htdocs ya que el servidor no nos permite subir ficheros fuera de /htdocs.
La carpeta public que tiene los archivos que se exponen al público, en este caso index.php, se ha movido a htdocs para que sea accesible desde la web.
Todo esto lo tiene que hacer el deploy.yml de manera automática. El contenido del archivo deploy.yml es el siguiente:
name: Deploy to InfinityFree
on:
push:
branches:
- main
jobs:
ftp-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Upload public files to htdocs/
uses: SamKirkland/FTP-Deploy-Action@4.1.0
with:
server: ${{ secrets.FTP_SERVER }}
username: ${{ secrets.FTP_USERNAME }}
password: ${{ secrets.FTP_PASSWORD }}
local-dir: ./src/public/
server-dir: /htdocs/
- name: Upload src files (excluding public) to htdocs/src/
run: |
# Crear carpeta temporal para copiar sin public
mkdir temp_src
shopt -s extglob
cp -r src/!(public) temp_src/
shell: bash
- name: Upload src (except public) to htdocs/src
uses: SamKirkland/FTP-Deploy-Action@4.1.0
with:
server: ${{ secrets.FTP_SERVER }}
username: ${{ secrets.FTP_USERNAME }}
password: ${{ secrets.FTP_PASSWORD }}
local-dir: ./temp_src/
server-dir: /htdocs/src/
Hemos tenido que crear los secretos FTP_SERVER, FTP_USERNAME y FTP_PASSWORD en GitHub para que la acción de despliegue pueda acceder al servidor FTP. (los datos son ejemplos de ìnfinityfree.net`)
- secrets.FTP_SERVER: Dirección del servidor FTP. (
ftpupload.net) - secrets.FTP_USERNAME: Nombre de usuario para acceder al servidor FTP. (
if0_39075476) - secrets.FTP_PASSWORD: Contraseña para acceder al servidor FTP. (
*********)
El apartado secrets en GitHub Actions nos permite almacenar información sensible de forma segura, como contraseñas o claves de acceso, sin exponerlas directamente en el código. Lo podemos encontrar en la sección de Settings del repositorio, en la pestaña Secrets and variables.
6.3 Despliegue en producción
Si todo ha ido bien, al hacer un push a la rama main, se ejecutará el flujo de trabajo de GitHub Actions y se desplegará la aplicación en el servidor remoto. Podemos comprobar el estado del flujo de trabajo en la pestaña Actions del repositorio en GitHub. Existe un apartado de logs donde podemos ver el registro de la ejecución del flujo de trabajo y detectar posibles errores.
Una vez ha terminado tenemos que verificar que la aplicación funciona correctamente accediendo a la URL del servidor remoto.
Nota
En este caso, la URL del servidor remoto será la que nos proporciona InfinityFree, que suele ser algo como https://test-laravel.infy.uk/ o similar. Esta URL es la que debemos utilizar para acceder a la aplicación desplegada.
En mi ejemplo:
6.4 Seguridad y protección de la aplicación
Ahora mismo tenemos un grave problema de seguridad, ya que al poner todos los archivos dentro de htdocs, todos quedan expuestos. La solución en otros servidores es solo exponer la carpeta public y el resto de archivos quedan fuera del alcance del público, pero este servidor (como muchos otros gratuitos) no permite subir archivos fuera de htdocs, por lo que tendremos que buscar una solución alternativa. Una posible solución es crear un archivo .htaccess en la carpeta htdocs para restringir el acceso a ciertos archivos o carpetas, o poner un archivo .htaccess en todas las carpetas que queramos proteger.
Resumen
En este tutorial hemos creado una aplicación simple con una estructura de carpetas precaria, hemos realizado un primer despliegue en un servidor remoto y hemos configurado GitHub Actions para automatizar el proceso de despliegue. Aunque hemos encontrado un problema de seguridad al exponer todos los archivos en htdocs, hemos aprendido a configurar un flujo de trabajo básico para desplegar aplicaciones PHP en servidores remotos utilizando GitHub Actions.