VPS Master7 · Módulo 02

Claude CTO
on the VPS

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.

Duração20 min
NívelIntermediário
EntregávelClaude rodando como ghost
Pré-módulo01 (SSH root OK)
CriticidadeALTA

A virada Master7 — máquina faz o que pode, humano só o irredutível

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).

🧠 A virada que transforma o VPS Master7. De "curso de Linux com 100 comandos" pra "kit AI CTO embutido na VPS". Do módulo 02 em diante, você pede pro Claude-ghost da VPS conduzir o hardening, Docker, EasyPanel — em vez de digitar tudo linha por linha.
📜 Regra de ouro Master7 — 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.
01

Update + pacotes base (última vez digitando apt como root)

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.

💡 Por que esses pacotes? 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.
02

Ativar Ubuntu Pro (grátis) — o que você GANHA

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
🎁 O que você acabou de destravar (tudo grátis):
  • ESM Apps — 10 anos de security patches em 30.000+ pacotes do universe (OpenSSL, Nginx, Redis, Postgres client, Python, Node, etc)
  • ESM Infra — 10 anos de patches no base Ubuntu (kernel, systemd, apt, glibc, coreutils)
  • Livepatch — patches de kernel aplicados em runtime, sem reboot. Sua VPS pode ficar anos online ininterrupta
  • USG (vamos habilitar no Step 03) — auditor + aplicador automático de hardening CIS Level 1/2 ou DISA-STIG. Ouro puro pra compliance
⚠️ Token Ubuntu Pro: pode colar no terminal, não é senha — é um ID da conta. Mas não commita em git público, por costume de segurança.
03

USG + unattended-upgrades — autopilot de segurança

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
✅ Autopilot ativado. De agora em diante a VPS baixa e aplica security patches (incluindo ESM) todo dia automaticamente. Você não precisa mais entrar nela por segurança — só por feature. Esse é o baseline Master7.
04

Criar user ghost + autorizar sua SSH key

Antes 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.

🛡️ SAFETY NET ANTI-LOCKOUT — OBRIGATÓRIO DEFINIR SENHA NO GHOST. Mesmo que você vá usar SSH key como método primário, a senha é teu paraquedas. Se a key falhar por qualquer motivo (app bugado, teclado trocado, ssh config corrompido), a senha te salva de ficar locked-out da própria VPS. Salva a senha no 1Password/Bitwarden assim que criar — nunca cola em chat ou arquivo de texto. Até o Módulo 03 desabilitar password auth, você tem 3 caminhos de acesso: senha + SSH key + console Hostinger. Isso é Master7 real.
# 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
🚨 Teste ANTES de fechar o root: abre OUTRO terminal no teu Mac e tenta 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.

Claude desperta como ghost

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.

05

Sair do root, entrar como ghost

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
06

Criar pasta do projeto + baixar CLAUDE.md direto do GitHub

O 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 é.

🔑 Acesso ao repo: quando você comprou o curso, foi adicionado como collaborator no repo privado 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
🧠 Por que ~/.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.
⚠️ Fallback — se o gh CLI der erro ou você preferir manual:
  1. Abre github.com/ghost-lab7/vps-master7/blob/main/PROMPT-MESTRE.md no browser
  2. Clica em Raw (botão no topo direito)
  3. Salva como CLAUDE.md no Mac (⌘+S)
  4. Sobe pra VPS via Termius SFTP (arrasta pro /home/ghost/vps-master7/) OU via CLI: scp CLAUDE.md vps01-hostinger-ops7-ghost:~/vps-master7/
  5. DEPOIS do upload, executa o passo 6 (cp pra ~/.claude/CLAUDE.md) igual o caminho A
07

Instalar Claude Code CLI (como ghost)

Dois caminhos possíveis. Escolhe UM — não rode os dois ou vai baixar 486 MB de dependências Node desnecessárias.

⚠️ USE APENAS UM CAMINHO. Se o Caminho A (nativo) funcionou (mostrou "✔ Claude Code successfully installed"), PARE. Não rode o Caminho B. Se o A falhar, aí sim tenta o B como fallback.

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.

💡 Por que Caminho A é melhor: binário nativo (~50 MB), não depende de Node/npm, instala em user-space (sem sudo depois do install), atualiza via claude doctor. Caminho B puxa ~486 MB de dependências do apt (nodejs + npm + 494 pacotes relacionados) — evita.
08

Autenticar Claude + teste de contexto

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?"
🚨 BUG CONHECIDO — Termius e paste no prompt OAuth. O Termius (Mac/iOS/Android) tem um quirk com TUIs que não aceita paste via Cmd+V direto no prompt "Paste code here if prompted >" do Claude Code. Se você tentar colar o código OAuth e nada acontecer, são 3 opções:
  1. Primeira tentativa (recomendado): sai do Termius, abre Terminal.app nativo do Mac (Spotlight → Terminal), roda 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.
  2. Segunda tentativa: no Termius, Edit menu → Paste (não Cmd+V), ou right-click → Paste.
  3. Último recurso: DIGITA o código na mão. Sim, doloroso — o código tem ~100 caracteres. Mas funciona. Copia pro Notes primeiro pra não perder, depois olha e digita.
Depois do /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.
✅ Validação Akita Way: o Claude deve responder mencionando "Assistente Oficial do Tutorial VPS Master7", "Ghost Lab7", "Master7 Dual Architecture" e listar os 9 módulos do tutorial em tabela ou lista. Se ele responder genérico tipo "sou o Claude, um assistente", 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).
09

Handoff pro Módulo 03 — Claude-ghost conduz o hardening

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.

🎯 Claude acordou. VPS agora é AI-nativa. Você acabou de instalar o "cérebro" da sua VPS como ghost. Do M03 em diante o tutorial é referência visual — execução é o Claude-ghost conduzindo. Menos retrabalho, menos erro de digitação, mais contexto preservado.

🚀 Quick Install — copia-cola pra configurar tudo (pros apressados)

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.

⚠️ Bloco 1B é MANUAL e interativo — NÃO é copia-cola. Isso é de propósito: o 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"

Próximo passo

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.