# Шаг 3: Команды терминала

На этом этапе вам необходимо подключиться к серверу через SSH и выполнить набор специальных команд. Эти команды подготовят ваш сервер, установят и обновят важные компоненты, которые необходимы для стабильной и быстрой работы вашего обменника.

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Как открыть терминал и подключиться к серверу по SSH?](/pomosh-i-spravka/infrastruktura/kak-otkryt-terminal-i-podklyuchitsya-k-serveru-po-ssh.md)
{% endcontent-ref %}

{% hint style="danger" %}

## Важно:&#x20;

На этом этапе необходимо подключиться к серверу через SSH под пользователем **root**, так как именно **root** имеет полный доступ к системе и может выполнять все необходимые команды. Это критично для корректной установки и настройки компонентов, обеспечивающих стабильную и быструю работу обменника.
{% endhint %}

{% hint style="info" %}

### Перед началом: проверьте, что FastPanel PHP 8.4 установлен

В FastPanel должен быть установлен PHP 8.4 и доступен путь: `/opt/php84/bin/php`&#x20;

Проверка: `/opt/php84/bin/php -v`&#x20;

*Если команда не найдена — сначала установите **PHP 8.4 в FastPanel.***
{% endhint %}

***

## Этап 0: Проверка и установка sudo (если отсутствует)

Иногда на "чистых" серверах sudo может отсутствовать. Сначала проверяем и при необходимости ставим.

```shellscript
if ! command -v sudo >/dev/null 2>&1; then
  apt update -y
  apt install -y sudo
fi
```

## Этап 1: Обновление системы и установка компонентов

#### Что будет сделано

* Обновление системы и пакетов
* Установка Redis (кэширование и очереди)
* Установка Supervisor (автозапуск и контроль процессов)
* Установка инструментов сборки (нужны для EV)
* Установка базовых утилит (curl, git, openssl и т.п.)

**Команды для выполнения:**

```shellscript
sudo apt update -y
sudo apt upgrade -y

sudo apt install -y \
  curl ca-certificates gnupg git lsb-release openssl unzip \
  redis-server supervisor \
  build-essential pkg-config libevent-dev
```

{% hint style="info" %}

#### Важно при установке пакетов

Если появится вопрос: **Do you want to continue? \[Y/n]** — ответьте **Y** и нажмите **Enter.**
{% endhint %}

### Этап 2: Сделать PHP 8.4 (FastPanel) основным для CLI

В FastPanel PHP 8.4 находится по пути: `/opt/php84/bin/php`

Сделаем так, чтобы команда php в терминале использовала именно PHP 8.4.

**Команды**

```shellscript
if [ ! -x /opt/php84/bin/php ]; then
  echo "Ошибка: не найден /opt/php84/bin/php. Установите PHP 8.4 в FastPanel."
  exit 1
fi

sudo update-alternatives --install /usr/bin/php php /opt/php84/bin/php 84 >/dev/null 2>&1 || true
sudo update-alternatives --set php /opt/php84/bin/php >/dev/null 2>&1 || true

php -v | head -n 1
```

### Этап 3: Установка ionCube Loader 15

* Loader подключаем первым через файл: `/opt/php84/conf.d/00-ioncube.ini`
* Скачивание: **IPv4 + fallback ZIP**, если tar.gz не скачался.

**Команды**

```shellscript
sudo mkdir -p /usr/local/src
cd /usr/local/src
sudo rm -rf ioncube >/dev/null 2>&1 || true
sudo rm -f ioncube_loaders_lin_x86-64.tar.gz ioncube_loaders_lin_x86-64.zip >/dev/null 2>&1 || true

IONCUBE_TAR_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz"
IONCUBE_ZIP_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.zip"
IONCUBE_DST_DIR="/usr/local/ioncube"
IONCUBE_SO="$IONCUBE_DST_DIR/ioncube_loader_lin_8.4.so"
IONCUBE_INI="/opt/php84/conf.d/00-ioncube.ini"

download_ok=0
curl -4 -fSL "$IONCUBE_TAR_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
  -o ioncube_loaders_lin_x86-64.tar.gz && download_ok=1 || download_ok=0

if [ "$download_ok" -eq 1 ] && [ -s ioncube_loaders_lin_x86-64.tar.gz ]; then
  sudo tar -xzf ioncube_loaders_lin_x86-64.tar.gz
else
  curl -4 -fSL "$IONCUBE_ZIP_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
    -o ioncube_loaders_lin_x86-64.zip

  if [ ! -s ioncube_loaders_lin_x86-64.zip ]; then
    echo "Ошибка: ionCube zip не скачался или пустой."
    exit 1
  fi

  sudo unzip -o ioncube_loaders_lin_x86-64.zip -d /usr/local/src >/dev/null
fi

if [ ! -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" ]; then
  echo "Ошибка: не найден /usr/local/src/ioncube/ioncube_loader_lin_8.4.so"
  exit 1
fi

sudo mkdir -p "$IONCUBE_DST_DIR"
sudo cp -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" "$IONCUBE_SO"

echo "zend_extension=$IONCUBE_SO" | sudo tee "$IONCUBE_INI" >/dev/null

# Если в php-cli.ini было старое подключение — комментируем
if [ -f /opt/php84/etc/php-cli.ini ]; then
  sudo sed -i 's/^\s*zend_extension\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
  sudo sed -i 's/^\s*zend_extension_ts\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
fi

php -v | grep -i "ionCube" || true
```

