Блог · Гайди з деплою
Як задеплоїти застосунок на 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, тож pethost пише 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, що віддає папку, з налаштуваннями PHP для production. Файли .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, а він ваш.
Чи зберігається база 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 або в браузері, скільки поміститься, за однією фіксованою ціною. Нічого за лічильником, нічого зверху.