Script de Reparo Rápido do Windows

O script abaixo executa uma série de verificações e correções automáticas no Windows, incluindo reparo de arquivos do sistema, restauração da imagem do sistema, verificação de disco, reset de rede, limpeza de arquivos temporários, reinstalação de aplicativos nativos e reset dos componentes do Windows Update.

Esse tipo de script é útil para resolver problemas comuns como erros do sistema, falhas de atualização, problemas de rede e lentidão causada por arquivos temporários.


Código do Script

Copie o código abaixo e salve em um arquivo com extensão .bat, por exemplo:

reparo_windows.bat

@echo off
title Reparo rapido do Windows - Emerson
echo Iniciando...

:: 1 - Verificar e reparar arquivos do sistema
sfc /scannow

:: 2 - Restaurar a imagem do Windows
DISM /Online /Cleanup-Image /RestoreHealth

:: 3 - Agendar verificacao do disco (sera executado no reinicio)
chkdsk C: /f /r

:: 4 - Reset de rede completo
ipconfig /flushdns
ipconfig /release
ipconfig /renew
netsh winsock reset
netsh int ip reset

:: 5 - Limpeza de temporarios
del /s /f /q "%TEMP%\*.*" >nul 2>&1
for /d %%i in ("%TEMP%\*") do rd /s /q "%%i" >nul 2>&1

:: 6 - Reinstalar apps nativos
powershell.exe -Command "Get-AppXPackage -AllUsers | Foreach {Try {Add-AppxPackage -DisableDevelopmentMode -Register '$($_.InstallLocation)\AppXManifest.xml'} Catch {}}"

:: 7 - Reset do Windows Update
net stop wuauserv
net stop bits
net stop cryptsvc
ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
ren C:\Windows\System32\catroot2 catroot2.old
net start wuauserv
net start bits
net start cryptsvc

echo Finalizado. Reinicie o PC.
pause

O que o script faz

1. Verificação de arquivos do sistema

  • Executa o sfc /scannow para detectar e reparar arquivos corrompidos do Windows.

2. Reparo da imagem do Windows

  • Utiliza o DISM para restaurar a integridade da imagem do sistema.

3. Verificação do disco

  • Agenda o chkdsk para corrigir erros no disco na próxima reinicialização.

4. Reset completo da rede

  • Limpa DNS, renova IP e redefine as configurações de rede.

5. Limpeza de arquivos temporários

  • Remove arquivos temporários da pasta %TEMP%.

6. Reinstala aplicativos nativos

  • Re-registra todos os aplicativos padrão do Windows via PowerShell.

7. Reset do Windows Update

  • Reinicia os serviços e recria as pastas usadas pelo Windows Update.

Importante

Para que todas as funções funcionem corretamente, execute o arquivo como Administrador:

  1. Clique com o botão direito no arquivo .bat
  2. Selecione Executar como administrador

Ao final do processo, reinicie o computador para que todas as correções sejam aplicadas.

Docker WordPress com MySQL compartilhado

Vantagens desta configuração

  1. MySQL único: economiza recursos, mais fácil de fazer backup
  2. Isolamento: cada WordPress roda em container separado
  3. Escalabilidade: adicionar novos sites é rápido
  4. Segurança: containers não expostos diretamente (apenas localhost)
  5. Manutenção: atualizar WordPress individualmente sem afetar outros

Habilite os módulos necessários no Apache:

a2enmod headers proxy proxy_http rewrite
systemctl restart apache2

1. MySQL compartilhado

Crie /opt/mysql/docker-compose.yml:

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-shared
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password_forte_aqui
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - "127.0.0.1:3306:3306"
    networks:
      - shared-network

networks:
  shared-network:
    name: shared-network
    driver: bridge

Inicie o MySQL:

cd /opt/mysql
docker compose up -d

Crie os bancos de dados para cada site:

docker exec -it mysql-shared mysql -uroot -p

Dentro do MySQL:

CREATE DATABASE site1_wp;
CREATE DATABASE site2_wp;
CREATE DATABASE site3_wp;

CREATE USER 'site1_user'@'%' IDENTIFIED BY 'senha_site1';
CREATE USER 'site2_user'@'%' IDENTIFIED BY 'senha_site2';
CREATE USER 'site3_user'@'%' IDENTIFIED BY 'senha_site3';

GRANT ALL PRIVILEGES ON site1_wp.* TO 'site1_user'@'%';
GRANT ALL PRIVILEGES ON site2_wp.* TO 'site2_user'@'%';
GRANT ALL PRIVILEGES ON site3_wp.* TO 'site3_user'@'%';

FLUSH PRIVILEGES;
EXIT;

2. WordPress Site 1

Crie /opt/wordpress/site1/docker-compose.yml:

services:
  wordpress:
    image: wordpress:latest
    container_name: wp-site1
    restart: always
    ports:
      - "127.0.0.1:8081:80"
    environment:
      WORDPRESS_DB_HOST: mysql-shared:3306
      WORDPRESS_DB_NAME: site1_wp
      WORDPRESS_DB_USER: site1_user
      WORDPRESS_DB_PASSWORD: senha_site1
    volumes:
      - ./html:/var/www/html
    networks:
      - shared-network

