Español

Blog · Guías de despliegue

Cómo desplegar una app PHP en 2026: Laravel, Symfony o páginas PHP sencillas con un comando

Por el equipo de Pethost · · Actualizado · 11 min de lectura

Tienes una app PHP que funciona en tu equipo: un proyecto Laravel, uno Symfony o una carpeta de páginas .php. Quieres ponerla en línea con HTTPS sin configurar un servidor. En Pethost es un comando, pethost deploy, ejecutado en la carpeta de la app: él escribe el Dockerfile, construye la app en tu máquina de Pethost e imprime su dirección. Un proyecto recién salido de laravel new se construyó e inició en 1 minuto y 29 segundos, y una carpeta de dos páginas en 12 segundos.

En resumen
  • Un comando: pethost deploy en la carpeta que tiene composer.json, o index.php si son páginas sencillas. No hay archivo de configuración que escribir.
  • Laravel y Symfony se ejecutan sobre FrankenPHP con PHP 8.4. pethost ejecuta composer install, construye los assets de Vite e inicia la app en modo producción.
  • Las páginas PHP sencillas se ejecutan sobre Apache, con tus archivos .htaccess y mod_rewrite.
  • La base de datos SQLite de Laravel se conserva en un volumen y se migra en cada inicio, así que un nuevo despliegue conserva los datos.
  • El precio: 9,99 € al mes por 2 vCPU, 3 GB y 30 GB, para todos tus proyectos. No hay plan gratuito.

Qué necesitas para desplegar una app PHP en 2026

Tres cosas: la app, el comando pethost y una cuenta de Pethost.

La app es una carpeta en tu equipo: aquí, un proyecto creado con laravel new, un esqueleto de Symfony con una página y dos páginas de PHP sin framework. No necesitas Docker en tu equipo: la imagen se construye en tu máquina de Pethost.

El comando es un solo programa, que se instala con una línea. Todos sus comandos están en la referencia de la CLI.

curl -fsSL https://pethost.dev/install.sh | sh      # macOS, Linux
irm https://pethost.dev/install.ps1 | iex           # Windows, in PowerShell

La cuenta necesita un plan. Si no has iniciado sesión, pethost deploy abre tu navegador e inicia sesión por ti. Si aún no tienes plan, te muestra dónde elegir uno, y espera.

Desplegar una app Laravel

La app es la que deja el instalador de Laravel: laravel new example-app, sin starter kit, con SQLite como base de datos, Pest, y el npm install y el build que hace el instalador. Ve a su carpeta y ejecuta pethost deploy. Esta es la pantalla entera:

$ cd example-app
$ pethost deploy
Name it [example-app]:      it will live at https://example-app.sam.pethost.app
✓ Packed 10.4k files, 51 MB   (left out node_modules · took .env from this folder)
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ Laravel project detected, wrote Dockerfile and .dockerignore.
~ The database starts empty on the machine and is migrated at each start: pethost run -- php artisan db:seed --force fills it from the project's seeders.
✓ Packed 10.4k files, 51 MB   (left out node_modules · took .env from this folder)
✓ Uploaded straight to your machine
✓ Built and started in 1 min 29 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80, a named volume at /app/storage/app
✓ app listens on 80 → https://example-app.sam.pethost.app
  It answers 200.

https://example-app.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open
  1. Pregunta una sola cosa El nombre del proyecto, la primera palabra de su dirección. Con Enter se queda el nombre de la carpeta.
  2. La máquina no encuentra nada que ejecutar La línea con la cruz es su respuesta: un proyecto se ejecuta desde un Dockerfile o un archivo de Compose, y la carpeta aún no tiene ninguno de los dos.
  3. pethost escribe el Dockerfile composer.json requiere laravel/framework, así que escribe el de Laravel y vuelve a subir la carpeta.
  4. La máquina lo construye y lo inicia Después pethost pide la dirección e imprime la respuesta: 200, la página de bienvenida de Laravel.

Tu .env, APP_KEY incluida, pasó a ser el del proyecto en la máquina. .pethost dice qué proyecto es esta carpeta: haz commit de él junto con el Dockerfile, y el siguiente despliegue no pregunta nada.

El Dockerfile que pethost escribe para Laravel

Estas son las líneas que importan del archivo que se escribe en la carpeta. Sus 54 líneas explican en comentarios por qué está cada paso:

# check=skip=JSONArgsRecommended
# Written by pethost deploy for this Laravel project: composer.json requires
# laravel/framework, package.json builds the assets with "vite build", npm installs it
# (package-lock.json), its SQLite database is kept in storage/app, with the files the
# site is given, it runs in production mode, set over the folder's .env.
# It is yours now: change it as you like. pethost does not write it again.

FROM dunglas/frankenphp:1-php8.4
…
COPY . .

RUN composer install
…
RUN npm run build