### Этап 4: Установка расширения uv

* Мы ставим uv не в системный PHP, а в FastPanel PHP 8.4 (/opt/php84).
* Для работы uv требуется расширение FFI (это обязательная зависимость).

  Если FFI не загружен, uv не запустится — будет ошибка инициализации/загрузки расширения из-за отсутствия ffi (вроде “FFI disabled” / “undefined symbol” / “failed to load”).

**Команды**

```shellscript
PHP84_BIN="/opt/php84/bin/php"
PHP84_PECL="/opt/php84/bin/pecl"
PHP84_PHPIZE="/opt/php84/bin/phpize"
PHP84_PHP_CONFIG="/opt/php84/bin/php-config"
UV_INI="/opt/php84/conf.d/20-uv.ini"

if [ ! -x "$PHP84_PECL" ] || [ ! -x "$PHP84_PHPIZE" ] || [ ! -x "$PHP84_PHP_CONFIG" ]; then
  exit 1
fi

sudo apt update -y
sudo apt install -y build-essential pkg-config autoconf automake libtool re2c libuv1-dev

export PHP_PEAR_PHP_BIN="$PHP84_BIN"
export PHP_PEAR_PHPIZE_BIN="$PHP84_PHPIZE"
export PHP_PEAR_PHP_CONFIG_BIN="$PHP84_PHP_CONFIG"
export PHPIZE="$PHP84_PHPIZE"
export PHP_CONFIG="$PHP84_PHP_CONFIG"

"$PHP84_PECL" channel-update pecl.php.net || true

# uv сейчас только beta, ставим конкретно указанную версию
printf "\n" | "$PHP84_PECL" install channel://pecl.php.net/uv-0.3.0

echo "extension=uv.so" > "$UV_INI"
```

***

## Этап 3: Настройка лимитов открытых файлов (limits.conf)

Данная настройка необходима, чтобы сервер стабильно обрабатывал большое количество одновременных подключений, запросов и корректно функционировал под высокими нагрузками.

1. Откройте терминал сервера и выполните следующую команду для открытия конфигурационного файла:

```bash
sudo nano /etc/security/limits.conf
```

2. В открывшемся редакторе файла перейдите в самый низ и добавьте следующие строки (замените слово **имя\_пользователя** на фактическое имя вашего пользователя сервера):

<figure><img src="/files/WbSwFjHdTtfVSH1mHZeC" alt="" width="375"><figcaption></figcaption></figure>

```bash
www-data        soft    nofile  10000
www-data        hard    nofile  10000
имя_пользователя soft   nofile  10000
имя_пользователя hard   nofile  10000
```

**Здесь:**

* **www-data** — стандартный пользователь веб-сервера.
* **soft и hard** — типы лимитов.
  * **soft** — рекомендуемый предел (может временно превышаться).
  * **hard** — жёсткий предел (нельзя превышать).
* **nofile** — количество одновременно открытых файлов.

Значение **10000** оптимально для большинства веб-приложений и серверов.

{% hint style="info" %}

#### Как сохранить изменения

На Mac и Linux (редактор nano):

* Нажмите комбинацию клавиш `Control + O` для сохранения файла.
* Затем подтвердите сохранение, нажав Enter.
* Для выхода из редактора нажмите **Control + X**.

На Windows (редактор nano в WSL, Git Bash и аналогичных):

* Нажмите комбинацию клавиш `Ctrl + O` для сохранения файла.
* Затем нажмите Enter для подтверждения.
* Закройте редактор, нажав <kbd>Ctrl + X</kbd>.
  {% endhint %}

***

## Этап 4: Подробная настройка веб-сервера Nginx

