Instala Claude Code na VPS, ativa Ubuntu Pro com hardening completo, cria o user ghost e carrega o contexto Master7 via CLAUDE.md. A partir daqui você conversa com a VPS — o Claude-ghost conduz tudo.
Esse módulo não existia na v2.4.x. Ele é a aplicação do princípio Apple Way ao tutorial: se a máquina pode rodar, a máquina roda. Você só executa o que exige humano de verdade (senha, 2FA, OAuth browser flow, decisões de arquitetura).
history é o teu NORTE. Todo comando que você ou o Claude rodar nessa VPS fica registrado em ~/.bash_history. No fim de cada sessão, rode history > ~/vps-master7/history-$(date +%F).log pra ter audit trail completo. É assim que no Módulo 09 (Dogfood Check) a gente prova que tudo foi executado — sem depender de memória.
Logado como root na sua VPS (módulo 01), roda essa sequência única:
apt update && apt upgrade -y apt install -y curl git jq ca-certificates unzip build-essential apt autoremove -y
Se aparecer tela azul perguntando sobre reiniciar serviços, escolhe Yes. Se pedir reboot no fim, guarda pra rodar junto com o reboot do Step 04.
curl baixa o instalador do Claude. git versiona configs. jq parseia JSON que o Claude retorna. ca-certificates valida HTTPS. build-essential compila binários nativos quando Claude precisar.
Ubuntu Pro é grátis pra uso pessoal até 5 máquinas. Não ativar é deixar dinheiro e segurança na mesa.
# 1. Criar conta grátis em https://ubuntu.com/pro/dashboard # Copia o token que aparece em "Free Personal Token" # 2. Atacha a VPS ao teu token pro attach SEU_TOKEN_AQUI # 3. Confere o que foi habilitado automaticamente pro status
Agora habilita o USG (Ubuntu Security Guide) e configura o unattended-upgrades pra que a VPS aplique patches de segurança sozinha todo dia, inclusive da ESM do Ubuntu Pro:
# Habilita USG (vem do Ubuntu Pro)
pro enable usg
# Instala e configura unattended-upgrades pra auto security patches
apt install -y unattended-upgrades apt-listchanges
dpkg-reconfigure -plow unattended-upgrades # escolhe "Yes"
# Garante que ESM também é auto-atualizado (ajuste crítico)
cat > /etc/apt/apt.conf.d/52unattended-upgrades-esm <<'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
EOF
# Testa em dry-run
unattended-upgrade --dry-run --debug 2>&1 | tail -20
# Confere status do timer
systemctl status apt-daily.timer apt-daily-upgrade.timer --no-pager
ghost + autorizar sua SSH keyAntes de instalar o Claude, a gente vira ghost. Motivo: Claude Code autentica no OAuth e a sessão fica vinculada ao user do SO. Se autenticar como root e depois migrar pra ghost, precisa refazer login. Zero retrabalho = já instala como ghost.
# Cria o user ghost (SEMPRE define senha forte 20+ chars — salva no 1Password) adduser ghost # Senha: usa 'openssl rand -base64 24' pra gerar, SALVA no vault # Nome completo: Ghost Lab7 Operator # Adiciona ao grupo sudo usermod -aG sudo ghost # Sudo sem senha (conveniencia Master7 — se preferir maximo lockdown, pula essa linha) echo "ghost ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/ghost chmod 440 /etc/sudoers.d/ghost # Copia a SSH key do root pro ghost mkdir -p /home/ghost/.ssh cp /root/.ssh/authorized_keys /home/ghost/.ssh/authorized_keys chown -R ghost:ghost /home/ghost/.ssh chmod 700 /home/ghost/.ssh chmod 600 /home/ghost/.ssh/authorized_keys
ssh ghost@master7.SEU_DOMINIO. Se entrou como ghost sem pedir senha, sucesso. Se falhar, NÃO feche a sessão root — arrume antes de seguir.
Daqui pra frente você opera só como ghost. O root foi só bootstrap. Ghost é o daily user da Master7 — e agora vai ser o user do Claude Code também.
No terminal SSH atual (onde você tá como root):
exit
Abre SSH novo, agora como ghost:
ssh ghost@master7.SEU_DOMINIO # ou: ssh ghost@IP_DA_VPS
Confirma que está logado como ghost:
whoami # deve retornar: ghost pwd # deve retornar: /home/ghost sudo -n true && echo "sudo OK" # deve retornar: sudo OK
CLAUDE.md direto do GitHubO Claude Code CLI lê automaticamente um arquivo CLAUDE.md no diretório atual (e nos pais) como contexto persistente. A gente vai aproveitar isso pra injetar o Prompt Mestre do VPS Master7 antes do Claude abrir. Quando ele acordar, já vai saber quem ele é.
github.com/ghost-lab7/vps-master7. Isso te dá acesso read-only ao PROMPT-MESTRE.md oficial sempre atualizado. Se não recebeu o convite, manda e-mail pra contato@ghostlab7.com.br com o usuário GitHub.
Caminho A — via gh CLI (RECOMENDADO). O GitHub CLI autentica via device flow no browser, instala limpo, e é útil pros próximos módulos também:
# 1. Cria a pasta do projeto mkdir -p ~/vps-master7 && cd ~/vps-master7 # 2. Instala gh CLI (fonte oficial GitHub) curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \ | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \ | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null sudo apt update && sudo apt install -y gh # 3. Autentica (device flow — abre código no browser) gh auth login # Escolhe: GitHub.com → HTTPS → Y → Login with a web browser # Copia o código que aparece → cola em https://github.com/login/device # Autoriza com a conta que comprou o curso
# 4. Baixa o PROMPT-MESTRE.md como CLAUDE.md cd ~/vps-master7 gh api repos/ghost-lab7/vps-master7/contents/PROMPT-MESTRE.md \ -H "Accept: application/vnd.github.v3.raw" > CLAUDE.md # 5. Valida (deve mostrar frontmatter YAML e ~195 linhas) head -5 CLAUDE.md wc -l CLAUDE.md
Output esperado: primeira linha --- (frontmatter YAML), contagem ~195 linhas, tamanho ~10KB.
# 6. CRÍTICO — promove o CLAUDE.md pra contexto GLOBAL do ghost # Isso faz o Claude carregar o Prompt Mestre de QUALQUER pasta mkdir -p ~/.claude cp ~/vps-master7/CLAUDE.md ~/.claude/CLAUDE.md ls -la ~/.claude/CLAUDE.md
~/.claude/CLAUDE.md é CRUCIAL. O Claude Code CLI lê contexto em 2 níveis: project-level (./CLAUDE.md ou qualquer pai) e user-global (~/.claude/CLAUDE.md). No dia a dia você loga na VPS via SSH, cai em /home/ghost, digita claude direto — sem cd pra nenhuma pasta de projeto. Se o CLAUDE.md só existe em ~/vps-master7/, o Claude abre SEM contexto Master7. Ao copiar pro ~/.claude/, ele passa a carregar em qualquer cwd. Isso é o "Claude-ghost AI-nativo" de verdade — Master7 real.
gh CLI der erro ou você preferir manual:
CLAUDE.md no Mac (⌘+S)/home/ghost/vps-master7/) OU via CLI: scp CLAUDE.md vps01-hostinger-ops7-ghost:~/vps-master7/~/.claude/CLAUDE.md) igual o caminho ADois caminhos possíveis. Escolhe UM — não rode os dois ou vai baixar 486 MB de dependências Node desnecessárias.
Caminho A — Instalador oficial Anthropic (RECOMENDADO — binário nativo, zero Node)
curl -fsSL https://claude.ai/install.sh | bash
Output esperado: ✔ Claude Code successfully installed! com versão e location ~/.local/bin/claude. Se rodou, pula direto pro passo "Adicionar ao PATH" abaixo.
Caminho B — Via npm (SÓ se o A falhar)
# SÓ rode isso se o Caminho A falhou sudo apt install -y nodejs npm sudo npm install -g @anthropic-ai/claude-code
Adicionar ao PATH (obrigatório pro Caminho A)
O instalador nativo coloca o binário em ~/.local/bin/claude, mas esse diretório não está no $PATH por padrão no Ubuntu — o próprio instalador avisa. Adiciona:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc claude --version
Output esperado: 2.1.105 (ou versão mais recente). Se command not found, sai do SSH e entra de novo, ou roda exec bash.
claude doctor. Caminho B puxa ~486 MB de dependências do apt (nodejs + npm + 494 pacotes relacionados) — evita.
Agora o momento mágico. Como você já colocou o CLAUDE.md no ~/.claude/ global no Step 06, pode rodar claude de qualquer pasta — ele vai carregar o contexto Master7 automaticamente.
# Pode rodar de QUALQUER pasta porque o CLAUDE.md ta global claude # Dentro do Claude, autentica: /login # OAuth device flow: mostra URL + codigo, voce cola no browser do Mac # Depois do login, primeiro prompt de teste: # "Quem e voce e o que a gente vai fazer nos proximos modulos?"
ssh vps01-hostinger-ops7-ghost (ou alias que você configurou), e tenta o claude /login de novo. Terminal.app processa paste em TUI de forma robusta./login dar sucesso uma vez, o Claude salva o token em ~/.config/claude/ e você pode voltar pro Termius normalmente — o bug só afeta a primeira autenticação.
CLAUDE.md não carregou — confere ls -la ~/.claude/CLAUDE.md e head -5 ~/.claude/CLAUDE.md, e se necessário re-executa o passo 6 do Step 06 (cp ~/vps-master7/CLAUDE.md ~/.claude/CLAUDE.md).
A partir daqui você não digita mais comandos Linux manualmente. Em vez disso, você pede:
Voce (dentro do claude): "Executa o Modulo 02 — hardening completo. SSH key-only (desabilita password auth), UFW firewall, fail2ban. Segue a regra Akita Way: me avisa o comando antes de cada passo, espera minha aprovacao, valida com output real, so entao avanca. Usa o history como audit trail no final."
O Claude-ghost lê o Módulo 03 do tutorial (tem acesso à internet), segue os passos, e conduz você através deles. Você só autoriza com Y/N.
O módulo está dividido em 4 blocos. Rode na ordem. Cada bloco é auto-contido: cola, espera terminar, vai pro próximo. Substitua SEU_TOKEN_AQUI pelo teu token Ubuntu Pro antes.
adduser ghost pede senha forte que você define na hora e salva no 1Password. A senha é teu safety net anti-lockout — nunca pula.
# ═══════════════════════════════════════════════════════════
# BLOCO 1A — Na VPS como ROOT — automação apt + Ubuntu Pro
# ═══════════════════════════════════════════════════════════
apt update && apt upgrade -y && \
apt install -y curl git jq ca-certificates unzip build-essential unattended-upgrades apt-listchanges && \
apt autoremove -y && \
pro attach SEU_TOKEN_AQUI && \
pro enable usg && \
cat > /etc/apt/apt.conf.d/52unattended-upgrades-esm <<'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
EOF
dpkg-reconfigure -f noninteractive -plow unattended-upgrades && \
echo "=== BLOCO 1A DONE — agora roda BLOCO 1B manualmente ==="
# ═══════════════════════════════════════════════════════════ # BLOCO 1B — Na VPS como ROOT — MANUAL (adduser interativo) # ═══════════════════════════════════════════════════════════ # 1. Gera senha forte primeiro (copia pro clipboard, cola no 1Password) openssl rand -base64 24 # 2. Cria o user ghost — COLA a senha gerada quando pedir adduser ghost # Nome completo: Ghost Lab7 Operator # Room, Phone: Enter (vazio) # Is the information correct? Y # 3. Confirma que o nome ficou gravado getent passwd ghost # Esperado: ghost:x:1001:1001:Ghost Lab7 Operator,,,:/home/ghost:/bin/bash # 4. SALVA no 1Password/Bitwarden antes de continuar: # Título: "GL7 - ghost user VPS master7" # Username: ghost # Password: (a que você gerou no passo 1)
# ═══════════════════════════════════════════════════════════ # BLOCO 1C — Na VPS como ROOT — automação pós-adduser # ═══════════════════════════════════════════════════════════ usermod -aG sudo ghost && \ echo "ghost ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ghost && \ chmod 440 /etc/sudoers.d/ghost && \ mkdir -p /home/ghost/.ssh && \ cp /root/.ssh/authorized_keys /home/ghost/.ssh/authorized_keys && \ chown -R ghost:ghost /home/ghost/.ssh && \ chmod 700 /home/ghost/.ssh && chmod 600 /home/ghost/.ssh/authorized_keys && \ echo "=== BLOCO 1C DONE — agora: exit, testa ssh ghost@VPS via Termius ===" && \ echo "=== Se logar SEM senha via key: sudo reboot pra aplicar kernel novo ==="
# ═══════════════════════════════════════════════════════════ # BLOCO 2 — Na VPS como GHOST (após reconectar via Termius key) # ═══════════════════════════════════════════════════════════ mkdir -p ~/vps-master7 && cd ~/vps-master7 && \ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \ sudo apt update && sudo apt install -y gh && \ echo "=== gh CLI instalado. Agora roda MANUALMENTE estes 3 passos: ===" && \ echo " 1. gh auth login (autentica via device flow no browser)" && \ echo " 2. gh api repos/ghost-lab7/vps-master7/contents/PROMPT-MESTRE.md \\" && \ echo " -H 'Accept: application/vnd.github.v3.raw' > CLAUDE.md" && \ echo " 3. curl -fsSL https://claude.ai/install.sh | bash && exec bash && cd ~/vps-master7 && claude"
No Módulo 03 a gente faz o hardening de rede da VPS — mas conduzido pelo Claude-ghost que você acabou de instalar. Você lê o módulo pra entender o WHY, e o Claude executa o HOW.