Instalação do Servidor Standalone com Alma Linux 8

Processo de Instalação

O processo de instalação do Alma Linux 8 é mais interativo que nas outras distribuições e versões, abaixo irei guiar para uma melhor configuração.

Iniciamos a instalação entrando com um pen drive bootavél com o instalador.

Esta tela é da seleção do idioma do servidor, no campo de pesquisa digite português clique em Português na lista do lado esquerdo e em Português (Brasil) na lista do lado direito e clique em Continuar.

idioma.png

Na tela principal, clique em REDE & NOME DO HOST.

Idioma nome do host.png

No campo Nome do host digite o hostname e clique em Aplicar. Em seguida, ative a interface deseja, selecionando a interface na lista do lado esquerdo e no switch localizado no lado direito do nome (até ficar azul, conforme na imagem) e clica em Pronto.

Host.png

Voltando para tela principal, clique em DESTINO DE INSTALAÇÃO.

Destino de instalaçaao.png

Clique no disco desejado até ele ficar com um símbolo de marcado (uma bola preta, com um V em branco). Na sessão de particionamento, marque a opção personalizada em Configuração de armazenamento.

Disco.png

Remova todas as partições existentes, se existirem, e clique em "Clique aqui para criá-las automaticamente".

Auto.png

Selecione a partição /home e no botão de remover identificado com o símbolo de menos [ - ].

home.png

Selecione a partição / e no campo Capacidade desejada informa o total disponível (some o valor atual com o valor do espaço alocado anteriormente para partição /home) e clique fora do campo digitado. 

Clique em Pronto.

dis.png

Nessa tela o sistema apenas informa as alterações feitas. Clique em Aceitar Alterações.

mudanças.png

 

Voltando para tela principal, clique em "Iniciar a instalação" até abrir a tela acima.

Iniciar.png

A instalação será iniciada e ao finalizar o processo o botão "Reiniciar sistema" irá habilitar, clique.

2025_05_22_0sw_Kleki.png

Instalação Básica

Execute as seguintes instruções disponíveis no bloco abaixo:

dnf install -y net-tools && \
dnf install -y langpacks-pt_BR glibc-all-langpacks && \
dnf update -y && \
dnf remove -y httpd php* mysql* maria* epel* && \
dnf install -y cronie wget && \
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && \
dnf install -y nano postfix crudini htop mlocate iperf logrotate bmon mtr screen chrony tar rsync zip unzip bind-utils python39 && \
echo "export VISUAL=\"nano\"" >> ~/.bash_profile && \
echo "export EDITOR=\"nano\"" >> ~/.bash_profile && \
crudini --set /etc/yum.repos.d/epel.repo epel priority 10 && \
timedatectl set-timezone America/Sao_Paulo && \
localectl set-locale LANG=pt_BR.UTF-8 && \
sed -i -e "s/.*SELINUX=enforcing.*/SELINUX=disabled/" /etc/sysconfig/selinux && \
sed -i -e "s/.*SELINUX=enforcing.*/SELINUX=disabled/" /etc/selinux/config && \
systemctl disable firewalld && \
systemctl stop firewalld && \
reboot

O servidor irá reiniciar.

Instalação do DWService

Execute as seguintes instruções disponível no bloco abaixo:

wget https://www.dwservice.net/download/dwagent.sh &&\
chmod +x dwagent.sh &&\
./dwagent.sh

Responsa o seguinte questionário:

Instalação do MySQL

Execute as seguintes instruções disponível no bloco abaixo:

cd ~ && \
dnf module disable mysql -y && \
dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm && \
percona-release setup ps-80 && \
dnf install -y percona-server-client

Continue com a execução:

dnf install -y percona-server-client percona-server-server percona-xtrabackup-80 qpress && \
systemctl start mysql.service

Será necessário capturar a senha gerada automaticamente na instalação do serviço de MySQL, através do seguinte comando:

cat /var/log/mysqld.log  | grep "temporary password is generated"

