Джерело: https://laravelukraine.com/docs/13.x/deployment

# Розгортання

- [Вступ](#introduction)
- [Вимоги до сервера](#server-requirements)
- [Конфігурація сервера](#server-configuration)
    - [Nginx](#nginx)
    - [FrankenPHP](#frankenphp)
    - [Права на каталоги](#directory-permissions)
- [Оптимізація](#optimization)
    - [Кешування конфігурації](#optimizing-configuration-loading)
    - [Кешування подій](#caching-events)
    - [Кешування маршрутів](#optimizing-route-loading)
    - [Кешування представлень](#optimizing-view-loading)
- [Перезавантаження сервісів](#reloading-services)
- [Режим налагодження](#debug-mode)
- [Маршрут перевірки стану](#the-health-route)
- [Розгортання за допомогою Laravel Cloud чи Forge](#deploying-with-cloud-or-forge)

<a name="introduction"></a>
## Вступ

Коли ви готові розгорнути свій застосунок Laravel у продакшені, є кілька важливих речей, які варто зробити, щоб застосунок працював якомога ефективніше. У цьому документі ми розглянемо гарні відправні точки для правильного розгортання вашого застосунку Laravel.

<a name="server-requirements"></a>
## Вимоги до сервера

Фреймворк Laravel має кілька системних вимог. Переконайтеся, що ваш веб-сервер має таку мінімальну версію PHP і розширення:

<div class="content-list" markdown="1">

- PHP >= 8.3
- Розширення PHP Ctype
- Розширення PHP cURL
- Розширення PHP DOM
- Розширення PHP Fileinfo
- Розширення PHP Filter
- Розширення PHP Hash
- Розширення PHP Mbstring
- Розширення PHP OpenSSL
- Розширення PHP PCRE
- Розширення PHP PDO
- Розширення PHP Session
- Розширення PHP Tokenizer
- Розширення PHP XML

</div>

<a name="server-configuration"></a>
## Конфігурація сервера

<a name="nginx"></a>
### Nginx

Якщо ви розгортаєте застосунок на сервері з Nginx, можете взяти наведений нижче конфігураційний файл за відправну точку для налаштування веб-сервера. Найімовірніше, цей файл доведеться адаптувати під конфігурацію вашого сервера. **Якщо вам потрібна допомога в керуванні сервером, розгляньте повністю керовану платформу для Laravel, як-от [Laravel Cloud](https://cloud.laravel.com).**

Переконайтеся, що ваш веб-сервер спрямовує всі запити до файлу `public/index.php` вашого застосунку, як у конфігурації нижче. Ніколи не намагайтеся перенести файл `index.php` до кореня проєкту: віддавання застосунку з кореня проєкту відкриє публічному інтернету багато конфіденційних конфігураційних файлів:

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /srv/example.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffer_size 32k;
        fastcgi_buffers 8 32k;
        fastcgi_busy_buffers_size 64k;
        fastcgi_hide_header X-Powered-By;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

<a name="frankenphp"></a>
### FrankenPHP

[FrankenPHP](https://frankenphp.dev/) також можна використовувати для віддавання ваших застосунків Laravel. FrankenPHP - це сучасний сервер PHP-застосунків, написаний мовою Go. Щоб віддавати PHP-застосунок Laravel через FrankenPHP, просто викличте його команду `php-server`:

```shell
frankenphp php-server -r public/
```

Щоб скористатися потужнішими можливостями FrankenPHP - як-от інтеграцією з [Laravel Octane](/docs/{{version}}/octane), HTTP/3, сучасним стисненням чи можливістю пакувати застосунки Laravel в окремі виконувані файли, - зверніться до [документації FrankenPHP щодо Laravel](https://frankenphp.dev/docs/laravel/).

<a name="directory-permissions"></a>
### Права на каталоги

Laravel потребує запису в каталоги `bootstrap/cache` і `storage`, тож переконайтеся, що власник процесу веб-сервера має права на запис до цих каталогів.

<a name="optimization"></a>
## Оптимізація

Розгортаючи застосунок у продакшені, слід закешувати низку файлів: конфігурацію, події, маршрути та представлення. Laravel надає одну зручну команду Artisan `optimize`, яка закешує всі ці файли. Зазвичай її варто викликати як частину процесу розгортання вашого застосунку:

```shell
php artisan optimize
```

Метод `optimize:clear` дозволяє видалити всі файли кешу, згенеровані командою `optimize`, а також усі ключі в драйвері кешу за замовчуванням:

```shell
php artisan optimize:clear
```

Далі в документації ми розглянемо кожну з окремих команд оптимізації, які виконує команда `optimize`.

<a name="optimizing-configuration-loading"></a>
### Кешування конфігурації

Розгортаючи застосунок у продакшені, переконайтеся, що під час розгортання виконується команда Artisan `config:cache`:

```shell
php artisan config:cache
```

Ця команда об'єднає всі конфігураційні файли Laravel в один закешований файл, що значно зменшує кількість звернень фреймворку до файлової системи під час завантаження значень конфігурації.

> [!WARNING]
> Якщо ви виконуєте команду `config:cache` під час розгортання, переконайтеся, що викликаєте функцію `env` лише всередині конфігураційних файлів. Щойно конфігурацію закешовано, файл `.env` не завантажуватиметься, і всі виклики функції `env` для змінних із `.env` повертатимуть `null`.

<a name="caching-events"></a>
### Кешування подій

Під час розгортання варто закешувати автоматично виявлені зіставлення подій зі слухачами. Це робиться викликом команди Artisan `event:cache`:

```shell
php artisan event:cache
```

<a name="optimizing-route-loading"></a>
### Кешування маршрутів

Якщо ви створюєте великий застосунок із багатьма маршрутами, переконайтеся, що під час розгортання виконується команда Artisan `route:cache`:

```shell
php artisan route:cache
```

Ця команда зводить усі реєстрації маршрутів до одного виклику методу в закешованому файлі, що покращує швидкодію реєстрації, коли маршрутів сотні.

<a name="optimizing-view-loading"></a>
### Кешування представлень

Розгортаючи застосунок у продакшені, переконайтеся, що під час розгортання виконується команда Artisan `view:cache`:

```shell
php artisan view:cache
```

Ця команда попередньо компілює всі ваші представлення Blade, щоб вони не компілювалися на вимогу, покращуючи швидкодію кожного запиту, який повертає представлення.

<a name="reloading-services"></a>
## Перезавантаження сервісів

> [!NOTE]
> Розгортаючись у [Laravel Cloud](https://cloud.laravel.com), використовувати команду `reload` не потрібно - коректне перезавантаження всіх сервісів відбувається автоматично.

Після розгортання нової версії застосунку всі довготривалі сервіси - як-от воркери черг, Laravel Reverb чи Laravel Octane - слід перезавантажити чи перезапустити, щоб вони використовували новий код. Laravel надає одну команду Artisan `reload`, яка завершує роботу цих сервісів:

```shell
php artisan reload
```

Якщо ви не користуєтеся [Laravel Cloud](https://cloud.laravel.com), вам слід самостійно налаштувати монітор процесів, який виявлятиме завершення ваших перезавантажуваних процесів і автоматично перезапускатиме їх.

<a name="debug-mode"></a>
## Режим налагодження

Опція debug у вашому конфігураційному файлі `config/app.php` визначає, скільки інформації про помилку насправді показується користувачеві. За замовчуванням ця опція налаштована на значення змінної середовища `APP_DEBUG`, яка зберігається у файлі `.env` вашого застосунку.

> [!WARNING]
> **У продакшен-середовищі це значення завжди має бути `false`. Якщо в продакшені змінна `APP_DEBUG` матиме значення `true`, ви ризикуєте розкрити конфіденційні значення конфігурації кінцевим користувачам вашого застосунку.**

<a name="the-health-route"></a>
## Маршрут перевірки стану

Laravel містить вбудований маршрут перевірки стану, за яким можна стежити за станом вашого застосунку. У продакшені цей маршрут можна використовувати, щоб повідомляти про стан застосунку монітору доступності, балансувальнику навантаження чи системі оркестрації на кшталт Kubernetes.

За замовчуванням маршрут перевірки стану доступний за адресою `/up` і повертає HTTP-відповідь 200, якщо застосунок завантажився без винятків. Інакше повертається HTTP-відповідь 500. Ви можете налаштувати URI цього маршруту у файлі `bootstrap/app` вашого застосунку:

```php
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up', // [tl! remove]
    health: '/status', // [tl! add]
)
```

Коли до цього маршруту надходять HTTP-запити, Laravel також надсилає подію `Illuminate\Foundation\Events\DiagnosingHealth`, що дозволяє виконати додаткові перевірки стану, доречні для вашого застосунку. У [слухачі](/docs/{{version}}/events) цієї події ви можете перевірити стан бази даних чи кешу вашого застосунку. Якщо ви виявите проблему, просто викиньте виняток зі слухача.

<a name="deploying-with-cloud-or-forge"></a>
## Розгортання за допомогою Laravel Cloud чи Forge

<a name="laravel-cloud"></a>
#### Laravel Cloud

Якщо вам потрібна повністю керована платформа розгортання з автомасштабуванням, налаштована під Laravel, перегляньте [Laravel Cloud](https://cloud.laravel.com). Laravel Cloud - це надійна платформа розгортання для Laravel, що пропонує керовані обчислення, бази даних, кеші та об'єктне сховище.

Запустіть свій застосунок Laravel у Cloud і закохайтеся в масштабовану простоту. Laravel Cloud відточений творцями Laravel так, щоб бездоганно працювати з фреймворком, тож ви можете й далі писати свої застосунки Laravel звичним для себе способом.

<a name="laravel-forge"></a>
#### Laravel Forge

Якщо ви віддаєте перевагу керуванню власними серверами, але не почуваєтеся впевнено, налаштовуючи всі потрібні сервіси для роботи надійного застосунку Laravel, [Laravel Forge](https://forge.laravel.com) - це платформа керування VPS-серверами для застосунків Laravel.

Laravel Forge може створювати сервери в різних інфраструктурних провайдерів: DigitalOcean, Linode, AWS тощо. Крім того, Forge встановлює всі потрібні для створення надійних застосунків Laravel інструменти - Nginx, MySQL, Redis, Memcached, Beanstalk тощо - і керує ними.