На этом этапе вы настроите веб-сервер Nginx таким образом, чтобы он мог без перебоев работать с большим количеством одновременно подключенных пользователей и эффективно справлялся с повышенной нагрузкой.

Эта настройка особенно важна, так как по умолчанию сервер имеет достаточно низкие ограничения на количество одновременных подключений, что может привести к ошибкам и проблемам в работе обменника при увеличении числа посетителей и запросов.

### 1. Откройте конфигурационный файл Nginx

Сначала подключитесь к серверу через SSH.

Затем в терминале введите следующую команду:

```bash
sudo nano /etc/nginx/nginx.conf
```

* **sudo —** выполнение команды с правами администратора.
* **nano —** текстовый редактор в терминале.
* **/etc/nginx/nginx.conf —** это основной файл настроек веб-сервера Nginx.

После выполнения этой команды откроется конфигурация веб-сервера.

### 2. Внесите важные изменения в конфигурацию

В открывшемся файле найдите строчку:&#x20;

```bash
pid /var/run/nginx.pid;
```

Эта строчка показывает, где хранится файл, в котором записан ID процесса Nginx. Вам нужно вставить настройки сразу после этой строки, чтобы изменения были максимально эффективны и правильно применялись сервером.

<figure><img src="/files/w97wJL8cAAcKJb07314I" alt="" width="375"><figcaption></figcaption></figure>

**Удалите стандартный блок настроек**, который выглядит так:

```bash
events {
    worker_connections  1024;
}
```

{% hint style="info" %}
Стандартное значение ограничивает сервер 1024 одновременными подключениями. Для современных сайтов это значение обычно недостаточно, особенно под высокой нагрузкой.
{% endhint %}

**Вместо удалённого блока добавьте** **новый** блок, указанный ниже:

```bash
worker_rlimit_nofile 10000;

events {
    worker_connections 10000;
    multi_accept on;
}
```

#### Подробное описание новых параметро&#x432;**:**

* **worker\_rlimit\_nofile 10000**

  Это ограничение количества одновременно открытых файлов, доступных для каждого рабочего процесса Nginx.

  Веб-серверу необходимо открывать файлы для каждого подключения (каждого запроса или каждого пользователя). Чем больше это число, тем больше одновременных подключений сервер сможет корректно обработать. Значение 10000 является оптимальным в большинстве случаев.
* **worker\_connections 10000**

  Указывает максимальное количество одновременных подключений, которое сможет обрабатывать каждый отдельный рабочий процесс Nginx. Большое значение необходимо, чтобы сервер не отказывал в подключениях при высокой нагрузке и потоке пользователей.
* **multi\_accept on**

  Настройка, позволяющая серверу одновременно принимать несколько входящих подключений за одно событие. По умолчанию сервер принимает одно подключение за раз, и это может создавать очереди, когда одновременно пытается подключиться много пользователей. Включение этой опции существенно ускоряет обработку входящих подключений.

После того, как вы добавили указанные строки, сделайте следующее:

{% hint style="info" %}

#### Как сохранить изменения

На Mac и Linux (редактор nano):

* Нажмите комбинацию клавиш `Control + O` для сохранения файла.
* Затем подтвердите сохранение, нажав Enter.
* Для выхода из редактора нажмите **Control + X**.

На Windows (редактор nano в WSL, Git Bash и аналогичных):

* Нажмите комбинацию клавиш `Ctrl + O` для сохранения файла.
* Затем нажмите Enter для подтверждения.
* Закройте редактор, нажав <kbd>Ctrl + X</kbd>.
  {% endhint %}

### 3. Перезапустите веб-сервер Nginx

Теперь изменения нужно применить, перезапустив сервер Nginx.

Для этого выполните команду:

```bash
sudo systemctl restart nginx
```

Эта команда перезапустит веб-сервер, и все сделанные вами изменения вступят в силу сразу после этого.

***

## Этап 5: Настройка стабильной работы проекта с Supervisor и PM2

Для обеспечения стабильной работы вашего обменника даже при сбоях или перезагрузке сервера необходимо настроить специальные инструменты автоматического управления приложениями:

* **Supervisor** — это инструмент, который следит за фоновыми процессами вашего **Laravel-приложения** (например, очереди задач, отправка уведомлений, мониторинг производительности). Supervisor автоматически перезапускает процессы, если они вдруг остановились, гарантируя бесперебойную работу вашего сайта.
* **PM2** — это инструмент, который управляет работой вашего **Angular frontend-приложения**. PM2 обеспечивает автоматический перезапуск приложения при сбоях, мониторинг использования ресурсов и удобное ведение журналов (логов).

