# 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 `pm.ro.gov.br` em um servidor de homologação.</div><div>&gt; **Ambiente testado:** Debian GNU/Linux 13 (trixie) — `sirius-web-hml-01`</div>  
<div>---</div>  
<div>\## ⚠️ Diferenças entre Produção e Homologação</div>  
<div>| Componente | Produção | Homologação (este guia) |</div><div>|--------------|---------------------------|----------------------------|</div><div>| SO | Ubuntu 22.04.5 LTS | Debian 13 (trixie) |</div><div>| Apache | 2.4.52 | 2.4.66 ✅ |</div><div>| PHP | 8.1.2 | 8.1.34 ✅ (via sury.org) |</div><div>| MariaDB | 10.6.22 | 11.8.6 ⚠️ (ver nota) |</div><div>| WordPress | 6.9.4 | 6.9.4 ✅ |</div><div>| SSL/Proxy | Proxy reverso 172.16.139.3| Sem proxy (HTTP local) |</div><div>| MariaDB bind | 0.0.0.0 (risco em prod) | 127.0.0.1 ✅ (mais seguro) |</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>```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>```</div>  
<div>---</div>  
<div>\## 3. Apache 2.4</div>  
<div>\### Instalação</div>  
<div>```bash</div><div>sudo apt install -y apache2</div><div>```</div>  
<div>\### Ativar módulos necessários</div>  
<div>```bash</div><div>sudo a2enmod rewrite headers proxy proxy_http</div><div>sudo systemctl restart apache2</div><div>```</div>  
<div>\### Validação</div>  
<div>```bash</div><div>sudo apache2ctl -v # deve exibir Apache/2.4.x</div><div>sudo systemctl is-active apache2 # deve retornar: active</div><div>```</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>```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" | sudo tee /etc/apt/sources.list.d/sury-php.list</div><div>sudo apt update</div><div>```</div>  
<div>\### Instalar PHP 8.1 e extensões</div>  
<div>```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>```</div>  
<div>\### Validação</div>  
<div>```bash</div><div>php8.1 -v</div><div>\# PHP 8.1.x (cli) ... with Zend OPcache</div>  
<div>php8.1 -m | grep -E "^(curl|mbstring|mysqli|zip|gd|xml|intl|bcmath|soap|Zend OPcache)$"</div><div>\# deve listar todas as extensões acima</div><div>```</div>  
<div>---</div>  
<div>\## 5. MariaDB</div>  
<div>\### Instalar (versão do repositório Debian)</div>  
<div>```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>```</div>  
<div>\### ✅ Restringir bind para 127.0.0.1 (segurança)</div>  
<div>```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>```</div>  
<div>\### Validação</div>  
<div>```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>```</div>  
<div>---</div>  
<div>\## 6. Banco de dados WordPress</div>  
<div>&gt; ⚠️ Altere a senha `SenhaSitepm@2026` para uma senha forte antes de usar em produção.</div>  
<div>```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>```</div>  
<div>\### Validação</div>  
<div>```bash</div><div>sudo mysql -u root -e "SHOW DATABASES LIKE 'sitepm';"</div><div>\# deve listar o banco sitepm</div><div>```</div>  
<div>---</div>  
<div>\## 7. WordPress 6.9.4</div>  
<div>\### Download e extração</div>  
<div>```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>```</div>  
<div>\### Criar wp-config.php</div>  
<div>```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>```</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 `wp-config.php`, **antes** da linha `require_once ABSPATH . 'wp-settings.php'`:</div>  
<div>```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>```</div>  
<div>Ou via linha de comando:</div>  
<div>```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>```</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 `wp-config.php`.</div>  
<div>\### Permissões finais</div>  
<div>```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>```</div>  
<div>---</div>  
<div>\## 8. VirtualHost Apache</div>  
<div>```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>```</div>  
<div>\### Validação</div>  
<div>```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>```</div>  
<div>---</div>  
<div>\## 9. Segurança</div>  
<div>\### fail2ban (proteção brute-force)</div>  
<div>```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>```</div>  
<div>\### auditd (auditoria de syscalls)</div>  
<div>```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>```</div>  
<div>---</div>  
<div>\## 10. Ferramentas de diagnóstico</div>  
<div>```bash</div><div>sudo apt install -y htop ncdu net-tools</div><div>```</div>  
<div>---</div>  
<div>\## 11. Finalização — WP Admin</div>  
<div>Acesse: `http://&lt;IP-DO-SERVIDOR&gt;/wp-admin/install.php`</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>| Plugin | Função |</div><div>|--------|--------|</div><div>| elementor | Page builder |</div><div>| elementor-pro | Page builder Pro (licença necessária) |</div><div>| astra-sites | Importador de templates Astra |</div><div>| astra-widgets | Widgets do tema Astra |</div><div>| all-in-one-wp-migration | **Usar para importar backup da produção** |</div><div>| wps-hide-login | Oculta `/wp-login.php` |</div><div>| wp-mail-smtp | Relay SMTP de e-mail |</div><div>| wp-seopress | SEO |</div><div>| wpfront-user-role-editor | Permissões de usuários |</div><div>| loginpress | Personalização da tela de login |</div><div>| nextgen-gallery | Galeria de imagens |</div><div>| hide-admin-menu | Restrição de menu administrativo |</div><div>| header-footer-code-manager | Código no header/footer |</div><div>| header-footer-elementor | Header e footer via Elementor |</div><div>| custom-css-js | CSS/JS customizado |</div><div>| duplicate-page | Duplicar páginas |</div><div>| duplicate-menu | Duplicar menus |</div><div>| classic-editor | Editor clássico (desativa Gutenberg) |</div><div>| re-add-underline-justify | Botões de formatação extra |</div><div>| ele-custom-skin | Skin para Elementor |</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>```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>```</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 `.wpress` 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>```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>```</div>  
<div>---</div>  
<div>\## 13. Validação final do ambiente</div>  
<div>```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 | head -1</div><div>php8.1 -v | 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>```</div>  
<div>---</div>  
</div>