Guides
Fundamentos ▾
Versionamento ▾
Deploy ▾

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
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
🍎
macOS
brew install --cask
font-meslo-lg-nerd-font
🪟
Windows WSL2
Instalar no Windows (não WSL)
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

TerminalCaminho
GNOME TerminalPreferências → Perfil → Texto → Fonte personalizada
iTerm2Settings → Profiles → Text → Font
Windows TerminalSettings → 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

AtalhoAção
<leader>eAbrir/fechar árvore de arquivos
<leader>ffBuscar arquivo pelo nome
<leader>fgBuscar texto em todos os arquivos
<leader>fbListar buffers abertos

LSP (em .ts / .tsx)

AtalhoAção
<leader>gdIr à definição
<leader>grVer referências
<leader>rnRenomear símbolo
KDocumentação / hover

Git

AtalhoAção
<leader>gAbrir Neogit
<leader>cpCopiar caminho relativo
<leader>csCopiar seleção (Visual)

Vim Motions — Referência Rápida

Movimentação

TeclaAção
hjkl← ↓ ↑ →
w / b / epróxima palavra / anterior / fim
0 / ^ / $início / 1º char / fim da linha
gg / Ginício / fim do arquivo
Ctrl+d / Ctrl+udescer / subir meia página
%ir para par de () {} []
f{x} / t{x}até / antes do char x na linha

Modos

TeclaAção
i / aInsert antes / após cursor
o / ONova linha abaixo / acima
v / V / Ctrl+vVisual char / linha / bloco
EscVoltar para Normal

Edição

TeclaAção
dd / yy / pDeletar / copiar linha / colar
u / Ctrl+rDesfazer / refazer
ciw / ci" / ci(Deletar dentro de palavra / aspas / parênteses
>> / <<Indentar / des-indentar
:%s/foo/bar/gSubstituir 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 configurados

Servidor

Zsh como shell padrão: echo $SHELL → /usr/bin/zsh
Oh My Zsh + Powerlevel10k: p10k configure concluído
Plugins clonados e ativos no .zshrc
Neovim via AppImage: nvim --version ≥ 0.10
Configuração clonada em ~/.config/nvim, plugins instalados
ripgrep instalado: rg --version
Node LTS via NVM: node --version
Docker sem sudo: docker ps
MongoDB + PostgreSQL rodando: docker compose ps
GitHub CLI autenticado: gh auth status
Claude CLI instalado: claude --version