Обязательно выполните инструкции по ссылкам ниже для настройки каждого компонента:

{% content-ref url="/pages/6aBfpYiJXFS3lItIODfn" %}
[Настройка Supervisor](/nachalo-raboty/ustanovka/shag-4-zapusk-processov/nastroika-supervisor.md)
{% endcontent-ref %}

{% content-ref url="/pages/zWZ3AUXLFEHDpdKvNcTJ" %}
[Настройка PM2](/nachalo-raboty/ustanovka/shag-4-zapusk-processov/nastroika-pm2.md)
{% endcontent-ref %}

После того как вы завершите настройку, сервер будет полностью готов к надёжной и стабильной работе вашего обменника.

{% hint style="info" %}

## Совет

Обязательно убедитесь, что выполнили инструкции полностью и без ошибок, так как от этого зависит надёжность работы вашего обменника.
{% endhint %}

***

## Этап 6: Установка корректных прав доступа на файлы проекта

Правильная настройка прав доступа необходима для безопасной работы вашего backend-приложения (Laravel). Корректно выставленные права позволяют вашему пользователю управлять всеми файлами проекта, выполнять команды от своего имени и избегать ошибок прав доступа.

После загрузки файлов на сервер может возникнуть ситуация, когда пользователь сайта (созданный в FastPanel) не имеет прав на редактирование или запуск некоторых файлов или директорий. Данная настройка исправит эту проблему.

#### Выполните следующую команду в терминале:

```
sudo chown -R имя_пользователя: путь_к_проекту
```

Обязательно замените указанные значения на свои:

* **имя\_пользователя –** имя пользователя, созданное в панели управления (например, пользователь FastPanel).
* **путь\_к\_проекту –** путь к директории вашего сайта на сервере (например, /var/www/ваш\_домен или /var/www/app.<mark style="color:red;">**ваш\_домен**</mark>).

{% content-ref url="/pages/1l6h1Oe73cxdYfGUwqH8" %}
[Как найти путь к проекту и имя пользователя в FastPanel?](/pomosh-i-spravka/infrastruktura/kak-naiti-put-k-proektu-i-imya-polzovatelya-v-fastpanel.md)
{% endcontent-ref %}

**Что делает эта команда:**

* sudo – выполняет команду с правами администратора.
* chown – изменяет владельца файлов и папок.
* Параметр -R – применяет изменения ко всем файлам и папкам внутри указанной директории.

После выполнения этой команды, у вас будут правильные права на управление всеми файлами и директориями вашего проекта.

***

## Завершающий этап: запуск команд от имени пользователя проекта

На этом этапе необходимо выполнить несколько команд в терминале, которые завершат подготовку вашего проекта и сделают его полностью рабочим и готовым к использованию.

Выполните эти шаги по порядку и внимательно следуйте инструкции ниже.

### Шаг 1: Авторизация под пользователем сайта

Сначала авторизуйтесь под пользователем сайта, чтобы все команды выполнялись от его имени, а не от администратора. Это безопасно и правильно для работы приложения.

Введите в терминал следующую команду:

```bash
su -l имя_пользователя
```

Замените **имя\_пользователя** на имя, которое вы создавали в панели FastPanel.

### Шаг 2: Переход в директорию сайта

Теперь перейдите в каталог (папку) вашего проекта, чтобы команды запускались именно для него.

Для этого используйте команду:

```
cd www/app.ваш_домен
```

Обязательно замените `/var/www/app.`<mark style="color:red;">`ваш_домен`</mark> на полный путь к вашему проекту.

### Шаг 3: Запуск дополнительных команд для настройки проекта

Теперь нужно выполнить три команды Laravel, которые завершат подготовку проекта:

Введите каждую команду последовательно и после каждой нажимайте Enter:

```php
php artisan product:apply-update
```

{% hint style="danger" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

```php
php artisan key:generate
php artisan reverb:install
```

**Что делают эти команды:**

* **php artisan product:apply-update** – устанавливает или обновляет базовые компоненты и выполняет все необходимые миграции для работы обменника.
* **php artisan key:generate** – генерирует уникальный ключ приложения, который будет использоваться для шифрования данных. Это важно для безопасности вашего сайта.
* **php artisan reverb:install** – настраивает работу сервиса Reverb, который обеспечивает обмен событиями в реальном времени. Это необходимо для работы уведомлений, статусов и других динамических функций на вашем сайте.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.iexexchanger.com/nachalo-raboty/ustanovka/shag-3-komandy-terminala.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