ENV DB_DATABASE=/app/storage/app/database.sqlite
# The machine keeps this directory across deploys.
VOLUME /app/storage/app
EXPOSE 80
…
CMD export APP_ENV=production APP_DEBUG=false LOG_CHANNEL=stderr DB_DATABASE=/app/storage/app/database.sqlite && \
    php artisan migrate --force && \
    exec frankenphp run --config /etc/frankenphp/Caddyfile

Ejecutar comandos artisan en la máquina

pethost run ejecuta un comando en el contenedor de la app. Aquí, las migraciones propias de Laravel, después de tres despliegues:

$ pethost run -- php artisan migrate:status
example-app (.pethost)

  Migration name .............................................. Batch / Status
  0001_01_01_000000_create_users_table ............................... [1] Ran
  0001_01_01_000001_create_cache_table ............................... [1] Ran
  0001_01_01_000002_create_jobs_table ................................ [1] Ran

Las tres están en el lote 1: se ejecutaron en el primer inicio, y la base de datos sobrevivió a los dos despliegues posteriores. pethost run -- php artisan db:seed --force la llena con tus seeders, como decía la línea de la tilde, y pethost shell abre un shell para php artisan tinker.

Un proyecto Laravel cuyo .env indica MySQL o Postgres no recibe Dockerfile, porque la base de datos debe ejecutarse a su lado. pethost lo dice:

✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
  .env names a database other than SQLite (DB_CONNECTION=pgsql), and the machine runs none beside a Dockerfile: the project needs a compose.yaml with the site and its database.

Un compose.yaml con la app y su base de datos se ejecuta tal como está escrito. O crea una base de datos con un clic, sin pagar nada más, y conéctala a la app: una MariaDB para una app hecha para MySQL, o un Postgres (Postgres a precio fijo).

Desplegar una app Symfony

La app es el esqueleto de Symfony, composer create-project symfony/skeleton my-project (lo mismo que symfony new my-project), con el controlador de “Create your First Page” de Symfony: src/Controller/LuckyController.php, cuya ruta /lucky/number responde con un número aleatorio. El mismo comando la despliega:

$ cd my-project
$ pethost deploy
Name it [my-project]:        it will live at https://my-project.sam.pethost.app
✓ Packed 1.7k files, 7.9 MB   (took .env from this folder)
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ Symfony project detected, wrote Dockerfile and .dockerignore.
✓ Packed 1.7k files, 7.9 MB   (took .env from this folder)
✓ Uploaded straight to your machine
✓ Built and started in 57 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80
✓ app listens on 80 → https://my-project.sam.pethost.app
  It answers 404.

https://my-project.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open

La respuesta es 404 porque la app no tiene ruta en /, y en producción Symfony no muestra página de bienvenida. Pide la ruta que sí existe:

$ curl https://my-project.sam.pethost.app/lucky/number
<html><body>Lucky number: 27</body></html>

El Dockerfile de Symfony es el de Laravel sin Node y sin la base de datos. APP_ENV=prod se fija para composer install, que calienta la caché, y al iniciar, por encima del .env que Symfony incluye en el repositorio con APP_ENV=dev. Los assets de AssetMapper se compilan en el build. Un proyecto con entidades de Doctrine en src/Entity no recibe Dockerfile: necesita un compose.yaml con su base de datos.

Desplegar páginas PHP sencillas

Sin framework y sin Composer: una carpeta con index.php, que muestra un formulario, y hello.php, que lee $_POST['name'] y saluda.

$ cd my-site
$ pethost deploy
Name it [my-site]:              it will live at https://my-site.sam.pethost.app
✓ Packed 2 files, 604 B
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ PHP site detected, wrote Dockerfile.
~ Every file of the folder is public at its address, but for the Dockerfile and names that begin with a dot.
✓ Packed 3 files, 1 KB
✓ Uploaded straight to your machine
✓ Built and started in 12 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80
✓ app listens on 80 → https://my-site.sam.pethost.app
  It answers 200.

https://my-site.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open
$ curl -d name=Sam https://my-site.sam.pethost.app/hello.php
…
  <p>Hello, Sam!</p>

El Dockerfile es la imagen oficial de PHP, php:8.4-apache, que sirve la carpeta con la configuración de producción de PHP. Los archivos .htaccess funcionan, con mod_rewrite activado. Lee la línea de la tilde: cada archivo de la carpeta es público, así que un secreto va en las variables del proyecto. Las páginas que abren una base de datos con mysqli o PDO necesitan un compose.yaml con ella, y pethost lo dice.

Cambiar el código y volver a desplegar

Agrega una ruta a routes/web.php y ejecuta el mismo comando:

Route::get('/hello', function () {
    return 'Hello from Laravel!';
});
$ pethost deploy
example-app (.pethost)
✓ Packed 10.4k files · uploaded · built and started in 48 s
  · kept the project's .env in place of the version's own: after the first deploy the project's is kept
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80, a named volume at /app/storage/app
  · kept the project's x-pethost
  It answers 200.
https://example-app.sam.pethost.app
To send this folder's .env:  pethost env push

