Skip to content

Instantly share code, notes, and snippets.

@luizomf
Last active May 8, 2026 18:40
Show Gist options
  • Select an option

  • Save luizomf/502c3d6a6ae8548273aa6cc02411d78c to your computer and use it in GitHub Desktop.

Select an option

Save luizomf/502c3d6a6ae8548273aa6cc02411d78c to your computer and use it in GitHub Desktop.
VPS Hostinger Para PaperClip

Configuração do Paperclip no KVM 2 Hostinger

Objetivo

Documentar, em ordem, todo o processo de configuração do VPS para rodar o Paperclip.

Ambiente

  • Provedor: Hostinger
  • Plano: KVM 2
  • Projeto: Paperclip

Passo a Passo

  1. Na página de gerenciamento do VPS, clicar em Terminal no canto superior direito.
  2. Isso abre o terminal do VPS no navegador.
  3. Atualizar a lista de pacotes e instalar as atualizações disponíveis do sistema.
  4. Criar o usuário luizotavio com diretório home e shell bash.
  5. Adicionar o usuário luizotavio ao grupo sudo.
  6. Adicionar o usuário luizotavio ao grupo docker.
  7. Definir a senha do usuário luizotavio.
  8. No computador local, gerar uma chave SSH ed25519 dedicada para esse acesso.
  9. Adicionar o host inprod.cloud ao arquivo known_hosts.
  10. Copiar a chave pública para o servidor usando o usuário luizotavio.
  11. Conectar ao VPS por SSH usando o usuário luizotavio.
  12. Definir o vim como editor padrão no servidor.
  13. Liberar sudo sem solicitar senha para o usuário luizotavio temporariamente.
  14. Instalar o nvm usando o script oficial do projeto.
  15. Carregar o nvm na sessão atual sem reiniciar o shell.
  16. Instalar o Node.js 24 usando nvm.
  17. Verificar a versão instalada do Node.js.
  18. Verificar a versão instalada do npm.
  19. Instalar globalmente os CLIs de IA que serão usados no servidor.
  20. Instalar o Claude Code usando o script oficial.
  21. Escolher a IA que será usada no servidor.
  22. Para essa escolha, evitar modelos mini, spark, flash e haiku.
  23. Usar um modelo mais parrudo para essa etapa.
  24. A IA escolhida para essa etapa foi o Codex/OpenAI.
  25. Abrir o Codex CLI para iniciar a autenticação.
  26. Na tela de login do Codex, escolher a forma de autenticação.
  27. Após autenticar no Codex, pedir para ele aplicar o hardening do VPS usando como base o DEV_GUIDE.md do repositório vps_deploy_template.
  28. Permitir o uso de sudo diretamente e solicitar um relatório final do que foi feito.
  29. Autenticar o GitHub CLI no servidor com a conta que controlará o repositório.
  30. Expandir os escopos do gh para permitir operações amplas de automação.
  31. Configurar o git para usar o GitHub CLI como credential helper.
  32. Verificar o estado final da autenticação com gh auth status.

Comandos Executados

No VPS

apt update && apt upgrade -y
useradd -m -s /bin/bash luizotavio
usermod -aG sudo luizotavio
usermod -aG docker luizotavio
passwd luizotavio

No computador local

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_hostinger -C "luizotavio"
ssh-keyscan inprod.cloud >> ~/.ssh/known_hosts
ssh-copy-id -i ~/.ssh/id_hostinger.pub luizotavio@inprod.cloud
ssh luizotavio@inprod.cloud

No VPS após login com luizotavio

# VIM Padrão
sudo update-alternatives --set editor /usr/bin/vim.basic

# Sudoers para permitir que o modelo faça hardening do VPS (Lembre-se de remover depois)
echo "luizotavio ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/luizotavio

# NVM + NodeJS
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
\. "$HOME/.nvm/nvm.sh"
nvm install 24
node -v
npm -v

# Gemini, Codex e Pi
npm install -g @google/gemini-cli @openai/codex @mariozechner/pi-coding-agent @anthropic-ai/claude-code
# Claude
# curl -fsSL https://claude.ai/install.sh | bash

# Faça login no CLI que for usar, vou usar o codex para este comando
echo "Use the link provided as a base to apply the VPS hardening. https://raw.githubusercontent.com/luizomf/vps_deploy_template/refs/heads/main/DEV_GUIDE.md. You can use sudo directly. Report-me what you did." | codex -c model_reasoning_effort=xhigh -m gpt-5.4 --yolo exec

# Isso é para o container, criei uma conta no GH especificamente para os agentes
gh auth login --web --git-protocol https
gh auth refresh --scopes workflow,project,delete_repo,admin:public_key,admin:org,admin:org_hook
gh auth setup-git
gh auth status

Escopos usados no gh

Escrito por Codex GPT 5.4 xhigh

O fluxo acima parte do login padrão do GitHub CLI e depois adiciona escopos extras para ampliar o controle disponível no servidor:

  • workflow
  • project
  • delete_repo
  • admin:public_key
  • admin:org
  • admin:org_hook

Os escopos mínimos (repo, read:org e gist) já fazem parte do fluxo padrão do gh.

Script de Bootstrap Consolidado

Do container do paperclip (da Hostinger).

#!/usr/bin/env bash

set -euo pipefail

export DEBIAN_FRONTEND="${DEBIAN_FRONTEND:-noninteractive}"
RUN_APT_UPGRADE="${RUN_APT_UPGRADE:-0}"