Com a senha temporária gerada que foi exibida pelo comando anterior, continue executando o seguinte comando abaixo:

/usr/bin/mysql_secure_installation

Responsa o seguinte questionário:

É necessário executar as seguintes instruções por determinação do Percona (será solicitado a senha do usuário root do MySQL nos três comandos):

mysql -u root -p -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'" && \
mysql -u root -p -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'" && \
mysql -u root -p -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'"

Continue executando as seguintes instruções disponível no bloco abaixo:

crudini --set /etc/my.cnf mysqld sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION && \
crudini --set /etc/my.cnf mysqld max_allowed_packet 64M && \
crudini --set /etc/my.cnf mysqld bind-address 0.0.0.0 && \
crudini --set /etc/my.cnf mysqld binlog_expire_logs_seconds 21600 && \
crudini --set /etc/my.cnf mysqld max_binlog_size 500M && \
crudini --set /etc/my.cnf mysqld skip-external-locking 1 && \
crudini --set /etc/my.cnf mysqld skip-host-cache 1 && \
crudini --set /etc/my.cnf mysqld skip-name-resolve 1 && \
crudini --set /etc/my.cnf mysqld performance_schema 1 && \
crudini --set /etc/my.cnf xtrabackup open-files-limit 2000000 && \
crudini --set /etc/systemd/system/mysql.service Service LimitNOFILE 650000 && \
crudini --set /etc/my.cnf mysqldump max-allowed-packet 128M && \
crudini --set /etc/my.cnf mysqldump quick 1 && \
crudini --set /etc/my.cnf mysqldump quote-names 1 && \
sed -i -e "s/.*skip-external-locking.*/skip-external-locking/" /etc/my.cnf && \
sed -i -e "s/.*skip-host-cache.*/skip-host-cache/" /etc/my.cnf && \
sed -i -e "s/.*skip-name-resolve.*/skip-name-resolve/" /etc/my.cnf && \
sed -i -e "s/.*performance_schema.*/performance_schema/" /etc/my.cnf && \
sed -i -e "s/.*quick.*/quick/" /etc/my.cnf && \
sed -i -e "s/.*quote-names.*/quote-names/" /etc/my.cnf
echo "fs.file-max=5000000" >> /etc/sysctl.d/99-sysctl.conf && \
echo "fs.nr_open=2000000" >> /etc/sysctl.d/99-sysctl.conf && \
echo "mysql hard nofile 2000000" >> /etc/security/limits.conf && \
echo "mysql soft nofile 2000000" >> /etc/security/limits.conf && \
sysctl -w fs.file-max=5000000 && \
sysctl -w fs.nr_open=2000000 && \
systemctl daemon-reload

Precisamos corrigir o acesso do usuário root do MySQL, com as seguintes instruções (deve ser executada individualmente):

mysql -h localhost -u root -p mysql -e "SET GLOBAL validate_password.policy = 0;"
mysql -h localhost -u root -p mysql -e "UPDATE user SET Host = '%' WHERE user.Host  = 'localhost' AND user.User  = 'root' LIMIT 1;"

Continue executando o seguinte comando abaixo para definir a senha do root (a mesma definida no MySQL Secure Installation):

Se houver uma exclamação ( !senha ), deverá colocar o contra barra antes ( \!senha ).

mysql -h localhost -u root -p mysql -e "ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'SENHA';"

Observe que este comando poderá retornar um erro, e você deverá executar novamente para confirmar a operação, aonde retornará mensagem de sucesso.

Finaliza a instalação do MySQL reiniciando o serviço:

systemctl stop mysql.service && \
systemctl start mysql.service

Instalação do NGINX e PHP

Inicie executando as seguintes instruções disponível no bloco abaixo:

dnf -y install http://rpms.remirepo.net/enterprise/remi-release-8.rpm && \
dnf makecache -y && \
dnf module install php:remi-7.3

Será solicitado uma confirmação, aceite.

