Українська

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

Як задеплоїти застосунок на 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, тож pethost пише 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, що віддає папку, з налаштуваннями 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, його воркер черги, базу даних і ваш наступний проєкт, без плати за проєкт і без оплати за використання. Машина працює завжди, тож відвідувач ніколи не чекає на холодний старт.

Що вже зроблено за вас: 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, а він ваш.

Чи зберігається база 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 €/міс