• YetiForceCRM

 #10754   IgorA100
 27 окт 2024, 11:47
YetiForceCRM
Официальный сайт: https://yetiforce.com/en/
Онлайн демо: https://demo.yetiforce.com/index.php?mo ... view=Login
Документация: https://doc.yetiforce.com/
Новый репозиторий БЕЗ исходного кода: https://github.com/YetiForceCompany/Yet ... ussions/29
Старый репозиторий с исходным кодом до версии 6,5 (2024год) https://github.com/YetiForceCompany/YetiForceCRM
Новость про изменение политики лицензирования и собирания денег: https://github.com/YetiForceCompany/Yet ... ussions/27
Инсталятор 6.5.0 : https://sourceforge.net/projects/yetifo ... p/download

Подготовка:
https://doc.yetiforce.com/introduction/requirements/
Ставим и настраиваем LAMP https://www.kentavr.com.ru/forum/viewto ... hilit=lamp , затем доставляем:
Код: Выделить всёapt-get install php-sqlite3 php-cli php-soap php-bcmath php-apcu wget unzip
 sudo phpenmod pdo_mysql - Нужно ли ???

Создаем таблицу и пользователя в БД:
Код: Выделить всё$ sudo mysql -u root -p
CREATE DATABASE yetiforce;
CREATE USER 'yetiforceuser'@'localhost' IDENTIFIED BY 'StrongPassword';
GRANT ALL ON yetiforce.* TO 'yetiforceuser'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT



Установка:
https://doc.yetiforce.com/introduction/ ... on-manual/
https://docs.vultr.com/install-yetiforc ... untu-20-04
Если при установке появляются проблемы, то нужно включить режим отладки: https://doc.yetiforce.com/developer-guides/debug/
Чтобы включить запись в файлы журнала, вам нужно установить значение LOG_TO_FILE в true в config/Debug.php, а затем установить соответствующий уровень записи изменений LOG_LEVELS.

Логи находятся по адресму: cache/logs/

Код: Выделить всёcd /home/yfprod/html/
wget -O YetiForceCRM.zip https://api.yetiforce.eu/download/crm/www/7.0.0-complete
unzip YetiForceCRM.zip

sudo chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
или так для ПАПОК и ФАЛОВ вместе
sudo chmod -R 755 /var/www/html
sudo a2enmod rewrite


Запуск установщика:
Код: Выделить всёhttp://...../install/Install.php


Регистрация
Если в файле
Код: Выделить всё \app\YetiForce\Register.php
в функции isRegistered()
заменить:
        
Код: Выделить всёreturn (new self())->getStatus() >= 6 && self::getConfValue('appId') === self::getInstanceKey();

на
Код: Выделить всёreturn true;

или на:
Код: Выделить всёreturn self::getConfValue('appId') === self::getInstanceKey();

то больше предупреждение не появляется и вроде функционал не ограничен. Маркетплейс не в счет...

Рекомендуется сделать, если не планируете производить регистрацию:
В файле \config\ConfigTemplates.php
заменить:
Код: Выделить всё'default' => 'https://api.yetiforce.eu',

на
Код: Выделить всё'default' => '',

в файле \config\Main.php
заменить:
Код: Выделить всё    public static $regApiBaseUrl = 'https://api.yetiforce.eu';

на:
Код: Выделить всё    public static $regApiBaseUrl = '';


ТЮНИНГ
При каждом входе Администратора появляется назойливое окно "Enter visit purpose" в котором необходимо ввести причину входа администратора. Чтобы убрать это раздражающее окно, необходимо исправить строку
Код: Выделить всё /** @var bool Ask admin about visit purpose */
 public static $askAdminAboutVisitPurpose = true;

в файле /var/www/html/config/Security.php заменив "true" на "false"
https://github.com/YetiForceCompany/Yet ... sues/13883

Изменить время жизни сессии:
В файле "/var/www/html/config/Security.php" изменить значение на нужное значение в секундах:
Код: Выделить всё   public static $maxLifetimeSession = 900;


Оптимальные настройки NGINX: https://github.com/YetiForceCompany/Yet ... nf#L84-L90
Код: Выделить всё##############################################
#  Best configuration for YetiForceCRM       #
#  Created by m.krzaczkowski@yetiforce.com   #
##############################################

##########################
##       Security       ##
##########################
server_tokens off;
etag off;

##  nginx module: header_filter_by_lua_block
header_filter_by_lua_block {
   ngx.header['X-Frame-Options'] = "SAMEORIGIN"
   ngx.header['X-XSS-Protection'] = "1; mode=block"
   ngx.header['X-Content-Type-Options'] = "nosniff"
   ngx.header['Referrer-Policy'] = "no-referrer"
   ngx.header['Strict-Transport-Security'] = "max-age=31536000; includeSubDomains; preload"
   ngx.header['X-Robots-Tag'] = "none"
   ngx.header['X-Permitted-Cross-Domain-Policies'] = "none"
   ngx.header['Expect-CT'] = "enforce; max-age=3600"
   ngx.header["Cache-Control"] = ngx.header["Cache-Control"];
}