Fíjate en la segunda línea: después del primer despliegue, la máquina conserva el .env del proyecto, no el de tu equipo. pethost env set cambia una variable y despliega al momento:

$ pethost env set APP_URL=https://example-app.sam.pethost.app
example-app (.pethost)
✓ /.env has APP_URL now. Deployed in 48 s.

Un nombre solo pide un secreto sin mostrarlo: pethost env set MAIL_PASSWORD. pethost github sam/example-app despliega cada push a partir de entonces, y pethost rollback vuelve a la versión anterior. Un agente de IA puede hacer todo esto a través del servidor MCP de Pethost: cómo un agente despliega y cuida un proyecto.

Usar tu propio dominio para la app PHP

Cualquier nombre bajo el dominio de tu cuenta funciona desde el primer momento, con HTTPS. Un dominio tuyo lleva un comando y un registro DNS:

pethost domain add www.example.com

El comando imprime el registro: un CNAME al nombre de tu máquina. El certificado llega en cuanto el nombre resuelve, y se renueva solo.

Qué obtienes por el precio

Pethost cuesta 9,99 € al mes por todo lo que alojas, con 2 vCPU, 3 GB de memoria y 30 GB de disco. Hay sitio para la app Laravel, su worker de colas, una base de datos y tu próximo proyecto, sin pagar por proyecto y sin nada medido por uso. La máquina está siempre encendida, así que un visitante nunca espera a un arranque en frío.

Lo que ya está hecho por ti: HTTPS con certificados que se renuevan solos, despliegues desde GitHub, backups cada noche conservados 14 días, SSH a cualquier contenedor y cada petición contada, sin ningún script en tus páginas. Los planes están en la parte de precios de la página principal.

Cada proyecto, a la vista. Siete proyectos en una máquina Starter: las apps con sus direcciones y las peticiones del último día, las bases de datos con las apps que las usan.
La página principal del panel de Pethost: la CPU, la memoria y el disco de la máquina, y sus proyectos como tarjetas.

Pethost es la mejor opción para

  • Desarrolladores PHP con una app Laravel o Symfony que quieren ponerla en línea sin administrar un servidor
  • Quien deja el hosting compartido con una carpeta de páginas PHP y algunos proyectos más por venir
  • Quien deja que su agente despliegue por él: Claude Code o Codex pone la app en línea y lee sus logs
  • Startups en sus inicios que quieren un gasto mensual fijo mientras el producto es pequeño

Busca otra opción si

  • Tu aplicación necesita varias regiones o autoescalado

Preguntas

¿Cómo despliego una app PHP sin escribir un Dockerfile?

Ejecuta pethost deploy en la carpeta de la app. Para un proyecto Laravel o Symfony, o una carpeta con index.php, escribe el Dockerfile y lo despliega. El archivo se queda en tu carpeta para que lo cambies.

¿Qué versión de PHP usa Pethost?

Los Dockerfiles que escribe pethost usan PHP 8.4: sobre FrankenPHP para Laravel y Symfony, sobre Apache para páginas sencillas. La versión está en la línea FROM del Dockerfile, que es tuyo.

¿La base de datos SQLite de Laravel sobrevive a un nuevo despliegue?

Sí. El archivo está en storage/app, que la máquina conserva en un volumen, y cada inicio ejecuta php artisan migrate --force. Dos despliegues después, las migraciones seguían en el lote 1.

¿Puedo desplegar una app Laravel con MySQL o Postgres?

Sí, con un compose.yaml que ejecute la app junto a su base de datos: pethost no escribe Dockerfile para ella, y lo dice. O conecta la app a una base de datos creada con un clic, sin pagar nada más: una MariaDB para una app hecha para MySQL, o un Postgres.

¿Cuánto cuesta alojar una app PHP en Pethost?

9,99 € al mes por Starter, con 2 vCPU, 3 GB y 30 GB y sin pagar por proyecto: tus otras apps y bases de datos también se ejecutan ahí. No hay plan gratuito. Los precios son sin IVA.

Las pantallas son despliegues en una máquina de pruebas nuestra, con pethost 0.2.4: un proyecto creado con el instalador de Laravel 5.32.0 (Laravel 13.38.0), el esqueleto de Symfony 8.1.9 y dos páginas de PHP sin framework, todo con PHP 8.4.27. El despliegue de Laravel fue el primero; el de Symfony usó la imagen de FrankenPHP que aquel había descargado. La cuenta que aparece es la de ejemplo, sam.

  1. Laravel: instalación
  2. Laravel: despliegue
  3. Symfony: instalar y configurar el framework
  4. Symfony: crea tu primera página
  5. FrankenPHP: documentación
  6. PHP: la imagen oficial de Docker
  7. pethost, la línea de comandos de Pethost

Pon tus proyectos en línea hoy

Despliega apps, bots y bases de datos desde tu agente, GitHub o el navegador, tantos como quepan, a un precio fijo. Nada medido, nada cobrado aparte.

Alojar todos tus proyectos por 9,99 €/mes