Blog

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

Utilitários Open Source no macOS

Segue minha lista de aplicativos utilitários essenciais no macOS.

AltTab

Alterne entre aplicativos abertos com uma experiência próxima à do Windows.

Rectangle

Coloque as janelas dos aplicativos em áreas específicas do seu display com atalhos de teclado.

App Eraser

Exclua arquivos que poderiam ficar sobrando ao se desinstalar um aplicativo.

Easy Move+Resize

Mova ou redimensione janela de aplicativo clicando em qualquer lugar da mesma junto com uma combinação de teclas para ativar a função.

Keka

Compactador/Descompactador mais completo e com capacidade de integração ao Finder.

Maccy

Histórico da área de transferência.

Hidden Bar

Esconda ícones de aplicativos em segundo plano da barra superior.

CotEditor

Editor de texto com recursos avançados.

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.

Configurando Apache/PHP no Scoop para CodeIgniter

O Scoop é um sistema de gerenciamento de pacotes para Windows similar ao APT para Linux e BREW para MacOS onde a manutenção do processo de instalação/remoção de aplicativos é feito diretamente no prompt de comando com poucos ou apenas um único comando.

CodeIgniter é um framework PHP para desenvolvimento de aplicativos WEB.

Com o scoop é possível instalar o Apache Web Server junto com uma versão específica do PHP para configurar um ambiente de desenvolvimento.

A instalação do Scoop pode ser feita seguindo essa documentação: https://scoop-docs.vercel.app/

Importante habilitar os buckets php, extras e versions no scoop:

  • scoop bucket add extras
  • scoop bucket add php
  • scoop bucket add versions

Após a instalação os seguintes comandos são utilizados para instalar Apache/PHP:

  • scoop install apache php7.4
  • scoop install sudo
  • iex (new-object net.webclient).downloadstring('https://gist.githubusercontent.com/nilkesede/c98a275b80b6d373131df82eaba96c63/raw/apache-php-init.ps1')
  • sudo httpd -k install -n Apache2.4
  • sudo net start apache

A configuração do PHP através do arquivo php.ini deve ser feita dentro da pasta persist\php7.4 do scoop para que as modificações permaneçam inalteradas após atualizações do PHP.

Por padrão, o apache não  configurou o caminho do php.ini para a pasta persist, então, troque a linha

PHPIniDir "D:\Aplicativos\Scoop\apps\php7.4\current"

por

PHPIniDir "D:\Aplicativos\Scoop\persist\php7.4"

no httpd.conf de acordo com o caminho na sua máquina.

Dicas:

  1. é necessário reiniciar o Windows para receber as alterações  feitas no PATH do sistema durante o processo
  2. qualquer alteração em  httpd.conf ou php.ini, o serviço do apache deve ser reiniciado
  3. para ver algum erro de configuração no php, use o phpinfo e também o comando php -v no prompt
  4. inclua o caminho do php corrente no path do sistema (necessário para a carga das extensões). ex: D:\Aplicativos\Scoop\apps\php7.4\current
  5. carregue a extensão intl (necessária para o CodeIgniter)

Apache

Em httpd.conf da pasta persist, habilite o módulo rewrite e remove o comentário da linha

Include conf/extra/httpd-vhosts.conf

para habilitar a leitura dos hosts virtuais em httpd-hosts.conf da pasta persist.

Adicionar a linha abaixo no http.conf dentro de <IfModule dir_module>

 DirectoryIndex index.php

Exemplo de vhost para um projeto:

<VirtualHost *:80>
ServerAdmin rdconsolo@gmail.com

ErrorLog "D:\Projetos\logs\error_log"
CustomLog "D:\Projetos\logs\access_log" common

Alias "/project-root" "D:\Projetos\project-root\public"
<Directory "D:\Projetos\project-root">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted

RewriteEngine On
RewriteBase /project-root/index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>
</VirtualHost>

Scoop Installer

O Scoop Installer é um gerenciador de aplicativos para Windows nos moldes de um apt do Linux ou um brew do MacOS.

Esses gerenciadores permitem instalar, remover e atualizar aplicativos do sistema operacional pelo prompt de comando. Isso pode parecer “defasado” mas na verdade os benefícios sobre os instaladores tradicionais em modo gráfico são superiores como, por exemplo:

  • instalação sem passos
  • escolha de uma versão específica do aplicativo
  • velocidade de resposta
  • administração centralizada

Para saber como instalar e usar esse aplicativo, veja os docs em https://scoop-docs.vercel.app/docs

Alguns comando úteis:

  • scoop update
  • scoop update –all
  • scoop search <aplicativo>
  • scoop install <aplicativo>
  • scoop install <aplicativo>@<versão>
  • scoop list
  • scoop status
  • scoop bucket add <bucket>
  • scoop uninstall <aplicativo>

Buckets úteis:

  • extras
  • versions
  • php
  • nerd-fonts

O Scoop não remove automaticamente as versões anteriores dos aplicativos atualizados. Para fazer isso, execute o comando “scoop cleanup *”.

Para trocar a versão de um pacote quando mantiver mais de uma instalada, use o comando scoop reset <app>@<version>.

Prevenindo o kernel de atualizar no Ubuntu 20.04

Atualizações de kernel são bem-vindas por trazerem correções, melhorias e maior segurança mas, dependendo do hardware podem ocorrer incompatibilidades causando consequências indesejáveis.

Para manter uma versão de kernel que comprovadamente funciona no seu hardware, é possível travar o sistema de atualização para determinado pacote:

sudo apt-mark hold <linux-image>

Onde linux-image é o nome completo da imagem a ser mantida.

Para desmarcar e permitir a atualização, trocamos o comando para:

sudo apt-mark unhold <linux-image>

Para saber quais pacotes estão marcados um hold:

sudo apt-mark showhold

Permissões para pastas e arquivos do WordPress

Após uma instalação manual do WordPress onde baixamos o pacote e criamos um banco de dados vazio para o instalador gerar os dados, os comandos abaixo deixarão os direitos de acesso às pastas e arquivos da melhor forma possível considerando funcionalidade e segurança.

chown -R www-data:www-data .
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
mv wp-config-sample.php wp-config.php
chmod 640 wp-config.php

Após esses comandos podemos prosseguir com a instalação do WordPress alterando os dados de acesso ao banco de dados no arquivo wp-config.php.

Let`s Encrypt no Ubuntu 20.04 com Apache

Com o domínio registrado no DNS e configurado no Apache na porta 80, segue:

apt install certbot python3-certbot-apache
certbot --apache -d your_domain -d www.your_domain

Responda as perguntas do script com atenção!

Particularmente, prefiro deixar o redirecionamento automático de http para https.

Os certificados deverão ser salvos dentro da pasta /etc/letsencrypt/live/ automaticamente.

O script criará um novo vhost para o domínio dentro do apache se você respondeu para redirecionar para https.

Esse script também gera um cron job em /etc/cron.d para renovar o certificado automaticamente e pode ser testado com o comando abaixo:

certbot renew --dry-run