# Ambiente WordPress - SITE PM-RO. Instalação.

Processo de instalação do ambiente de homologação do SITE da PM-RO.

# Nova Página

<div id="bkmrk-%23-wiki-%E2%80%94-instala%C3%A7%C3%A3o-"><div>\# Wiki — Instalação do Ambiente pm.ro.gov.br</div>  
<div>&gt; **Autor:** moraes</div><div>&gt; **Data:** 06/05/2026</div><div>&gt; **Objetivo:** Replicar o ambiente de produção do site WordPress &#96;pm.ro.gov.br&#96; em um servidor de homologação.</div><div>&gt; **Ambiente testado:** Debian GNU/Linux 13 (trixie) — &#96;sirius-web-hml-01&#96;</div>  
<div>---</div>  
<div>\## ⚠️ Diferenças entre Produção e Homologação</div>  
<div>&#124; Componente &#124; Produção &#124; Homologação (este guia) &#124;</div><div>&#124;--------------&#124;---------------------------&#124;----------------------------&#124;</div><div>&#124; SO &#124; Ubuntu 22.04.5 LTS &#124; Debian 13 (trixie) &#124;</div><div>&#124; Apache &#124; 2.4.52 &#124; 2.4.66 ✅ &#124;</div><div>&#124; PHP &#124; 8.1.2 &#124; 8.1.34 ✅ (via sury.org) &#124;</div><div>&#124; MariaDB &#124; 10.6.22 &#124; 11.8.6 ⚠️ (ver nota) &#124;</div><div>&#124; WordPress &#124; 6.9.4 &#124; 6.9.4 ✅ &#124;</div><div>&#124; SSL/Proxy &#124; Proxy reverso 172.16.139.3&#124; Sem proxy (HTTP local) &#124;</div><div>&#124; MariaDB bind &#124; 0.0.0.0 (risco em prod) &#124; 127.0.0.1 ✅ (mais seguro) &#124;</div>  
<div>&gt; **Nota MariaDB:** O Debian trixie não oferece suporte ao MariaDB 10.6 nos repositórios oficiais da MariaDB. A versão 11.8.6 é totalmente compatível com WordPress 6.9.4.</div>  
<div>---</div>  
<div>\## 1. Pré-requisitos</div>  
<div>- Servidor com Debian 13 (trixie) instalado</div><div>- Acesso sudo</div><div>- Conexão com a internet</div>  
<div>---</div>  
<div>\## 2. Atualização do sistema e pacotes base</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt update</div><div>sudo apt install -y curl wget unzip git apt-transport-https ca-certificates gnupg lsb-release</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 3. Apache 2.4</div>  
<div>\### Instalação</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y apache2</div><div>&#96;&#96;&#96;</div>  
<div>\### Ativar módulos necessários</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo a2enmod rewrite headers proxy proxy_http</div><div>sudo systemctl restart apache2</div><div>&#96;&#96;&#96;</div>  
<div>\### Validação</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apache2ctl -v # deve exibir Apache/2.4.x</div><div>sudo systemctl is-active apache2 # deve retornar: active</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 4. PHP 8.1</div>  
<div>O Debian trixie não inclui PHP 8.1 nos repositórios padrão. É necessário usar o repositório **sury.org**:</div>  
<div>\### Adicionar repositório</div>  
<div>&#96;&#96;&#96;bash</div><div>curl -sSLo /tmp/sury.gpg https://packages.sury.org/php/apt.gpg</div><div>sudo install -o root -g root -m 644 /tmp/sury.gpg /etc/apt/trusted.gpg.d/sury-php.gpg</div><div>echo "deb https://packages.sury.org/php/ trixie main" &#124; sudo tee /etc/apt/sources.list.d/sury-php.list</div><div>sudo apt update</div><div>&#96;&#96;&#96;</div>  
<div>\### Instalar PHP 8.1 e extensões</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y \</div><div>php8.1 \</div><div>php8.1-mysql \</div><div>php8.1-xml \</div><div>php8.1-curl \</div><div>php8.1-mbstring \</div><div>php8.1-zip \</div><div>php8.1-gd \</div><div>php8.1-intl \</div><div>php8.1-bcmath \</div><div>php8.1-soap \</div><div>php8.1-opcache \</div><div>libapache2-mod-php8.1</div><div>&#96;&#96;&#96;</div>  
<div>\### Validação</div>  
<div>&#96;&#96;&#96;bash</div><div>php8.1 -v</div><div>\# PHP 8.1.x (cli) ... with Zend OPcache</div>  
<div>php8.1 -m &#124; grep -E "^(curl&#124;mbstring&#124;mysqli&#124;zip&#124;gd&#124;xml&#124;intl&#124;bcmath&#124;soap&#124;Zend OPcache)$"</div><div>\# deve listar todas as extensões acima</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 5. MariaDB</div>  
<div>\### Instalar (versão do repositório Debian)</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y mariadb-server mariadb-client</div><div>sudo systemctl enable mariadb</div><div>sudo systemctl start mariadb</div><div>&#96;&#96;&#96;</div>  
<div>\### ✅ Restringir bind para 127.0.0.1 (segurança)</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo sed -i 's/^bind-address\s*=.*/bind-address = 127.0.0.1/' \</div><div>/etc/mysql/mariadb.conf.d/50-server.cnf</div>  
<div>sudo systemctl restart mariadb</div><div>&#96;&#96;&#96;</div>  
<div>\### Validação</div>  
<div>&#96;&#96;&#96;bash</div><div>mariadb --version</div><div>sudo systemctl is-active mariadb # deve retornar: active</div><div>grep bind-address /etc/mysql/mariadb.conf.d/50-server.cnf</div><div>\# deve mostrar: bind-address = 127.0.0.1</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 6. Banco de dados WordPress</div>  
<div>&gt; ⚠️ Altere a senha &#96;SenhaSitepm@2026&#96; para uma senha forte antes de usar em produção.</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo mysql -u root &lt;&lt;'SQL'</div><div>CREATE DATABASE IF NOT EXISTS sitepm</div><div>CHARACTER SET utf8mb4</div><div>COLLATE utf8mb4_unicode_ci;</div>  
<div>CREATE USER IF NOT EXISTS 'pessoa'@'localhost'</div><div>IDENTIFIED BY 'SenhaSitepm@2026';</div>  
<div>GRANT ALL PRIVILEGES ON sitepm.* TO 'pessoa'@'localhost';</div><div>FLUSH PRIVILEGES;</div><div>SQL</div><div>&#96;&#96;&#96;</div>  
<div>\### Validação</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo mysql -u root -e "SHOW DATABASES LIKE 'sitepm';"</div><div>\# deve listar o banco sitepm</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 7. WordPress 6.9.4</div>  
<div>\### Download e extração</div>  
<div>&#96;&#96;&#96;bash</div><div>cd /tmp</div><div>curl -O https://wordpress.org/wordpress-6.9.4.tar.gz</div><div>tar -xzf wordpress-6.9.4.tar.gz</div><div>sudo rsync -a --delete wordpress/ /var/www/html/</div><div>sudo chown -R www-data:www-data /var/www/html</div><div>sudo find /var/www/html -type d -exec chmod 755 {} \;</div><div>sudo find /var/www/html -type f -exec chmod 644 {} \;</div><div>rm -rf /tmp/wordpress /tmp/wordpress-6.9.4.tar.gz</div><div>&#96;&#96;&#96;</div>  
<div>\### Criar wp-config.php</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php</div>  
<div>sudo sed -i \</div><div>"s/database_name_here/sitepm/; \</div><div>s/username_here/pessoa/; \</div><div>s/password_here/SenhaSitepm@2026/; \</div><div>s/'localhost'/'127.0.0.1'/" \</div><div>/var/www/html/wp-config.php</div><div>&#96;&#96;&#96;</div>  
<div>\### ⚠️ Inserir bloco de proxy reverso (CRÍTICO)</div>  
<div>Este bloco corrige o loop de redirecionamento HTTPS (incidente 28/04/2026).</div><div>**Nunca remova este bloco se o ambiente usar proxy reverso.**</div>  
<div>Insira manualmente no &#96;wp-config.php&#96;, **antes** da linha &#96;require_once ABSPATH . 'wp-settings.php'&#96;:</div>  
<div>&#96;&#96;&#96;php</div><div>/* Detecta HTTPS quando atrás de proxy reverso */</div><div>if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &amp;&amp;</div><div>'https' === strtolower( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {</div><div>$_SERVER['HTTPS'] = 'on';</div><div>}</div><div>&#96;&#96;&#96;</div>  
<div>Ou via linha de comando:</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo sed -i "/require_once ABSPATH . 'wp-settings.php';/i \\</div><div>\/* Detecta HTTPS quando atras de proxy reverso *\\/\\</div><div>if ( isset( \$_SERVER['HTTP_X_FORWARDED_PROTO'] ) &amp;&amp;\\</div><div>'https' === strtolower( \$_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {\\</div><div>\$_SERVER['HTTPS'] = 'on';\\</div><div>}" /var/www/html/wp-config.php</div><div>&#96;&#96;&#96;</div>  
<div>\### Gerar chaves secretas</div>  
<div>Acesse: https://api.wordpress.org/secret-key/1.1/salt/</div><div>Substitua o bloco de chaves no &#96;wp-config.php&#96;.</div>  
<div>\### Permissões finais</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo chmod 640 /var/www/html/wp-config.php</div><div>sudo chown www-data:www-data /var/www/html/wp-config.php</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 8. VirtualHost Apache</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo bash -c 'cat &gt; /etc/apache2/sites-available/wordpress.conf &lt;&lt;EOF</div><div>&lt;VirtualHost *:80&gt;</div><div>ServerName localhost</div><div>DocumentRoot /var/www/html</div>  
<div>&lt;Directory /var/www/html&gt;</div><div>Options FollowSymLinks</div><div>AllowOverride All</div><div>Require all granted</div><div>&lt;/Directory&gt;</div>  
<div>ErrorLog \${APACHE_LOG_DIR}/error.log</div><div>CustomLog \${APACHE_LOG_DIR}/access.log combined</div><div>&lt;/VirtualHost&gt;</div><div>EOF'</div>  
<div>sudo a2dissite 000-default.conf</div><div>sudo a2ensite wordpress.conf</div><div>sudo systemctl reload apache2</div><div>&#96;&#96;&#96;</div>  
<div>\### Validação</div>  
<div>&#96;&#96;&#96;bash</div><div>curl -s -o /dev/null -w "%{http_code}" http://localhost/</div><div>\# 302 = WordPress aguardando configuração inicial (esperado)</div><div>\# 200 = WordPress já configurado</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 9. Segurança</div>  
<div>\### fail2ban (proteção brute-force)</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y fail2ban</div><div>sudo systemctl enable fail2ban</div><div>sudo systemctl start fail2ban</div><div>sudo systemctl is-active fail2ban # deve retornar: active</div><div>&#96;&#96;&#96;</div>  
<div>\### auditd (auditoria de syscalls)</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y auditd</div><div>sudo systemctl enable auditd</div><div>sudo systemctl start auditd</div><div>sudo systemctl is-active auditd # deve retornar: active</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 10. Ferramentas de diagnóstico</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo apt install -y htop ncdu net-tools</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 11. Finalização — WP Admin</div>  
<div>Acesse: &#96;http://&lt;IP-DO-SERVIDOR&gt;/wp-admin/install.php&#96;</div>  
<div>Complete o assistente de instalação do WordPress e em seguida instale os plugins abaixo via **Plugins → Adicionar novo**:</div>  
<div>\### Plugins (replicar da produção)</div>  
<div>&#124; Plugin &#124; Função &#124;</div><div>&#124;--------&#124;--------&#124;</div><div>&#124; elementor &#124; Page builder &#124;</div><div>&#124; elementor-pro &#124; Page builder Pro (licença necessária) &#124;</div><div>&#124; astra-sites &#124; Importador de templates Astra &#124;</div><div>&#124; astra-widgets &#124; Widgets do tema Astra &#124;</div><div>&#124; all-in-one-wp-migration &#124; **Usar para importar backup da produção** &#124;</div><div>&#124; wps-hide-login &#124; Oculta &#96;/wp-login.php&#96; &#124;</div><div>&#124; wp-mail-smtp &#124; Relay SMTP de e-mail &#124;</div><div>&#124; wp-seopress &#124; SEO &#124;</div><div>&#124; wpfront-user-role-editor &#124; Permissões de usuários &#124;</div><div>&#124; loginpress &#124; Personalização da tela de login &#124;</div><div>&#124; nextgen-gallery &#124; Galeria de imagens &#124;</div><div>&#124; hide-admin-menu &#124; Restrição de menu administrativo &#124;</div><div>&#124; header-footer-code-manager &#124; Código no header/footer &#124;</div><div>&#124; header-footer-elementor &#124; Header e footer via Elementor &#124;</div><div>&#124; custom-css-js &#124; CSS/JS customizado &#124;</div><div>&#124; duplicate-page &#124; Duplicar páginas &#124;</div><div>&#124; duplicate-menu &#124; Duplicar menus &#124;</div><div>&#124; classic-editor &#124; Editor clássico (desativa Gutenberg) &#124;</div><div>&#124; re-add-underline-justify &#124; Botões de formatação extra &#124;</div><div>&#124; ele-custom-skin &#124; Skin para Elementor &#124;</div>  
<div>\### Tema</div>  
<div>1. Instalar **Astra** (tema pai)</div><div>2. Instalar **astra-child** (tema filho)</div><div>3. Ativar o **astra-child**</div>  
<div>\### Arquivos customizados (copiar da produção)</div>  
<div>&#96;&#96;&#96;bash</div><div>\# Copiar do servidor de produção:</div><div>scp moraes@172.16.139.59:/var/www/html/hardesec.php /var/www/html/</div><div>scp moraes@172.16.139.59:/var/www/html/index.js /var/www/html/</div><div>sudo chown www-data:www-data /var/www/html/hardesec.php /var/www/html/index.js</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 12. Importar banco da produção (via all-in-one-wp-migration)</div>  
<div>1. No servidor de **produção**: Plugins → All-in-One WP Migration → Exportar → Arquivo</div><div>2. Baixe o arquivo &#96;.wpress&#96; gerado</div><div>3. No servidor de **homologação**: Plugins → All-in-One WP Migration → Importar → Arquivo</div><div>4. Após a importação, atualizar as URLs no banco:</div>  
<div>&#96;&#96;&#96;bash</div><div>sudo mysql -u root sitepm &lt;&lt;'SQL'</div><div>UPDATE wp_options SET option_value = 'http://localhost'</div><div>WHERE option_name IN ('siteurl', 'home');</div><div>SQL</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
<div>\## 13. Validação final do ambiente</div>  
<div>&#96;&#96;&#96;bash</div><div>echo "=== Serviços ==="</div><div>sudo systemctl is-active apache2 mariadb fail2ban auditd</div>  
<div>echo "=== Versões ==="</div><div>sudo apache2ctl -v &#124; head -1</div><div>php8.1 -v &#124; head -1</div><div>mariadb --version</div>  
<div>echo "=== Banco ==="</div><div>sudo mysql -u root -e "SHOW DATABASES LIKE 'sitepm';"</div>  
<div>echo "=== WordPress ==="</div><div>ls /var/www/html/wp-login.php</div>  
<div>echo "=== HTTP ==="</div><div>curl -s -o /dev/null -w "Status: %{http_code}\n" http://localhost/</div><div>&#96;&#96;&#96;</div>  
<div>---</div>  
</div>