##  nginx module: headers-more-nginx-module
# https://github.com/openresty/headers-more-nginx-module#installation
# https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/
more_clear_headers 'Server';
more_clear_headers 'X-Frame-Options';
more_clear_headers 'X-XSS-Protection';
more_clear_headers 'X-Content-Type-Options';
more_clear_headers 'Referrer-Policy';
more_clear_headers 'Strict-Transport-Security';
more_clear_headers 'X-Robots-Tag';
more_clear_headers 'X-Permitted-Cross-Domain-Policies';
more_clear_headers 'Expect-CT';

more_set_headers 'Server: ';
more_set_headers 'X-Frame-Options: SAMEORIGIN';
more_set_headers 'X-XSS-Protection: 1; mode=block';
more_set_headers 'X-Content-Type-Options: nosniff';
more_set_headers 'Referrer-Policy: no-referrer';
more_set_headers 'Strict-Transport-Security: max-age=31536000; includeSubDomains; preload';
more_set_headers 'X-Robots-Tag: none';
more_set_headers 'X-Permitted-Cross-Domain-Policies: none';
more_set_headers 'Expect-CT: enforce; max-age=3600';

##########################
##       Stability      ##
##########################
charset utf-8;
client_max_body_size 100M;
client_body_buffer_size 100M;
client_body_timeout 600;
send_timeout 600;
fastcgi_buffers 256 256k;
fastcgi_buffer_size 256k;
##########################
##      Performance     ##
##########################
access_log off;
gzip on;
gzip_types
text/css text/javascript text/xml text/plain text/x-component
application/javascript application/x-javascript   application/json application/xml application/rss+xml application/atom+xml application/vnd.ms-fontobject
font/truetype font/opentype
image/jpeg image/bmp image/svg+xml image/x-icon;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 500;
gzip_disable "msie6";

#add_header Cache-Control "private, no-cache, no-store, must-revalidate, post-check=0, pre-check=0" always;
more_clear_headers 'Cache-Control';
more_set_headers 'Cache-Control: private, no-cache, no-store, must-revalidate, post-check=0, pre-check=0';
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv|ttf|ttc|otf|eot|woff2?)$ {
   access_log off;
   expires 1d;
   #add_header Cache-Control public always;
   more_clear_headers 'Cache-Control';
   more_set_headers 'Cache-Control: public';
   etag on;
}
##########################
##     YetiForce API    ##
##########################
rewrite ^/webservice/(.*)/(.*)/(.*)/(.*)/(.*)$ /webservice.php?_container=$1&module=$2&action=$3&record=$4&param=$5 break;
rewrite ^/webservice/(.*)/(.*)/(.*)/(.*)$ /webservice.php?_container=$1&module=$2&action=$3&record=$4 break;
rewrite ^/webservice/(.*)/(.*)/(.*)$ /webservice.php?_container=$1&module=$2&action=$3 break;
rewrite ^/webservice/(.*)/(.*)$ /webservice.php?_container=$1&action=$2 break;
 #10760   IgorA100
 19 ноя 2024, 16:21
Обновление
За обновление отвечает файл "\modules\Settings\Updates\views\Index.php" из которого вызывается методы из "\app\YetiForce\Updater.php" например
Код: Выделить всё\App\YetiForce\Updater::download($package);


При обновлении страницы обновления (Логи->Обновление) функция "public static function get(): array" получает массив доступных обновлений и сохраняет в файл '/app_data/SystemUpdater.json' с интервалом не менее 5 минут.
Если запрос обновления происходит в течении 5 минут после записи файла SystemUpdater.json, то просто возвращается значения из файла.
 #10761   IgorA100
 19 ноя 2024, 20:32
Интересные файлы:
\app\YetiForce\Updater.php
\modules\Settings\Updates\views\Index.php
\modules\Settings\Companies\models\Record.php
\config\Main.php
\config\ConfigTemplates.php
\app\YetiForce\ApiClient.php
\app\YetiForce\Register.php
\config\version.php

Подтверждение E-Mail при регистрации (сразу после установки новой системы)
\modules\Settings\Companies\actions\VerifyEmail.php
\layouts\basic\modules\Settings\Companies\EmailVerificationModal.tpl
\app\YetiForce\EmailVerification.php
 #10762   IgorA100
 19 ноя 2024, 23:17
После отправки подтверждения E-Mail открывается окно с запросом на ввод код подтверждения
Email with a verification code has been sent. Type the code below in order to proceed.

Код подтверждения приходит с адреса
Код: Выделить всёregistration@yetiforce.com

Текст письма:
Welcome to YetiForce!
Use the verification code below for your YetiForce instance.

Verification code: d93cf7bd500c40de40dce82fbe2e1e238e0ea2c6


Thank you for choosing YetiForce!


Затем появляется окно с вводом данных для регистрации YetiForce
Заголовок окна: YetiForce - Company registration