log() {
  printf '\n==> %s\n' "$*"
}

have() {
  command -v "$1" >/dev/null 2>&1
}

APT_PACKAGES=(
  sudo
  gh
  ca-certificates
  locales
  tzdata
  bash
  zsh
  openssl
  curl
  wget
  git
  openssh-client
  openssh-server
  file
  less
  bubblewrap
  procps
  build-essential
  vim
  make
  pkg-config
  pkgconf
  llvm
  cmake
  ninja-build
  autoconf
  automake
  libtool
  libtool-bin
  gettext
  zlib1g-dev
  libbz2-dev
  liblzma-dev
  lzma
  libreadline-dev
  libssl-dev
  libffi-dev
  libgdbm-dev
  ncurses-term
  python3
  python3-dev
  python3-venv
  pipx
  libsqlite3-dev
  sqlite3
  nano
  bat
  ripgrep
  fd-find
  jq
  watch
  htop
  tree
  inotify-tools
  p7zip
  unzip
  ffmpeg
  iputils-ping
  dnsutils
  traceroute
  iproute2
  net-tools
  aria2
  shellcheck
)

log "Updating apt indexes"
sudo apt-get update

if [[ "$RUN_APT_UPGRADE" == "1" ]]; then
  log "Upgrading system packages (RUN_APT_UPGRADE=1)"
  sudo apt-get upgrade -y
else
  log "Skipping full apt upgrade (set RUN_APT_UPGRADE=1 to enable)"
fi

log "Installing apt packages"
sudo apt-get install -y "${APT_PACKAGES[@]}"

log "Installing/updating global npm CLIs"
sudo npm install -g @mariozechner/pi-coding-agent @google/gemini-cli @openai/codex

if ! have hermes; then
  log "Installing Hermes"
  curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash -s -- --skip-setup
else
  log "Hermes already installed"
fi

if ! have claude; then
  log "Installing Claude CLI"
  curl -fsSL https://claude.ai/install.sh | bash
else
  log "Claude CLI already installed"
fi

log "Configuring git globals"
git config --global user.name "Otávio Miranda"
git config --global user.email "otaviomirandabr19@gmail.com"
git config --global init.defaultBranch main
git config --global core.autocrlf input
git config --global core.eol lf

log "Bootstrap complete"

# ADICIONAR AO EDITOR DO compose.yaml na Hostinger
# PATH: "/paperclip/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

O que este script cobre

  • Atualização do índice do apt.
  • apt upgrade opcional com RUN_APT_UPGRADE=1.
  • Instalação do conjunto base de pacotes do sistema.
  • Instalação ou atualização global dos CLIs pi-coding-agent, gemini-cli e codex.
  • Instalação condicional do Hermes e do Claude CLI.
  • Configuração global inicial do Git.

O que continua manual fora do script

  • Criação do usuário luizotavio.
  • Inclusão do usuário nos grupos sudo e docker.
  • Configuração de senha e acesso SSH.
  • Liberação temporária de sudo sem senha.
  • Instalação do nvm e do Node.js 24.
  • Autenticação no Codex CLI.
  • Autenticação do GitHub CLI no servidor e expansão dos escopos.
  • Execução do hardening baseado no DEV_GUIDE.md.

Observações

  • A liberação de sudo sem senha para luizotavio foi marcada como temporária.
  • O nvm foi usado para instalar o Node.js.
  • Na etapa de escolha da IA, a orientação foi evitar modelos mini, spark, flash e haiku, priorizando um modelo mais forte.
  • A IA escolhida foi o Codex/OpenAI.
  • Para executar o hardening do VPS com o Codex, foi usado o modelo gpt-5.4 com model_reasoning_effort=xhigh.

Prompt Sugerido para IA instalar o RTK no container

Instale e configure o RTK neste servidor.

Referência:
https://github.com/rtk-ai/rtk

Objetivo:
- instalar o binário do RTK
- deixá-lo acessível no PATH
- executar o init do RTK para todos os ambientes compatíveis disponíveis aqui
- tornar obrigatório o uso de `rtk` como prefixo de comandos shell nos `AGENTS.md` dos agentes do Paperclip, incluindo o seu

Contexto:
- você está rodando em Pi
- também podem existir no container: `codex`, `gemini`, `claude` e `hermes`
- o RTK reduz trechos desnecessários da saída dos comandos para economizar tokens

Faça:
1. Verifique se o RTK já está instalado; se não estiver, instale.
2. Confirme com `which rtk` e `rtk --version`.
3. Detecte quais destes ambientes são compatíveis com RTK: Pi, Codex CLI, Gemini CLI, Claude CLI e Hermes.
4. Execute o init/configuração do RTK em todos os ambientes compatíveis.
5. Não invente integração. Se algum ambiente não for compatível, documente claramente no relatório final.
6. Atualize os `AGENTS.md` relevantes para impor a regra rígida:
   `Sempre prefixe comandos shell com rtk, exceto quando houver incompatibilidade técnica explícita.`
7. Inclua essa mesma regra no seu próprio `AGENTS.md`.
8. Valide a configuração com testes mínimos e não destrutivos.

Entregue no final:
- funcionou?
- onde o RTK foi instalado
- quais ambientes foram configurados
- quais ambientes não puderam ser configurados
- quais arquivos `AGENTS.md` foram alterados
- como validar depois que tudo continua funcionando
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment