7 pontos por GN⁺ 2024-08-27 | Ainda não há comentários. | Compartilhar no WhatsApp
  • Dokku é uma PaaS open source que permite usar um único VPS como se fosse o Heroku, sendo ideal para uso pessoal e equipes pequenas que querem implantar vários apps de forma barata em infraestrutura própria
  • Workloads sem GPU estão rodando em um VPS da OVHcloud de US$ 7/mês, o que reduz custo e complexidade de deploy em ambientes como consultoria de LLM, onde é comum publicar apps com frequência
  • Apps baseados em Dockerfile podem ser implantados apenas criando o app no Dokku, adicionando um Git remote e executando git push dokku main; a quantidade de processos pode ser ajustada com dokku ps:scale
  • Até sites estáticos podem combinar _site, .static, o buildpack do nginx e dokku-http-auth para permitir deploy a partir de repositórios privados no GitHub com proteção por senha
  • Conectando GitHub Actions, comandos remotos via SSH, invalidação do cache do Docker e rebuild sem push, é possível transformar uma PaaS pessoal em um ambiente operacional reproduzível

Dokku: usando um único VPS como se fosse o Heroku

  • Dokku é uma PaaS open source que roda em um único servidor escolhido pelo usuário
  • Ela oferece uma experiência de deploy parecida com a do Heroku, mas com a infraestrutura pertencendo ao próprio usuário
  • Como o custo do Heroku pode ficar alto, uma plataforma de deploy com boa relação custo-benefício é importante em trabalhos de consultoria com LLM que exigem publicar vários aplicativos
  • O servidor Dokku está rodando em um VPS da OVHcloud de US$ 7/mês para workloads sem GPU

Experiência de deploy no estilo Heroku e recursos operacionais

  • O Dokku oferece um fluxo de deploy fácil de usar, no estilo Heroku
  • Suporta gerenciamento automático de certificados SSL com Let’s Encrypt
  • É possível proteger sites com senha usando Basic Auth
  • Dá para fazer scale up/down com um único comando
  • Lida com vários tipos de app, como Node e Python, e também permite definir containers Docker manualmente quando necessário
  • Há muitos plugins oficiais, o que permite estender praticamente qualquer funcionalidade necessária
  • O deploy pode ser feito apenas com comandos Git

Implantando apps com containers Docker

  • Depois de instalar o Dokku no VPS, basta colocar um Dockerfile na raiz do repositório do app para fazer o deploy com um container Docker
  • O Dockerfile de exemplo usa a imagem python:3.10, copia o código para /app e depois executa pip install .
  • O entrypoint.sh é usado para facilitar a execução do app localmente ou dentro do container Docker
    • No exemplo, ele executa um app FastAPI com uvicorn main:app --port "$PORT" --host 0.0.0.0
  • Primeiro, o app é criado no host Dokku
dokku apps:create myapp
  • No ambiente local, as informações de acesso ao host Dokku são configuradas em ~/.ssh/config, definindo o nome desse host como dokku
  • Depois, basta adicionar o Dokku como remote no repositório Git local e fazer push para implantar
git remote add dokku dokku@dokku:myapp
git push dokku main
  • Após o deploy, a URL do app é exibida nos logs locais, e o padrão é algo como myapp.yourdomain.com
  • A quantidade de workers pode ser ajustada com o comando abaixo
dokku ps:scale myapp web=2

Sites estáticos privados e Basic Auth

  • O GitHub Pages é inconveniente para publicar sites estáticos privados com facilidade, porque exige uma conta Enterprise cara
  • Com o Dokku, é possível implantar um site estático a partir de um repositório privado no GitHub e protegê-lo com senha
  • Assume-se que o site estático esteja na pasta _site do repositório Git
  • No host Dokku, crie o app e defina a variável de ambiente NGINX_ROOT como _site
dokku apps:create mysite
dokku config:set static-site NGINX_ROOT=_site
sudo dokku plugin:install https://github.com/dokku/dokku-http-auth.git
sudo chmod +x /home/dokku
  • Na raiz do repositório Git que contém o site estático, execute o seguinte
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
  • .static informa ao Dokku que se trata de um site estático
  • BUILDPACK_URL define que o buildpack do nginx deve ser usado
    • Normalmente ele é detectado automaticamente, mas em projetos que misturam código e site estático, explicitar o buildpack do nginx ajuda a evitar confusão
  • O deploy é feito com git push dokku main
  • A autenticação é ativada no host Dokku com o comando abaixo
dokku http-auth:enable mysite <username> <password>
  • É possível adicionar vários pares de usuário/senha e também filtrar IPs específicos
  • O HTTPS pode ser configurado com o plugin do Let’s Encrypt, que também oferece renovação automática
  • Se o HTTPS for tratado por um proxy da Cloudflare, pode-se usar uma configuração que delega isso à Cloudflare em vez de usar o plugin do Let’s Encrypt

Deploy automático com GitHub Actions

  • Apps do Dokku podem ser implantados automaticamente com GitHub Actions
  • Assim, não é preciso repetir manualmente o processo de dar push direto para o host Dokku
  • O workflow de exemplo roda em workflow_dispatch e também em pushes para a branch main
  • A configuração de concurrency cancela jobs anteriores para evitar o deploy lock do Dokku
  • O workflow faz checkout do código, cria a chave SSH privada a partir de secrets.DOKKU_SSH_PRIVATE_KEY, adiciona o Git remote e faz push forçado para o Dokku
name: CI
on:
  workflow_dispatch:
  push:
    branches: [main]

concurrency:
  group: ${{ github.ref }}
  cancel-in-progress: true

jobs:
  deploy-dokku:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Install SSH key
        run: |
          echo "${{ secrets.DOKKU_SSH_PRIVATE_KEY }}" > private_key.pem
          chmod 600 private_key.pem

      - name: Add remote and push
        run: |
          git remote add dokku dokku@rechat.co:llm-eval
          GIT_SSH_COMMAND="ssh -i private_key.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push dokku main -f

Comandos remotos de operação e rebuild

  • O nome do app no exemplo é llm-eval, e o host é rechat.co
  • Mesmo sem fazer login via SSH diretamente no host Dokku, é possível executar comandos remotos com o usuário dokku
ssh dokku@rechat.co apps:list
  • É possível invalidar o cache do Docker para forçar um novo build
ssh dokku@rechat.co repo:purge-cache llm-eval
  • Quando for necessário fazer rebuild sem push, há várias formas, e uma delas é o comando abaixo
ssh dokku@rechat.co ps:rebuild llm-eval

Material de referência pessoal para deploys repetidos

  • Isso foi organizado porque, a cada novo app implantado, era preciso procurar novamente os mesmos detalhes
  • Fica como material de referência reutilizável para montar repetidamente uma plataforma pessoal de deploy com Dokku

Ainda não há comentários.

Ainda não há comentários.