Ambiente de Desenvolvimento via SSH
Servidor Ubuntu como workstation completo. Terminal local é só portal.
Arquitetura
Máquina Local
Terminal SSH (kitty / iTerm2 / Windows Terminal)
Fonte MesloLGS NF obrigatório p/ ícones
~/.ssh/config (tunnels automáticos)
Browser (localhost:3000, 5173, ...)
│
SSH + port forwarding
↓
SSH + port forwarding
↓
Servidor Ubuntu
Zsh + Oh My Zsh + Powerlevel10k
Neovim (editor, LSP TypeScript)
Node.js via NVM
Docker → MongoDB + PostgreSQL
Nginx (proxy / static)
GitHub CLI + Claude CLI
Regra: tudo roda no servidor. O local só precisa do terminal + fonte + browser.
1. Fonte — Máquina Local
Powerlevel10k usa ícones Nerd Font. Fonte deve estar no emulador de terminal local, não no servidor.
Linux
mkdir -p ~/.local/share/fonts
baixar 4 variantes MesloLGS NF
fc-cache -fv
baixar 4 variantes MesloLGS NF
fc-cache -fv
macOS
brew install --cask
font-meslo-lg-nerd-font
font-meslo-lg-nerd-font
Windows WSL2
Instalar no Windows (não WSL)
settings.json:
"fontFace": "MesloLGS NF"
settings.json:
"fontFace": "MesloLGS NF"
mkdir -p ~/.local/share/fonts && cd ~/.local/share/fonts
for f in "Regular" "Bold" "Italic" "Bold%20Italic"; do
wget "https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20${f}.ttf"
done
fc-cache -fv
Configurar no emulador
| Terminal | Caminho |
|---|---|
| GNOME Terminal | Preferências → Perfil → Texto → Fonte personalizada |
| iTerm2 | Settings → Profiles → Text → Font |
| Windows Terminal | Settings → Perfil WSL → Appearance → Font face |
| VS Code | "terminal.integrated.fontFamily": "MesloLGS NF" |
2. Zsh + Oh My Zsh
sudo apt update && sudo apt install zsh -y
chsh -s $(which zsh)
# reconectar SSH
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Powerlevel10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Em ~/.zshrc: ZSH_THEME="powerlevel10k/powerlevel10k"
source ~/.zshrc # inicia assistente
# ou: p10k configure
Plugins
zsh-autosuggestions
Sugestões do histórico em cinza enquanto digita. Tab para aceitar.
zsh-syntax-highlighting
Comandos válidos em verde, inválidos em vermelho em tempo real.
zsh-completions
Completions adicionais para ferramentas modernas.
fzf
Ctrl+r = busca fuzzy no histórico. Ctrl+t = busca de arquivos.
z
cd inteligente: aprende diretórios frequentes.
z proj vai para ~/projects/.git
Aliases úteis: gs, ga, gc, gp, gl, gd. Builtin do Oh My Zsh.
# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# zsh-completions
git clone https://github.com/zsh-users/zsh-completions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-completions
# fzf
sudo apt install fzf -y
~/.zshrc de referência
# Powerlevel10k instant prompt
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(
git
z
fzf
zsh-autosuggestions
zsh-syntax-highlighting
zsh-completions
)
source $ZSH/oh-my-zsh.sh
autoload -U compinit && compinit
export EDITOR=nvim
alias vim='nvim'
alias clip='xclip -sel clip'
source /usr/share/doc/fzf/examples/key-bindings.zsh
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
3. Neovim
apt do Ubuntu entrega versão antiga. Usar AppImage para versão mais recente.
sudo apt install ripgrep -y # obrigatório para busca em arquivos
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage
chmod u+x nvim-linux-x86_64.appimage
sudo mv nvim-linux-x86_64.appimage /usr/local/bin/nvim
nvim --version
git clone https://github.com/nandobfer/nvim-config ~/.config/nvim
nvim # lazy.nvim instala plugins automaticamente
Plugins
lazy.nvim
Gerenciador de plugins com lazy loading
nvim-tree
Árvore de arquivos lateral
telescope
Busca fuzzy: arquivos, texto, buffers, git
mason + lspconfig
LSP: vtsls para TypeScript/React
nvim-treesitter
Syntax highlighting avançado por AST
neogit + diffview
Git visual integrado ao Neovim
Atalhos (<leader> = Espaço)
Arquivos
| Atalho | Ação |
|---|---|
| <leader>e | Abrir/fechar árvore de arquivos |
| <leader>ff | Buscar arquivo pelo nome |
| <leader>fg | Buscar texto em todos os arquivos |
| <leader>fb | Listar buffers abertos |
LSP (em .ts / .tsx)
| Atalho | Ação |
|---|---|
| <leader>gd | Ir à definição |
| <leader>gr | Ver referências |
| <leader>rn | Renomear símbolo |
| K | Documentação / hover |
Git
| Atalho | Ação |
|---|---|
| <leader>g | Abrir Neogit |
| <leader>cp | Copiar caminho relativo |
| <leader>cs | Copiar seleção (Visual) |
Vim Motions — Referência Rápida
Movimentação
| Tecla | Ação |
|---|---|
| hjkl | ← ↓ ↑ → |
| w / b / e | próxima palavra / anterior / fim |
| 0 / ^ / $ | início / 1º char / fim da linha |
| gg / G | início / fim do arquivo |
| Ctrl+d / Ctrl+u | descer / subir meia página |
| % | ir para par de () {} [] |
| f{x} / t{x} | até / antes do char x na linha |
Modos
| Tecla | Ação |
|---|---|
| i / a | Insert antes / após cursor |
| o / O | Nova linha abaixo / acima |
| v / V / Ctrl+v | Visual char / linha / bloco |
| Esc | Voltar para Normal |
Edição
| Tecla | Ação |
|---|---|
| dd / yy / p | Deletar / copiar linha / colar |
| u / Ctrl+r | Desfazer / refazer |
| ciw / ci" / ci( | Deletar dentro de palavra / aspas / parênteses |
| >> / << | Indentar / des-indentar |
| :%s/foo/bar/g | Substituir em todo arquivo |
4. Ferramentas Essenciais
sudo apt update && sudo apt install -y curl git htop xclip
# tldr — exemplos práticos de qualquer comando
sudo apt install tealdeer -y
curl -Lo /tmp/tldr.zip https://github.com/tldr-pages/tldr/releases/latest/download/tldr.zip
mkdir -p ~/.cache/tealdeer/tldr-pages
python3 -c "import zipfile,os; zipfile.ZipFile('/tmp/tldr.zip').extractall(os.path.expanduser('~/.cache/tealdeer/tldr-pages'))"
curl
HTTP/FTP no terminal. Download, APIs, debug.
sudo apt install curl
git
Controle de versão.
sudo apt install git
htop
Monitor de processos interativo. Melhor que top.
sudo apt install htop
xclip
Clipboard via terminal. Alias clip='xclip -sel clip'.
sudo apt install xclip
tldr
Exemplos rápidos de qualquer comando. tldr tar, tldr docker...
sudo apt install tealdeer
ripgrep (rg)
grep rápido. Obrigatório para Telescope no Neovim.
sudo apt install ripgrep
5. Node.js via NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.zshrc # ou ~/.bashrc
nvm install --lts
nvm use --lts
nvm alias default node
node --version && npm --version
# gerenciadores alternativos
npm install -g yarn
npm install -g pnpm
6. Docker para Bancos de Dados
sudo usermod -aG docker $USER && newgrp docker
# ~/infra/docker-compose.yml
services:
mongodb:
image: mongo:latest
container_name: mongodb
restart: unless-stopped
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: changeme
volumes:
- mongodb_data:/data/db
postgres:
image: postgres:16-alpine
container_name: postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: changeme
POSTGRES_DB: dev
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
mongodb_data:
postgres_data:
mkdir -p ~/infra
cd ~/infra && docker compose up -d
docker compose ps
sudo systemctl enable docker
7. GitHub CLI
sudo mkdir -p -m 755 /etc/apt/keyrings
wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | \
sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/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 gh -y
gh auth login
gh auth status
8. Claude CLI
npm install -g @anthropic-ai/claude-code
claude # autentica na primeira execução
claude --version
9. SSH Tunnels
Acesse do browser local os serviços rodando no servidor.
Máquina Local
browser → localhost:3000 ══════════→ servidor:3000 (Next.js)
browser → localhost:5173 ══════════→ servidor:5173 (Vite)
MongoDB client → localhost:27017 ═════→ servidor:27017 (MongoDB)
pgAdmin → localhost:5432 ══════════→ servidor:5432 (PostgreSQL)
~/.ssh/config — recomendado
Host meu-servidor
HostName ip-ou-dominio
User alfredo
LocalForward 3000 localhost:3000
LocalForward 5173 localhost:5173
LocalForward 27017 localhost:27017
LocalForward 5432 localhost:5432
ssh meu-servidor # tunnels sobem automaticamente
Manual (sessão única)
ssh -L 3000:localhost:3000 \
-L 5173:localhost:5173 \
-L 27017:localhost:27017 \
-L 5432:localhost:5432 \
usuario@servidor
Checklist
Máquina Local
Fonte MesloLGS NF instalada e configurada no terminal
~/.ssh/config com tunnels configuradosServidor
Zsh como shell padrão:
echo $SHELL → /usr/bin/zshOh My Zsh + Powerlevel10k:
p10k configure concluídoPlugins clonados e ativos no
.zshrcNeovim via AppImage:
nvim --version ≥ 0.10Configuração clonada em
~/.config/nvim, plugins instaladosripgrep instalado:
rg --versionNode LTS via NVM:
node --versionDocker sem sudo:
docker psMongoDB + PostgreSQL rodando:
docker compose psGitHub CLI autenticado:
gh auth statusClaude CLI instalado:
claude --version