> For the complete documentation index, see [llms.txt](https://docs.iexexchanger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.iexexchanger.com/get-started/ustanovka/nastroika-fastpanel/podgotovka-servera.md).

# Подготовка сервера

На данном этапе будет выполнена подготовка операционной системы и установка всех компонентов, необходимых для работы iEXExchanger.

В результате будут настроены:

* PHP 8.4 для CLI
* ionCube Loader
* расширение uv
* Redis
* Supervisor
* Node.js 24
* PM2
* системные лимиты сервера
* права доступа к файлам
* Laravel Reverb
* Laravel Horizon
* Laravel Pulse
* Laravel Queue Worker

После завершения данного этапа сервер будет полностью готов к запуску Backend и Frontend частей системы.

### Перед началом

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

Убедитесь, что:

* установлен Debian 12;
* установлен FastPanel;
* создан основной домен;
* создан технический поддомен Backend;
* установлен PHP 8.4 через FastPanel;
* имеется SSH-доступ к серверу.

Проверьте наличие PHP 8.4:

```shellscript
/opt/php84/bin/php -v
```

Если PHP 8.4 отсутствует, сначала установите его через FastPanel.

{% hint style="danger" %}
Все системные команды в первой части инструкции необходимо выполнять от имени пользователя `root`.

Для перехода в root используйте: `sudo -i` или `su -l root`
{% endhint %}

***

## Что нужно заменить в командах

Перед выполнением команд замените шаблонные значения на свои.

| Значение                    | Что указать                             |
| --------------------------- | --------------------------------------- |
| `имя_пользователя_backend`  | пользователь Backend-сайта в FastPanel  |
| `имя_пользователя_frontend` | пользователь Frontend-сайта в FastPanel |
| `app.ваш_домен`             | технический поддомен Backend            |
| `ваш_домен`                 | основной домен Frontend                 |
| `/var/www/...`              | реальные пути к проектам на сервере     |

Пример:

```
Backend:
пользователь: app_example_com_usr
путь: /var/www/app_example_com_usr/data/www/app.example.com

Frontend:
пользователь: example_com_usr
путь: /var/www/example_com_usr/data/www/example.com
```

## Шаг 1. Установка системных компонентов

Выполните:

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

apt update -y
apt upgrade -y

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

Активируйте службы:

```shellscript
systemctl enable redis-server
systemctl enable supervisor

systemctl start redis-server
systemctl start supervisor
```

Проверка:

```shellscript
systemctl status redis-server --no-pager
systemctl status supervisor --no-pager
```

## Шаг 2. Настройка PHP 8.4 для CLI

FastPanel использует собственную сборку PHP.

Сделаем PHP 8.4 основной версией для терминала:

```shellscript
if [ ! -x /opt/php84/bin/php ]; then
    echo "PHP 8.4 не найден."
    exit 1
fi

update-alternatives \
--install /usr/bin/php php /opt/php84/bin/php 84

update-alternatives \
--set php /opt/php84/bin/php

php -v
```

Результат: **PHP 8.4.x**

## Шаг 3. Установка ionCube Loader

* 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
```

Проверка: `php -v`

Должно отображаться: `with the ionCube PHP Loader`

## Шаг 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"
```

## Шаг 5. Настройка лимитов системы

Откройте: `nano /etc/security/limits.conf`

Добавьте:

```shellscript
www-data soft nofile 10000
www-data hard nofile 10000

имя_пользователя_backend soft nofile 10000
имя_пользователя_backend hard nofile 10000

имя_пользователя_frontend soft nofile 10000
имя_пользователя_frontend hard nofile 10000
```

## Шаг 6. Настройка Nginx

Откройте: `nano /etc/nginx/nginx.conf`

Найдите:

```shellscript
events {
    worker_connections 1024;
}
```

Замените:

```shellscript
worker_rlimit_nofile 10000;

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

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

Проверка: `nginx -t`

Применение: `systemctl restart nginx`

## Шаг 7. Настройка Supervisor

Откройте: `nano /etc/supervisor/supervisord.conf`

После блока: `[supervisord]`

Добавьте:

```shellscript
minfds=10000
```

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

Перезапустите Supervisor: `systemctl restart supervisor`

## Шаг 8. Настройка автоматического запуска Backend-процессов

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

На данном этапе будет создана конфигурация Supervisor для следующих сервисов:

* Horizon
* Queue Worker
* Pulse Work
* Pulse Check
* Reverb

Создайте файл: `nano setup_supervisor_processes.sh`

Перед вставкой скрипта замените следующие значения на свои:

| Параметр      | Описание                   |
| ------------- | -------------------------- |
| PROJECT\_PATH | путь к Backend-проекту     |
| PHP\_PATH     | путь к PHP 8.4             |
| USER          | пользователь Backend-сайта |
| DOMAIN        | технический домен Backend  |

Пример:

```shellscript
PROJECT_PATH=/var/www/app_example_com_usr/data/www/app.example.com
PHP_PATH=/opt/php84/bin/php
USER=app_example_com_usr
DOMAIN=app.example.com
```

Вставьте следующий скрипт:

```shellscript
#!/bin/bash
set -e

PROJECT_PATH="/var/www/имя_пользователя_backend/data/www/app.ваш_домен"
PHP_PATH="/opt/php84/bin/php"
USER="имя_пользователя_backend"
DOMAIN="app.ваш_домен"

SUPERVISOR_CONF_PATH="/etc/supervisor/conf.d/iex.conf"

sudo tee "$SUPERVISOR_CONF_PATH" >/dev/null <<EOF
[program:horizon]
command=$PHP_PATH $PROJECT_PATH/artisan horizon
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-horizon.log
stopwaitsecs=3600

[program:laravel-worker]
command=$PHP_PATH $PROJECT_PATH/artisan queue:work --delay=1 --sleep=1 --timeout=1800 --tries=3 --queue=high,low
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-worker.log
stopwaitsecs=3600

[program:laravel-pulsework]
command=$PHP_PATH $PROJECT_PATH/artisan pulse:work
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-pulse-work.log
stopwaitsecs=3600

[program:laravel-pulsecheck]
command=$PHP_PATH $PROJECT_PATH/artisan pulse:check
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-pulse-check.log
stopwaitsecs=3600

[program:laravel-reverb]
command=$PHP_PATH $PROJECT_PATH/artisan reverb:start --hostname="$DOMAIN"
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-reverb.log
stopwaitsecs=3600
EOF

sudo supervisorctl reread
sudo supervisorctl update

echo "Конфигурация Supervisor успешно создана."
```

Сделайте файл исполняемым:

```shellscript
chmod +x setup_supervisor_processes.sh
```

Запустите его:

```shellscript
sudo ./setup_supervisor_processes.sh
```

Проверьте статус процессов:

```shellscript
sudo supervisorctl status
```

После запуска все процессы должны иметь статус: **RUNNING**

## Шаг 9. Установка Node.js 24

Выполните:

```shellscript
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
apt install -y nodejs
```

Проверка:

```shellscript
node -v
npm -v
```

Результат: **v24.x.x**

## Шаг 10. Установка PM2

Установка:

```shellscript
npm install -g npm@latest
npm install -g pm2@latest
```

Проверка: `pm2 -v`

## Шаг 11. Настройка PM2

Переключитесь на пользователя Frontend:

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

Перейдите в директорию проекта:

```shellscript
cd /var/www/имя_пользователя_frontend/data/www/ваш_домен
```

Создайте каталог логов:

```shellscript
mkdir -p logs
```

Запуск:

```shellscript
pm2 start ecosystem.config.cjs
pm2 save
```

Проверка:&#x20;

```shellscript
pm2 status
```

Статус: **online**

## Шаг 12. Настройка автозапуска PM2

Вернитесь в root:

```shellscript
exit
```

Выполните:

```shellscript
env PATH=$PATH:/usr/bin \
/usr/lib/node_modules/pm2/bin/pm2 \
startup systemd \
-u имя_пользователя_frontend \
--hp /var/www/имя_пользователя_frontend/data
```

Снова перейдите под пользователя Frontend:

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

Сохраните процессы:

```shellscript
pm2 save
```

## Шаг 13. Настройка прав доступа

Backend:

```shellscript
chown -R имя_пользователя_backend:имя_пользователя_backend \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

Frontend:

```shellscript
chown -R имя_пользователя_frontend:имя_пользователя_frontend \
/var/www/имя_пользователя_frontend/data/www/ваш_домен
```

Laravel:

```shellscript
chmod -R ug+rwX \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен/storage

chmod -R ug+rwX \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен/bootstrap/cache
```

## Шаг 14. Финальная настройка Laravel

Перейдите под пользователя Backend:

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

Откройте проект:

```shellscript
cd /var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

Выполните:

```shellscript
php artisan product-updates:run
php artisan key:generate
php artisan reverb:install
```

Если команда:

```shellscript
php artisan product-updates:run
```

завершилась ошибкой, выполните её повторно.

## Шаг 15. Создание пароля администратора

После завершения установки необходимо создать пароль для входа в административную панель.

Убедитесь, что:

* вы находитесь под пользователем Backend-проекта;
* открыта директория Backend-проекта.

Если вы ещё не переключились на пользователя Backend, выполните:

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

Перейдите в директорию проекта:

```shellscript
cd /var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

Выполните команду:

```shellscript
NEW_PASS="$(openssl rand -base64 24 | tr -d '\n' | tr '/+' 'Aa' | cut -c1-16)"

php artisan iex:resetpass --pass="$NEW_PASS"

echo ""
echo "================================="
echo "Логин: admin"
echo "Пароль: $NEW_PASS"
echo "================================="
```

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

```
=================================
Admin URL: https://app.ваш_домен/iexadmin
E-mail: user@iexexchanger.com
Пароль: A7dK92sLmQpX4zR1
=================================
```

## Проверка работы

* Supervisor: `supervisorctl status`
* PM2: `pm2 status`
* PHP: `php -v`
* Node.js: `node -v`
* Nginx: `nginx -t`

***

#### <mark style="color:green;">**Установка завершена**</mark>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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/get-started/ustanovka/nastroika-fastpanel/podgotovka-servera.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.
