Русский

Блог · Гайды по деплою

Как задеплоить PHP-приложение в 2026: Laravel, Symfony или простые PHP-страницы одной командой

Команда Pethost · · Обновлено · 10 мин чтения

У вас есть PHP-приложение, которое работает на ноутбуке: проект на Laravel, проект на Symfony или папка со страницами .php. Вы хотите выложить его в сеть с HTTPS и не настраивать сервер. На Pethost это одна команда, pethost deploy, в папке приложения: она пишет Dockerfile, собирает приложение на вашей машине Pethost и печатает его адрес. Свежий проект из laravel new собрался и запустился за 1 минуту 29 секунд, а папка из двух страниц — за 12 секунд.

Коротко
  • Одна команда: pethost deploy в папке с composer.json или с index.php для простых страниц. Писать файл конфигурации не нужно.
  • Laravel и Symfony работают на FrankenPHP с PHP 8.4. pethost запускает composer install, собирает ассеты Vite и запускает приложение в режиме production.
  • Простые PHP-страницы работают на Apache, с вашими файлами .htaccess и mod_rewrite.
  • База SQLite в Laravel хранится в томе, а миграции выполняются при каждом запуске, так что новый деплой сохраняет данные.
  • Цена: 9,99 € в месяц за 2 vCPU, 3 GB и 30 GB — для всех ваших проектов. Бесплатного тарифа нет.

Что нужно, чтобы задеплоить PHP-приложение в 2026 году

Три вещи: само приложение, команда pethost и аккаунт Pethost.

Приложение — это папка на вашем компьютере: здесь проект, созданный laravel new, скелет Symfony с одной страницей и две страницы на чистом PHP. Docker на компьютере не нужен: образ собирается на вашей машине Pethost.

Команда — это одна программа, которая ставится одной строкой. Все ее команды есть в справочнике CLI.

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

Аккаунту нужен тариф. Если вы не вошли, pethost deploy откроет браузер, и вы войдете. Если тарифа еще нет, команда покажет, где его выбрать, и подождет.

Деплой приложения на Laravel

Приложение — то, что оставляет установщик Laravel: laravel new example-app без стартового набора, с базой SQLite и Pest, плюс npm install и сборка, которые запускает сам установщик. Перейдите в его папку и запустите pethost deploy. Вот весь экран:

$ 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. Она спрашивает одно Имя проекта — первое слово его адреса. Enter берет имя папки.
  2. Машина не находит, что запускать Строка с крестиком — ее ответ: проект запускается из Dockerfile или Compose-файла, а в папке пока нет ни того, ни другого.
  3. pethost пишет Dockerfile composer.json требует laravel/framework, поэтому он пишет Dockerfile для Laravel и загружает папку снова.
  4. Машина собирает и запускает его Затем pethost открывает адрес и печатает ответ: 200, приветственная страница Laravel.

Ваш .env, вместе с APP_KEY, стал собственным файлом проекта на машине. .pethost говорит, какой проект у этой папки: закоммитьте его вместе с Dockerfile, и следующий деплой ничего не спросит.

Dockerfile, который pethost пишет для Laravel

Вот главные строки файла, который появляется в папке. В его 54 строках комментарии объясняют, зачем нужен каждый шаг:

# 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

Как запускать команды artisan на машине

pethost run выполняет одну команду в контейнере приложения. Вот собственные миграции Laravel после трех деплоев:

$ 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

Все три — в batch 1: они выполнились при первом запуске, и база пережила два деплоя после него. pethost run -- php artisan db:seed --force заполняет ее из ваших сидеров, как и говорила строка с тильдой, а pethost shell открывает шелл для php artisan tinker.

Проект на Laravel, у которого в .env указан MySQL или Postgres, Dockerfile не получает: база должна работать рядом с ним. pethost так и говорит:

✗ /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.

Файл compose.yaml с приложением и его базой запускается как написан. Или создайте базу данных в один клик, без доплаты, и подключите ее к приложению: MariaDB для приложения, сделанного под MySQL, или Postgres (Postgres по фиксированной цене).

Деплой приложения на Symfony

Приложение — скелет Symfony, composer create-project symfony/skeleton my-project (то же, что symfony new my-project), с контроллером из руководства Symfony «Создайте свою первую страницу»: src/Controller/LuckyController.php, у которого маршрут /lucky/number отвечает случайным числом. Его деплоит та же команда:

$ 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

Ответ — 404, потому что у приложения нет маршрута на /, а в production Symfony не показывает приветственную страницу. Откройте маршрут, который есть:

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

Dockerfile для Symfony — это Dockerfile для Laravel без Node и базы данных. APP_ENV=prod задается для composer install, который прогревает кеш, и при запуске — поверх .env, который в Symfony коммитится с APP_ENV=dev. Ассеты AssetMapper компилируются при сборке. Проект с сущностями Doctrine в src/Entity Dockerfile не получает: ему нужен compose.yaml с базой данных.

Деплой простых PHP-страниц

Без фреймворка и без Composer: папка с index.php, который показывает форму, и hello.php, который читает $_POST['name'] и здоровается.

$ 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>

