---
title: "Cómo desplegar una app PHP en 2026"
description: "Despliega una app PHP con un comando: pethost deploy escribe el Dockerfile para Laravel, Symfony o páginas PHP y la sirve por HTTPS, por 9,99 € al mes."
---

[Blog](https://pethost.dev/es/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 · 24 de octubre de 2026 · Actualizado 28 de octubre de 2026 · 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](https://pethost.dev/docs/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
```

- **El servidor** es FrankenPHP, construido sobre Caddy, con PHP 8.4. A la app se le indica que funciona detrás de HTTPS, así que las URL que escribe Laravel empiezan por `https://`. Se instalan las extensiones que `composer.json` requiere como `ext-…`.
- **El modo producción** se fija al iniciar, por encima del `.env` de tu equipo, y los logs van a la salida del contenedor, donde los lee `pethost logs`.
- **El archivo SQLite** está en `storage/app`, que la máquina conserva en un volumen entre despliegues, y las migraciones se ejecutan antes de que se inicie el servidor.

## 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](https://pethost.dev/es/blog/european-hosting-postgres-flat-price/)).

## 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](https://pethost.dev/es/blog/hosting-for-ai-coding-agents/).

## 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](https://pethost.dev/es/blog/unlimited-projects-flat-monthly-fee/) y sin nada medido por uso. La máquina está siempre encendida, así que un visitante [nunca espera a un arranque en frío](https://pethost.dev/es/blog/always-on-hosting-no-cold-starts/).

- **9,99 €** al mes por todos tus proyectos, nada se mide por uso
- **1 min 29 s** para construir e iniciar una app Laravel nueva, la primera vez
- **12 s** para una carpeta de páginas PHP

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](https://pethost.dev/es/#pricing) 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.](https://pethost.dev/shots/projects.webp)

### 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](https://laravel.com/docs/13.x/installation)
2. [Laravel: despliegue](https://laravel.com/docs/13.x/deployment)
3. [Symfony: instalar y configurar el framework](https://symfony.com/doc/current/setup.html)
4. [Symfony: crea tu primera página](https://symfony.com/doc/current/page_creation.html)
5. [FrankenPHP: documentación](https://frankenphp.dev/docs/)
6. [PHP: la imagen oficial de Docker](https://hub.docker.com/_/php)
7. [pethost, la línea de comandos de Pethost](https://pethost.dev/docs/cli/)

## 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](https://console.pethost.dev/)

## Sigue leyendo

- 10 de octubre de 2026 [Cómo desplegar una app Gin en 2026: un comando, HTTPS y un Dockerfile que se queda contigo](https://pethost.dev/es/blog/deploy-gin-app/) Despliega una app Go Gin con un comando: pethost deploy escribe el Dockerfile, construye el programa y lo sirve por HTTPS, por 9,99 € al mes.
- 10 de octubre de 2026 [Cómo desplegar una app Go Fiber en 2026: un comando, HTTPS y un Dockerfile que se queda contigo](https://pethost.dev/es/blog/deploy-fiber-app/) Despliega una app Go Fiber con un comando: pethost deploy escribe el Dockerfile, la construye en 45 s y la sirve por HTTPS, por 9,99 € al mes.
- 10 de octubre de 2026 [Cómo desplegar una app Nuxt en 2026: un comando, un servidor Node y HTTPS](https://pethost.dev/es/blog/deploy-nuxt-app/) Despliega una app Nuxt 4 con un comando: pethost deploy escribe el Dockerfile, ejecuta nuxt build e inicia el servidor Node por HTTPS, por 9,99 € al mes.
- 10 de octubre de 2026 [Cómo desplegar una app React Router en 2026: el Dockerfile de la plantilla, un comando y HTTPS](https://pethost.dev/es/blog/deploy-react-router-app/) Despliega una app React Router con renderizado en el servidor: pethost deploy construye su propio Dockerfile y la sirve por HTTPS en 11 s, por 9,99 € al mes.

[Todos los artículos](https://pethost.dev/es/blog/) · [Sobre Pethost](https://pethost.dev/about/) · [Precios](https://pethost.dev/es/#pricing)

Pethost · Stephan Gomer · NIP 1133096755

Pethost

- [Plantillas](https://pethost.dev/es/templates/)
- [Sobre nosotros](https://pethost.dev/about/)
- [Docs](https://pethost.dev/docs/)
- [Blog](https://pethost.dev/es/blog/)
- [API](https://pethost.dev/docs/api/)
- [CLI](https://pethost.dev/docs/cli/)
- [Plugin](https://github.com/pethost-dev/plugin)
- [Términos](https://pethost.dev/terms/)
- [Privacidad](https://pethost.dev/privacy/)
- [Reembolsos](https://pethost.dev/refunds/)
- [support@pethost.dev](mailto:support@pethost.dev)

Bases de datos

- [Postgres](https://pethost.dev/es/postgres/)

Comparativas

- [Coolify vs Dokploy vs CapRover vs Dokku](https://pethost.dev/es/blog/coolify-vs-dokploy-vs-caprover-vs-dokku/)
- [Coolify Cloud vs Dokploy Cloud](https://pethost.dev/es/blog/coolify-cloud-vs-dokploy-cloud/)
- [Precios de Railway vs Render vs Fly.io](https://pethost.dev/es/blog/railway-vs-render-vs-fly-io-pricing/)
- [Hosting gestionado para Docker Compose](https://pethost.dev/es/blog/managed-docker-compose-hosting/)

Alternativas

- [Alternativas a Railway](https://pethost.dev/es/blog/railway-alternatives/)
- [Alternativas a Heroku](https://pethost.dev/es/blog/heroku-alternatives/)
- [Alternativas a Dokploy](https://pethost.dev/es/blog/dokploy-alternatives/)
- [Alternativas a Coolify](https://pethost.dev/es/blog/coolify-alternatives/)
- [Alternativas a Render](https://pethost.dev/es/blog/render-alternatives/)
- [Alternativas a Sliplane](https://pethost.dev/es/blog/sliplane-alternatives/)