dnf install -y nginx git && \
dnf install -y php-fpm php-cli php-mysqlnd php-gd php-curl php-imap php-zip php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-pdo-dblib php-snmp php-soap php-tidy php-sqlite3 php-opcache && \
dnf install -y php-apcu php-mcrypt && \
sysctl -w net.ipv6.conf.all.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.default.disable_ipv6=1 && \
pecl channel-update pecl.php.net && \
systemctl enable nginx.service && \
systemctl enable php-fpm && \
systemctl start nginx.service && \
systemctl start php-fpm.service

Agora, vamos preparar pasta do serviço para receber o ILLI e definir as configurações.

Execute as seguintes instruções disponível no bloco abaixo:

mv /var/www /var/www.old && \
ln -s /usr/share/nginx/html /var/www && \
echo ":)" > /usr/share/nginx/html/index.html && \
cp -f /etc/php.ini /etc/php.ini.sample && \
cp -f /etc/php-fpm.conf /etc/php-fpm.conf.sample && \
sed -i -e "s/.*cgi.fix_pathinfo =.*/cgi.fix_pathinfo = 0/" /etc/php.ini && \
sed -i -e "s/.*date.timezone =.*/date.timezone = America\/Sao_Paulo/" /etc/php.ini && \
sed -i -e "s/.*upload_max_filesize =.*/upload_max_filesize = 500M/" /etc/php.ini && \
sed -i -e "s/.*post_max_size =.*/post_max_size = 500M/" /etc/php.ini && \
sed -i -e "s/.*memory_limit =.*/memory_limit = 1024M/" /etc/php.ini && \
sed -i -e "s/.*max_execution_time =.*/max_execution_time = 1800/" /etc/php.ini && \
sed -i -e "s/.*max_input_time =.*/max_input_time = 1800/" /etc/php.ini && \
sed -i -e "s/.*emergency_restart_threshold =.*/emergency_restart_threshold = 3/" /etc/php-fpm.conf && \
sed -i -e "s/.*emergency_restart_interval =.*/emergency_restart_interval = 1m/" /etc/php-fpm.conf && \
sed -i -e "s/.*process_control_timeout =.*/process_control_timeout = 5s/" /etc/php-fpm.conf && \
cd ~ && \
dnf install -y xorg-x11-server-Xvfb && \
dnf install -y https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm && \
echo 'exec xvfb-run -a -s "-screen 0 1280x1024x16" wkhtmltopdf "$@"' | tee /usr/local/bin/wkhtmltopdf.sh >/dev/null && \
chmod a+x /usr/local/bin/wkhtmltopdf.sh && \
sed -i -e "s/.*opcache.enable=.*/opcache.enable=1/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.save_comments=.*/opcache.save_comments=1/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php.d/10-opcache.ini && \
git config --global --add safe.directory '*'

Para configurar o NGINX, precisamos substituir o arquivo de configuração principal, através do comando:

echo "" > /etc/nginx/nginx.conf && \
nano /etc/nginx/nginx.conf

Inserindo o seguinte conteúdo:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
    multi_accept on;
}