networks:
  shared-network:
    external: true
cd /opt/wordpress/site1
docker compose up -d

3. WordPress Site 2

Crie /opt/wordpress/site2/docker-compose.yml:

services:
  wordpress:
    image: wordpress:latest
    container_name: wp-site2
    restart: always
    ports:
      - "127.0.0.1:8082:80"
    environment:
      WORDPRESS_DB_HOST: mysql-shared:3306
      WORDPRESS_DB_NAME: site2_wp
      WORDPRESS_DB_USER: site2_user
      WORDPRESS_DB_PASSWORD: senha_site2
    volumes:
      - ./html:/var/www/html
    networks:
      - shared-network

networks:
  shared-network:
    external: true
cd /opt/wordpress/site2
docker compose up -d

4. Apache – VirtualHosts separados

Site 1: /etc/apache2/sites-available/site1.conf

<VirtualHost *:80>
    ServerName site1.com.br
    ServerAlias www.site1.com.br

    ProxyPreserveHost On
    ProxyRequests Off

    ProxyPass        / http://127.0.0.1:8081/
    ProxyPassReverse / http://127.0.0.1:8081/

    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-Host  "%{HTTP_HOST}e"

    ErrorLog  ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>

Site 2: /etc/apache2/sites-available/site2.conf

<VirtualHost *:80>
    ServerName site2.com.br
    ServerAlias www.site2.com.br

    ProxyPreserveHost On
    ProxyRequests Off

    ProxyPass        / http://127.0.0.1:8082/
    ProxyPassReverse / http://127.0.0.1:8082/

    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-Host  "%{HTTP_HOST}e"

    ErrorLog  ${APACHE_LOG_DIR}/site2_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>

Ative os sites:

a2ensite site1.conf
a2ensite site2.conf
apache2ctl configtest
systemctl reload apache2

5. SSL para múltiplos sites

certbot --apache -d site1.com.br -d www.site1.com.br
certbot --apache -d site2.com.br -d www.site2.com.br

O Certbot ajusta o VirtualHost automaticamente e adiciona o redirect HTTP→HTTPS.

Depois, atualize o RequestHeader para HTTPS:

RequestHeader set X-Forwarded-Proto "https"

6. Corrigir URLs do WordPress atrás de proxy

No wp-config.php (dentro de ./html/) adicione antes de /* That's all */:

define('WP_HOME',    'https://seudominio.com.br');
define('WP_SITEURL', 'https://seudominio.com.br');

// Necessário para que o WordPress reconheça o proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

7. Verificação rápida

# Containers rodando?
docker compose ps

# Porta 8080 escutando só no localhost?
ss -tlnp | grep 8080

# Apache do host OK?
systemctl status apache2
curl -I http://seudominio.com.br

Comandos úteis

# Ver todos os sites rodando
docker ps

# Logs de um site específico
docker logs wp-site1

# Parar/iniciar um site
cd /opt/wordpress/site1
docker compose down
docker compose up -d

# Backup do MySQL (todos os bancos)
docker exec mysql-shared mysqldump -uroot -p --all-databases > backup-$(date +%F).sql

A edição dos parâmetros do PHP pode ser feita no arquivo .htaccess. Exemplo:

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value memory_limit 128M
php_value max_execution_time 300
php_value max_input_time 300

Criar partição SWAP no Ubuntu Server 24.04

Vamos usar a forma mais comum e prática usando um arquivo swap:

Criar Swap usando arquivo

1. Verifique se já existe swap:

sudo swapon --show
free -h

2. Crie o arquivo swap (exemplo com 2GB):

sudo fallocate -l 2G /swapfile

3. Defina as permissões corretas:

sudo chmod 600 /swapfile

4. Configure como área de swap:

sudo mkswap /swapfile

5. Ative o swap:

sudo swapon /swapfile

6. Verifique se está ativo:

sudo swapon --show
free -h

7. Torne permanente (sobrevive a reinicializações):

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Ajustes opcionais de desempenho

Configurar swappiness (controla quando usar swap):

# Ver valor atual
cat /proc/sys/vm/swappiness

# Definir para 10 (usa swap menos agressivamente)
sudo sysctl vm.swappiness=10

# Tornar permanente
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

Tamanho recomendado de swap:

  • RAM ≤ 2GB: 2x o tamanho da RAM
  • RAM 2-8GB: igual ao tamanho da RAM
  • RAM > 8GB: pelo menos 4GB (ou mais se usar hibernação)

Configurar o nome do servidor e prepará-lo para receber um domínio

Usando o Ubuntu Server 24.04 como exemplo, vamos seguir os seguintes passos:

Primeiro, defina um nome apropriado para o servidor:

# Definir o hostname (exemplo: servidor01 ou o nome que preferir)
sudo hostnamectl set-hostname seu-nome-servidor

# Verificar se foi aplicado
hostnamectl

Depois, edite o arquivo /etc/hosts:

sudo nano /etc/hosts

Adicione uma linha como:

127.0.1.1    seu-nome-servidor.seudominio.com.br    seu-nome-servidor

Oracle Cloud Free Tier

A Oracle oferece uma faixa gratuita de máquinas virtuais com recursos limitados que podem ajudar muito para pequenos projetos ou serviços temporários de avaliação.

https://www.oracle.com/cloud

Basta fazer um cadastro com fornecimento de um cartão de crédito (caso você ultrapasse a faixa gratuita, será debitado) para ter acesso ao painel de configuração.

Em Compute -> Instances podemos criar as máquinas virtuais. Atente para o selo “Always Free” ao lado de cada opção que fizer.

Juntamente com as instâncias, as redes (net e sub-net) são criadas.

Podemos escolher uma imagem de SO e uma plataforma de hardware. Essa combinação pode ou não ser gratuita de acordo com os recursos selecionados.

Nas configuração da rede criada, as configurações de portas do firewall deverão ser habilitadas bem como dentro do SO instalado.

Lembrando que a imagem Ubuntu fornecida é modificada pela Oracle e precisa da configuração do iptables para abrir portas. Exemplo:

sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save

Migrando um site WordPress

Existem várias formas de migrar um site em WordPress entre servidores diferentes.

Aqui seguem alguns passos sobre uma forma de executar esse processo.

  1. Certifique-se de que o sistema de recuperação de senha está funcionando no site origem. Após a migração a conta do administrador pode sofrer alteração de senha e você pode ficar com dificuldade em logar novamente no servidor destino.
  2. Instalar o plugin UpdraftPlus WordPress Backup na origem. Esse plugin também poderá ser usado para backup com armazenamento nos serviços de nuvem.
  3. Faça um backup dentro desse plugin em Backup/Restauração.
  4. Em Backups Existentes, baixe o arquivo de cada recurso para sua máquina local (Banco de dados, Plugins, Temas, etc).
  5. No servidor destino, crie um site padrão WordPress que vai receber o backup. Atenção para o detalhe da senha do administrador que será alterada após a restauração do backup para o valor usado no site de origem.
  6. Altere o registro DNS para apontar para o IP do servidor destino.
  7. Ative a versão ssl do site com o comando:
    certbot –apache –redirect -d site.com -m user@mail.com –agree-tos
  8. Acesse o site destino e instale o plugin UpdraftPlus WordPress Backup.
  9. Enviar os arquivos de backup para o servidor e executar a restauração.
  10. Deletar as pasta antigas (delete old folders).
  11. Verifique se os links estão funcionando. Caso necessário, altere os links permanentes para o formato padrão.

GIT – Push to Production

Uma das formas de publicar um branch local para um servidor de produção é usar o recurso de hooks nativo do git.

Vamos aqui listar os passos para configurar esse recurso e conseguir enviar as alteração para o servidor usando apenas um único comando na máquina local.

No lado de produção vamos acessar o servidor e criar uma pasta para abrigar os arquivos do projeto. Eu prefiro utilizar o nome do branch que está associado ao ambiente de produção (nesse caso será o main) mas você pode usar qualquer nome, inclusivo o nome do seu projeto.

ssh user@server
mkdir pasta-do-branch

Em seguida, vamos criar um ambiente git vazio para abrigar os comando de hook necessários.

git init --bare ~/projeto.git

Na pasta hooks desse ambiente criado (entre na pasta nome-do-projeto.git) vamos criar o arquivo post-receive e inserir o código nele por esse abaixo.

#!/bin/bash
TARGET="/pasta-do-branch"
GIT_DIR="/projeto.git"
BRANCH="main"

while read oldrev newrev ref
do
  if [ "$ref" = "refs/heads/$BRANCH" ];
  then
    echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
    git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
  fi
done

Esse arquivo, post-receive, deve ser marcado como executável.

chmod +x post-receive

Na máquina local vamos adicionar o branch remoto.

git remote add branch user@server:/path/project.git

Dessa forma, de agora em diante, para publicar o código do branch basta executar o comando abaixo.

git push projeto main

Para se aprofundar nos detalhes desse recurso, consulte a página desse link:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

Docker MySQL 5.7 Crash de Memória

Essa imagem específica do MySQL (tag 5.7) pode fechar inesperadamente após a inicialização caso, por exemplo, ocorra uma alteração no tamanho da memória ou swap do host.

Para resolver essa questão, o exemplo abaixo indica o caminho.

docker run -e MYSQL_ROOT_PASSWORD=password \
  --name mysql57 --ulimit nofile=262144:262144 \
  -d -p 3306:3306 -v mysql57-volume:/var/lib/mysql \
  mysql:5.7 --sql-mode=""

Descobrindo um arquivo de configuração de um serviço no MacOS

Para descobrir, por exemplo, onde o arquivo de configuração usado pelo MySQL está armazenado, em um terminal digite:

mysql --verbose --help | grep my.cnf

Em outro terminal, reinicie o serviço:

brew services restart mysql@5.7

Retorne ao primeiro terminal e observe o output com os dados usados pelo serviço.

* Essa dica provavelmente funciona em sistemas *nix trocando o comando de restart do serviço pelo específico da plataforma.