Hostim Docs

Деплой PHP-приложения

Эта статья дополняет общие правила из «Что нужно, чтобы деплой прошёл» конкретикой для PHP. PHP-приложение почти всегда разворачивается как Web-сервис.

Одно важное отличие от Python и Node.js: для PHP Nixpacks сам поднимает связку веб-сервера (nginx) и php-fpm и сам слушает нужный порт. Вам не нужно писать команду запуска и вручную обрабатывать порт — достаточно правильно разложить файлы.

Какой порт указать при создании сервиса. Оставьте значение по умолчанию (3000). Платформа передаёт выбранный порт в переменной PORT, а сгенерированный Nixpacks конфиг nginx слушает именно её — поэтому число согласуется автоматически, а в вашем коде порт нигде не упоминается.

Шаг 1. composer.json обязателен

Nixpacks определяет PHP по файлу composer.json в корне репозитория. Без него проект как PHP распознан не будет, даже если рядом лежат .php-файлы. Если вы не используете сторонние пакеты, всё равно добавьте минимальный composer.json:

{
  "require": {
    "php": ">=8.2"
  }
}

Если зависимости есть — закоммитьте вместе с composer.json файл composer.lock.

Шаг 2. Корень документа — где лежит index.php

Веб-сервер отдаёт файлы из корня документа (document root). Nixpacks определяет его так:

  • если в репозитории есть каталог public/ — корнем становится он;
  • иначе — корень репозитория.

Это соглашение современных фреймворков (Laravel, Symfony), где точка входа — public/index.php. Для приложения без фреймворка положите точку входа в public/index.php — так публичным будет только он, а остальной код останется недоступен из интернета.

Если структура нестандартная, укажите корень явно переменной окружения сервиса NIXPACKS_PHP_ROOT (например, /app/public).

Пример: простое приложение

composer.json:

{
  "require": {
    "php": ">=8.2"
  }
}

public/index.php:

<?php
header("Content-Type: application/json");
echo json_encode(["status" => "ok"]);

Этого достаточно: Nixpacks установит PHP, настроит веб-сервер на каталог public/ и запустит приложение.

Laravel и Symfony

Каталог public/ в них уже настроен как корень документа — отдельных действий не требуется. Два момента:

  • Переменные окружения. Задайте обязательные переменные сервиса: для Laravel это как минимум APP_KEY и параметры подключения к базе данных (DB_*). Без APP_KEY приложение вернёт ошибку 500. См. «Переменные окружения и секреты».
  • Миграции базы данных выполняются отдельно и в этой версии платформы автоматически не запускаются.

Версия PHP

Укажите её в composer.json в поле require.php (как в примерах выше) или переменной окружения NIXPACKS_PHP_VERSION (например, 8.3).

Частые ошибки

СимптомПричинаРешение
Сборка не распознаёт PHPНет composer.json в корнеДобавьте минимальный composer.json
На всех страницах 404index.php не в корне документаПоложите точку входа в public/ или задайте NIXPACKS_PHP_ROOT
Laravel возвращает 500Не задан APP_KEYЗадайте APP_KEY в переменных окружения
Приложение не видит базу данныхЗахардкожены локальные параметры подключенияВынесите DB_* в переменные окружения

Дальше