http {

    log_format main '"$remote_addr" $host [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '$request_length $bytes_sent "$http_referer" '
                    '"$http_user_agent" $request_time "$gzip_ratio"';

    access_log off;

    sendfile on;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_requests 100;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    gzip off;

    open_file_cache max=2000 inactive=20s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 5;
    open_file_cache_errors off;
    client_max_body_size 500M;
    large_client_header_buffers 4 64k;
    server_tokens off;

    include /etc/nginx/conf.d/*.conf;
}

Criar o arquivo /etc/nginx/fastcgi_params.conf com os comandos abaixo:

nano /etc/nginx/fastcgi_params.conf

Insira o conteúdo conforme abaixo:

try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_connect_timeout 1800s;
fastcgi_send_timeout 1800s;
fastcgi_read_timeout 1800s;
fastcgi_buffer_size 4096k;
fastcgi_buffers 128 4096k;
fastcgi_busy_buffers_size 4096k;
include fastcgi_params;

Criar o arquivo /etc/nginx/default.d/proxy.conf com os comandos abaixo:

nano /etc/nginx/default.d/proxy.conf

Insira o conteúdo conforme abaixo:

proxy_redirect off;
proxy_http_version 1.1;

proxy_buffering on;
proxy_buffer_size 4096k;
proxy_buffers 128 4096k;
proxy_busy_buffers_size 4096k;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
send_timeout 1800s;

proxy_set_header    Host                $http_host;
proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-Ssl     on;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Proto   $scheme;

Criar o arquivo /etc/nginx/default.d/default.conf com os comandos abaixo:

nano /etc/nginx/default.d/default.conf

Insira o conteúdo conforme abaixo:

location / {
    index  index.php index.html index.htm;
    rewrite ^/gestor/(.*)$ /gestor/index.php?u=$1 last;
    try_files $uri $uri/ /index.php?$args;
    proxy_buffering on;
    proxy_buffer_size 4096k;
    proxy_buffers 128 4096k;
    proxy_busy_buffers_size 4096k;
    proxy_connect_timeout 1800s;
    proxy_send_timeout 1800s;
    proxy_read_timeout 1800s;
    send_timeout 1800s;
}

location ^~ /frontend/ {
    gzip on;
    gzip_http_version 1.1;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    gzip_types
      application/atom+xml
      application/javascript
      application/json
      application/rss+xml
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      application/xhtml+xml
      application/xml
      font/opentype
      image/svg+xml
      image/x-icon
      text/css
      text/plain
      text/x-component;
}

location ^~ /database {
    deny all;
    return 404;
}

location ~ \.cnf$ {
    deny all;
    return 404;
}

location ~ \.log$ {
    deny all;
    return 404;
}

location ~ \.sh$ {
    deny all;
    return 404;
}

location ~ cookie_(.*)$ {
    deny all;
    return 404;
}

location ~ config_local_(.*)$ {
    deny all;
    return 404;
}

location ^~ /.git/ {
    deny all;
    return 404;
}

location ^~ /backend/ {
    deny all;
    return 404;
}

location ^~ /documentacao/ {
    deny all;
    return 404;
}

location ^~ /migrations/ {
    deny all;
    return 404;
}

location ^~ /extras/nfe/ {
    deny all;
    return 404;
}

location ^~ /extras/nfephp/ {
    deny all;
    return 404;
}

error_page 404 /404.html;
    location = /40x.html {
    root   /usr/share/nginx/html;
}

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root   /usr/share/nginx/html;
}

Criar o arquivo /etc/nginx/default.d/php.conf com os comandos abaixo:

echo "" > /etc/nginx/default.d/php.conf && \
nano /etc/nginx/default.d/php.conf

Insira o conteúdo conforme abaixo:

location ~ \.php$ {
    fastcgi_pass unix:/var/lib/php/php-fpm-illi.sock;
    include fastcgi_params.conf;
}

Criar o arquivo /etc/nginx/default.d/php-sincronismo.conf com os comandos abaixo:

nano /etc/nginx/default.d/php-sincronismo.conf

Insira o conteúdo conforme abaixo:

location ~ \.php$ {
    fastcgi_pass unix:/var/lib/php/php-fpm-illi-sincronismo.sock;
    include fastcgi_params.conf;
}

E finalizamos com a preparação das pastas de trabalho, com os seguintes comandos:

mkdir -p /var/lib/php/sessions && \
mkdir -p /var/lib/php/operacional && \
mkdir -p /var/lib/php/sincronismo && \
mkdir -p /var/lib/php/relatorios && \
chown root:apache /var/lib/php/session && \
chown root:apache /var/lib/php/sessions && \
chmod 777 /var/lib/php/session && \
chmod 777 /var/lib/php/sessions

Instalação do ILLI

Primeiro, vamos precisar clonar o repositório do ILLI, através das instruções:

cd /var/www && \
git clone https://git.pdv.moda/publico/standalone.git illi && \
chmod +x illi/*.sh && \
chown -Rf apache:apache .

Agora vamos criar a instância do ILLI dentro do NGINX, com o seguinte comando:

echo "" > /etc/nginx/conf.d/illi.conf && \
nano /etc/nginx/conf.d/illi.conf

Insira o conteúdo conforme abaixo:

upstream ws-illi {
    ip_hash;
    server 127.0.0.1:7088;
}

server {
    listen 8088;
    server_name  _;

    error_log /var/log/nginx/illi-error.log error;

    location / {
        root   /usr/share/nginx/html/illi;
        include /etc/nginx/default.d/default.conf;
    }

    location ~ \.php$ {
        root   /usr/share/nginx/html/illi;
        include /etc/nginx/default.d/php.conf;
    }

    location /sincronismo {
        include /etc/nginx/default.d/proxy.conf;
        proxy_pass http://127.0.0.1:9088;
    }

    location /ws {
      proxy_redirect off;
      proxy_http_version 1.1;

      proxy_connect_timeout 1800s;
      proxy_send_timeout 1800s;
      proxy_read_timeout 1800s;
      send_timeout 1800s;

      proxy_set_header Host $http_host;
      proxy_set_header Client-IP $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Ssl on;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_pass http://ws-illi;
    
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
}

server {
    listen  9088;
    server_name  _;
  
    error_log /var/log/nginx/illi-error.log error;
  
    location / {
        root   /usr/share/nginx/html/illi;
        include /etc/nginx/default.d/default.conf;
    }
  
    location ~ \.php$ {
        root   /usr/share/nginx/html/illi;
        include /etc/nginx/default.d/php-sincronismo.conf;
    }
}

Em seguida, vamos criar a instância do ILLI dentro do PHP-FPM, com o seguinte comando:

echo "" > /etc/php-fpm.d/www.conf && \
nano /etc/php-fpm.d/illi.conf

Insira o conteúdo conforme abaixo:

[illi]
listen = /var/lib/php/php-fpm-illi.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = apache
group = apache
pm = ondemand
pm.max_children = 24
pm.max_requests = 200
pm.process_idle_timeout = 10s
security.limit_extensions = .php
php_admin_value[error_log] = /var/log/php-fpm/illi-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions
env[PATH] = '/usr/local/bin:/usr/bin:/bin'

[illi-sincronismo]
listen = /var/lib/php/php-fpm-illi-sincronismo.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = apache
group = apache
pm = ondemand
pm.max_children = 5
pm.max_requests = 50
pm.process_idle_timeout = 10s
security.limit_extensions = .php
php_admin_value[error_log] = /var/log/php-fpm/illi-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions
env[PATH] = '/usr/local/bin:/usr/bin:/bin'

E reiniciamos os serviços o ambiente através dos seguintes comandos, para levantarmos o ambiente:

systemctl stop nginx.service && \
systemctl stop php-fpm.service && \
systemctl start php-fpm.service && \
systemctl start nginx.service

Instalação do Agendador de Tarefas e Criação do Sync

Abra o editor do CRONTAB com o comando abaixo:

crontab -e

Insira a seguinte instrução abaixo na última linha:

* * * * * /usr/bin/sudo -u apache /usr/bin/php /var/www/illi/index.php cron executar;

Saia do editor com a sequência CTRL + X, e execute o comando abaixo:

systemctl restart crond.service

Com o agendador de tarefas criado, podemos seguir para a criação do Sync.

Primeiro pegamos o ip do servidor, jogamos no navegador e no final adicionamos a porta :8088. No navegador irá abrir a seguinte tela:

image.png

Preencha de acordo com as informações que possui:

Servidor (hostname): localhost

Usuário: root

Alias da senha: !@A7v400mx

Banco de dados: illi

Base de instalação: /usr

Por fim clique em Configurar e a tela irá mudar para essa solicitando a Licença criada pro cliente, coloque e Registre.

Captura de tela 2025-05-28 164834.png