Блог · Гайды по деплою
Как задеплоить PHP-приложение в 2026: Laravel, Symfony или простые PHP-страницы одной командой
У вас есть 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
- Она спрашивает одно Имя проекта — первое слово его адреса. Enter берет имя папки.
- Машина не находит, что запускать Строка с крестиком — ее ответ: проект запускается из Dockerfile или Compose-файла, а в папке пока нет ни того, ни другого.
- pethost пишет Dockerfile
composer.jsonтребуетlaravel/framework, поэтому он пишет Dockerfile для Laravel и загружает папку снова. - Машина собирает и запускает его Затем 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
- Сервер — FrankenPHP на основе Caddy, с PHP 8.4. Приложению сообщается, что оно работает за HTTPS, поэтому URL, которые пишет Laravel, начинаются с
https://. Расширения, которыеcomposer.jsonтребует какext-…, устанавливаются. - Режим production задается при запуске, поверх
.envс вашего ноутбука, а логи идут в вывод контейнера, откуда их читаетpethost logs. - Файл SQLite лежит в папке
storage/app, которую машина хранит в томе между деплоями, а миграции выполняются до запуска сервера.
Как запускать команды 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, его воркер очереди, базу данных и ваш следующий проект, без платы за проект и без счетчиков. Машина работает всегда, поэтому посетитель никогда не ждет холодного старта.
- 9,99 € в месяц за все ваши проекты, без счетчиков
- 1 мин 29 с на сборку и запуск нового приложения Laravel в первый раз
- 12 с для папки с PHP-страницами
Что уже сделано за вас: HTTPS с сертификатами, которые продлеваются сами, деплой из GitHub, ночные бэкапы, которые хранятся 14 дней, SSH в любой контейнер и учет каждого запроса без скриптов на ваших страницах. Тарифы — в разделе с ценами на главной странице.
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.
- Laravel: установка
- Laravel: деплой
- Symfony: установка и настройка фреймворка
- Symfony: создание первой страницы
- FrankenPHP: документация
- PHP: официальный образ Docker
- pethost — командная строка Pethost
Запустите свои проекты уже сегодня
Деплойте приложения, ботов и базы данных из агента, с GitHub или в браузере, сколько поместится, по одной фиксированной цене. Ничего по счётчику, ничего сверху.