Corujo.com.br

Eu Que Fiz (Quase)

Um guia rápido e alto nível de como eu configurei esse blog/site/whatever

Básico - as ferramentas

Estou usando a plataforma Hugo, um gerador de site estático - não é um CMS, como o Wordpress ou coisa do tipo - e que portanto precisa só de uma hospedagem básica, não precisa nem de um banco de dados ou outro tipo de infra.

Para escrever os posts e editar os arquivos de configuração eu uso o vscode na minha máquina. Os posts em si, no Hugo, são escritos no formato Markdown, então você tem tudo salvo em arquivos de texto e poderia ser editado até mesmo no notepad. Ah, depois de escrever ou configurar eu posso gerar/compilar tudo local e só publicar o resultado no servidor remoto.

Intermediário - informações técnicas

Claro que, como bom nerd, não fiz isso.

Tenho um VPS na Linode, na instância “Nanode” (menor e mais barata), e configurei um nginx como servidor e apontei meu domínio por lá, além de ter confiurado o certificado da Let’s Encrypt utilizando o Certbot.

Além disso, tenho um repositório no github no qual eu publico o meu projeto Hugo do site, e através do Github Actions faço a compilação e depois, via rsync, publico diretamente no diretório do meu vps de onde o ngnix serve o site.

Se você não sabe do que se tratam essas palavras, não se preocupe, tudo que precisa saber é que é só jogar em uma pasta da hospedagem. Por outro lado, se você sabe, não tem nenhum segredo por aqui, fiz só o mínimo necessário.

Avançado - os detalhes divertidos da publicação (Continuous deploy?)

O Hugo não tem nenhum segredo, basta um comando pra gerar a pasta “public” com os arquivos devidamente organizados, sass compilado, tema aplicado, etc.

Mas no mundinho Github Actions, tem que ficar fazendo checkout, configurar env, e por aí vai. Por sorte encontrei alguém que já tinha o caminho das pedras.

Eu basicamente copiei a action dele, configurei pra rodar no push pra main do meu repositório e… apanhei do trecho do rsync e chave ssh. Meu problema foi usar uma chave com passphrase, o que dificultou um pouco o processo.

Felizmente, depois de apanhar por umas 2h, descobri uma action que já lida com tudo isso, e bastou configurar os apontamenos, chave e passphrase nos secrets do Github Actions e depois chamar a tal action. Tudo roda em questão de segundos e cabe no free tier do Actions sem medo.

O meu repositório está privado, mas como a action ficou sem nenhum valor hardcoded, vou deixar aqui uma cópia exata dela, se alguém precisar:

name: Publish Blog

on: 
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-22.04
   
    steps:
      # CHEKCOUT REPOSITORY
      - name: Git checkout
        uses: actions/checkout@v3
        with:
          submodules: 'true'

      # SETUP HUGO
      # Read environemnt variable for subsequent actions.
      # See: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable 
      - name: Read .env
        run: |
          . ./.env
          echo "HUGO_VERSION=${HUGO_VERSION}" >> $GITHUB_ENV                    

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '${{ env.HUGO_VERSION }}'
          extended: true

      - name: Cache Hugo
        uses: actions/cache@v3
        with:
          path: /tmp/hugo_cache
          key: ${{ runner.os }}-hugomod-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-hugomod-                        

      - name: Build Blog
        env:
          TZ: 'America/Sao_Paulo'
        run: hugo --minify

      - name: rsync deployments
        uses: burnett01/rsync-deployments@7.0.1
        with:
          switches: -avzr --delete
          path: ./public/
          remote_path: ${{ secrets.DEPLOY_PATH }}
          remote_host: ${{ secrets.DEPLOY_HOST_IP }}
          remote_user: ${{ secrets.DEPLOY_USER }}
          remote_key: ${{ secrets.DEPLOY_KEY }}
          remote_key_pass: ${{ secrets.DEPLOY_PASSPHRASE }}