Dockerfile здесь — официальный образ PHP php:8.4-apache, который отдает папку, с production-настройками PHP. Файлы .htaccess работают, mod_rewrite включен. Прочтите строку с тильдой: каждый файл папки публичен, поэтому секрет кладите в переменные проекта. Страницам, которые открывают базу данных через mysqli или PDO, нужен compose.yaml с этой базой, и pethost так и скажет.

Изменить код и задеплоить снова

Добавьте маршрут в routes/web.php и запустите ту же команду:

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

Обратите внимание на вторую строку: после первого деплоя машина хранит .env проекта, а не тот, что на вашем ноутбуке. pethost env set меняет переменную и сразу деплоит:

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

Имя без значения запрашивает секрет, не показывая его: pethost env set MAIL_PASSWORD. pethost github sam/example-app с этого момента деплоит каждый пуш, а pethost rollback возвращает предыдущую версию. ИИ-агент может делать все это через MCP-сервер Pethost: как агент деплоит проект и следит за ним.

Свой домен для PHP-приложения

Любое имя в домене вашего аккаунта работает сразу, с HTTPS. Для своего домена нужны одна команда и одна DNS-запись:

pethost domain add www.example.com

Команда печатает запись: CNAME на имя вашей машины. Сертификат появится, как только имя начнет указывать на машину, и продлевается сам.

Что вы получаете за эту цену

Pethost стоит 9,99 € в месяц за все, что вы размещаете, на 2 vCPU, 3 GB памяти и 30 GB диска. Этого хватит на приложение Laravel, его воркер очереди, базу данных и ваш следующий проект, без платы за проект и без счетчиков. Машина работает всегда, поэтому посетитель никогда не ждет холодного старта.

Что уже сделано за вас: HTTPS с сертификатами, которые продлеваются сами, деплой из GitHub, ночные бэкапы, которые хранятся 14 дней, SSH в любой контейнер и учет каждого запроса без скриптов на ваших страницах. Тарифы — в разделе с ценами на главной странице.

Каждый проект подписан. Семь проектов на одной машине Starter: приложения с адресами и запросами за последние сутки, базы данных с приложениями, которые их используют.
Первая страница панели Pethost: CPU, память и диск машины и ее проекты в виде карточек.

Pethost — лучший выбор для

  • PHP-разработчиков с приложением на Laravel или Symfony, которые хотят выложить его в сеть, не обслуживая сервер
  • Тех, кто уходит с виртуального хостинга с папкой PHP-страниц и планирует еще несколько проектов
  • Тех, за кого деплоит агент: Claude Code или Codex выкладывает приложение в сеть и читает его логи
  • Стартапов на ранней стадии, которым нужны фиксированные расходы в месяц, пока продукт небольшой

Ищите другое, если

  • Вашему приложению нужны несколько регионов или автомасштабирование

Вопросы

Как задеплоить PHP-приложение без Dockerfile?

Запустите pethost deploy в папке приложения. Для проекта на Laravel или Symfony или папки с index.php команда сама пишет Dockerfile и деплоит проект. Файл остается в вашей папке, и вы можете его менять.

Какая версия PHP на Pethost?

Dockerfile, которые пишет pethost, запускают PHP 8.4: на FrankenPHP для Laravel и Symfony, на Apache для простых страниц. Версия указана в строке FROM в Dockerfile, а Dockerfile — ваш.

Сохранится ли база SQLite в Laravel после нового деплоя?

Да. Файл лежит в папке storage/app, которую машина хранит в томе, и при каждом запуске выполняется php artisan migrate --force. Через два деплоя миграции по-прежнему были в batch 1.

Можно ли задеплоить Laravel с MySQL или Postgres?

Да, с compose.yaml, который запускает приложение рядом с его базой: Dockerfile для него pethost не пишет и так и говорит. Или подключите приложение к базе, созданной в один клик без доплаты: MariaDB для приложения под MySQL или Postgres.

Сколько стоит хостинг PHP-приложения на Pethost?

9,99 € в месяц за Starter с 2 vCPU, 3 GB и 30 GB и без платы за проект: ваши другие приложения и базы работают там же. Бесплатного тарифа нет. Цены указаны без НДС.

На экранах — деплои на нашей тестовой машине с pethost 0.2.4: проект, созданный установщиком Laravel 5.32.0 (Laravel 13.38.0), скелет Symfony 8.1.9 и две страницы на чистом PHP, все на PHP 8.4.27. Первым был деплой Laravel; деплой Symfony использовал образ FrankenPHP, который тот уже скачал. Аккаунт на экранах — учебный, sam.

  1. Laravel: установка
  2. Laravel: деплой
  3. Symfony: установка и настройка фреймворка
  4. Symfony: создание первой страницы
  5. FrankenPHP: документация
  6. PHP: официальный образ Docker
  7. pethost — командная строка Pethost

Запустите свои проекты уже сегодня

Деплойте приложения, ботов и базы данных из агента, с GitHub или в браузере, сколько поместится, по одной фиксированной цене. Ничего по счётчику, ничего сверху.

Разместить проекты за 9,99 €/мес