Инструкция по ручной установке системы на веб-сервер: PHP-модули, база данных, файловая структура, зависимости, миграции и первичный импорт данных.
Для обновления есть отдельная инструкция. Для установки с docker есть отдельная инструкция.
Требуется PHP 8.1 или новее (см. composer.json). Пример установки для Debian/Ubuntu:
apt install php php-mbstring php-ldap php-xml php-mysql php-gd php-intl php-gmp php-imagick php-zip php-curl php-bcmath
Для работы с изображениями установка пакетов должна подтянуть ImageMagick. В файле /etc/ImageMagick-6/policy.xml (путь зависит от версии, может быть /etc/ImageMagick-7/policy.xml) перед строкой
</policymap>
вставьте строку:
<policy domain="coder" rights="read | write" pattern="PDF" />
это даст возможность обрабатывать PDF файлы.
NOTES:
utf8mb4 с collation utf8mb4_unicode_ci, т.к. на ней выбор остановился после устранения проблем с другими!ini
[innodb]
innodb_strict_mode = OFF;
innodb_large_prefix = trueSUPER, которой у пользователя приложения нет. Миграции
создают рекурсивные функции (getplacepath, getplacetop, getServiceSegment), без
которых страницы с местами и сервисами падают с 500-й, поэтому серверу нужна настройка:
ini
[mysqld]
log_bin_trust_function_creators = 1
Альтернатива - выдать пользователю SUPER на время миграций (менее удобно и не более безопасно).Пример создания БД достаточной для работы
CREATE DATABASE arms character set utf8mb4 collate utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON arms.* TO 'arms-user'@'localhost' IDENTIFIED BY 'secret-password';
Клонируем содержимое git-репозитория в папку проекта (например /var/www/arms).
git clone https://github.com/spo0okie/arms_inventory.git .
chmod 755 ./yii
Корнем сайта (DocumentRoot) должна быть подпапка
webпроекта, а не сам проект:/var/www/arms/web. Наружу тогда смотрит только то, что и должно быть доступно браузеру, а код, конфиги с паролями (config/db-local.php) иruntimeостаются вне корня сайта. Адреса при такой публикации выглядят какhttps://inventory.domain.local/techs/index.Инсталляции, развернутые по прежней редакции этой инструкции, публиковались иначе - DocumentRoot указывал на корень проекта, а лежащий там
.htaccessпереписывал запросы вweb/. Из-за этого во всех адресах присутствовал лишний токен:https://inventory.domain.local/web/techs/index. Такие адреса продолжают работать и на новой публикации (см. Адреса приложения), так что перенастраивать интеграции разом не требуется. Порядок перехода описан в инструкции по обновлению.
Это установит все уникальные для этого проекта файлы, но не используемые им сторонние модули, которые поддерживаются другими разработчиками.
Проект в своей структуре содержит все ссылки на необходимые модули других производителей. Они устанавливаются через composer (уже должен присутствовать в системе, инструкции по установке есть на getcomposer.org):
composer update
Для боевой инсталляции можно добавить ключ
--no-dev, чтобы не ставить пакеты для разработки и тестирования (так собирается docker-образ).
Нужно создать папку для превью картинок
Приложению необходимо обеспечить доступ к файловой системе, поэтому процесс вебсервера должен иметь доступ на запись к папкам
TL;DR:
mkdir -p web/scans/thumbs
chmod 777 web/scans/thumbs
chmod 777 web/scans
chmod 777 web/assets
chmod 777 runtime
Создаем пустые конфиг файлы для персональных настроек инсталляции
config/params-local.php
<?php
return[];
config/web-local.php
<?php
return[];
config/db-local.php должен содержать реальные учетные данные БД для инвентаризации (настроить БД)
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=arms',
'username' => 'arms-user',
'password' => 'secret-password',
];
config/ldap.php должен содержать корректный конфиг, даже если LDAP авторизация не будет использоваться
<?php
return [
'class'=>'Edvlerblog\Adldap2\Adldap2Wrapper',
'providers'=> [
'default'=>[
'autoconnect'=>true,
'config'=>[
'port' => 636,
//'port' => 389,
'hosts' => ['dc1.domain.local','dc2.domain.local'],
'account_suffix' => '@domain.local',
'base_dn' => "DC=domain,DC=local",
//под кем подключиться к АД (подойдет любой пользователь. права админа не нужны)
'username' => 'inventory@domain.local',
'password' => 'SuperSecretPassword1!',
'use_ssl' => true,
'use_tls' => true,
'custom_options' => [
// See: http://php.net/ldap_set_option
//LDAP_OPT_X_TLS_REQUIRE_CERT => LDAP_OPT_X_TLS_NEVER
],
],
],
],
];
Поскольку проект создан на базе фреймворка yii2, то для управления структурой БД используется встроенный в него инструмент миграций. При чистой установке (и после каждого обновления) необходимо выполнить
./yii migrate --migrationPath=@yii/rbac/migrations/
./yii migrate
В докер контейнере это делается автоматически при старте контейнера.
Создаем базовую роль admin для RBAC (нужно, даже если включать RBAC планируется позже, — см. настройку авторизации):
./yii rbac/init
Должен быть включен модуль rewrite, а для каталога web разрешен AllowOverride All — иначе не сработает web/.htaccess, который отдает pretty-URL в index.php.
Пример файла apache2
<VirtualHost *:443>
ServerName inventory.domain.local
#корень сайта - подпапка web проекта, а не сам проект
DocumentRoot "/var/www/arms/web"
<Directory "/var/www/arms/web">
Options -Indexes +Includes
AllowOverride All
Require all granted
</Directory>
ErrorLog "/var/log/apache2/inventory.https_error_ssl.log"
ServerSignature Off
CustomLog "/var/log/apache2/inventory.https_access_ssl.log" combined
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/inventory.cer"
SSLCertificateKeyFile "/etc/ssl/private/private.key"
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOptions +ExportCertData
</VirtualHost>
При каноническом DocumentRoot (<проект>/web) приложение живет на чистых адресах:
| Что | Адрес |
|---|---|
| интерфейс | https://inventory.domain.local/techs/index |
| REST API | https://inventory.domain.local/api/users |
| статика | https://inventory.domain.local/css/custom.css |
Старые адреса с /web/ продолжают работать - https://inventory.domain.local/web/api/users
обслуживается ровно тем же кодом, что и /api/users. Сделано это для инсталляций, выросших
из прежней схемы публикации: перенастроить разом все интеграции (скрипты синхронизации,
телефонию, плагин wiki, закладки сотрудников, ссылки в самой wiki) невозможно.
Как это устроено:
web/.htaccess срезает префикс на уровне веб-сервера, поэтому по старому адресу отдается
и статика (/web/css/custom.css);app\components\Request срезает тот же префикс из пути запроса, иначе роутер искал бы
несуществующий контроллер web.Совместимость работает без редиректа: метод запроса и тело сохраняются, поэтому POST/PUT-интеграции не ломаются. При этом сами страницы всегда рисуют канонические ссылки, так что открытая по старому адресу страница «вылечивается» после первого же перехода.
Когда все интеграции переведены на чистые адреса, слой совместимости можно выключить - в config/web-local.php:
<?php
return [
'components' => [
//старые адреса /web/... начнут отдавать 404
'request' => ['legacyPathPrefix' => null],
],
];
Если веб-сервер не apache,
.htaccessне читается, и оба правила надо перенести в его конфиг. Для nginx это выглядит так:root /var/www/arms/web; #совместимость со старой схемой публикации rewrite ^/web/(.*)$ /$1 last; location / { try_files $uri $uri/ /index.php$is_args$args; }
Из демо БД, чтобы вручную не заводить кучу оборудования, ПО, производителей и т.п.
(а также категории оборудования и производители)
./yii sync/tech-models https://inventory.reviakin.net/api guest guest1
(а также само ПО и производители)
./yii sync/soft-lists https://inventory.reviakin.net/api guest guest1
./yii sync/lic-groups https://inventory.reviakin.net/api guest guest1
После установки переходим к настройке авторизации и параметров приложения.