Skip to content

Instantly share code, notes, and snippets.

@sidneyspe
Last active November 19, 2025 11:20
Show Gist options
  • Select an option

  • Save sidneyspe/908d74fb4b9b4be47272612bfd03fdd7 to your computer and use it in GitHub Desktop.

Select an option

Save sidneyspe/908d74fb4b9b4be47272612bfd03fdd7 to your computer and use it in GitHub Desktop.
Nobara Environment
#!/usr/bin/env bash
set -e
# ==========================================
# Setup completo e idempotente para Nobara
# Dev + Docker + ZSH (Spaceship) + utilitários
# ==========================================
echo "🚀 Iniciando setup COMPLETO e IDEMPOTENTE no Nobara/Fedora..."
sleep 1
# -------- Helpers --------
install_dnf_pkg() {
PKG="$1"
if rpm -q "$PKG" &>/dev/null; then
echo "✔ $PKG já instalado — pulando..."
else
echo "📦 Instalando $PKG..."
sudo dnf install -y "$PKG"
fi
}
install_flatpak_pkg() {
PKG="$1"
if flatpak list | grep -q "$PKG"; then
echo "✔ $PKG já instalado (Flatpak) — pulando..."
else
echo "📦 Instalando $PKG via Flatpak..."
flatpak install -y flathub "$PKG"
fi
}
# -------- Update base --------
echo "🔧 Atualizando sistema..."
sudo dnf update -y
# -------- DNF packages --------
echo "📦 Instalando pacotes via DNF (com checagem)..."
for pkg in \
git \
python3 python3-pip \
nodejs npm \
java-21-openjdk java-21-openjdk-devel \
mingw64-gcc mingw32-gcc \
unrar unzip \
lsd \
flameshot \
httpie \
docker docker-compose \
vlc \
zsh \
curl wget fzf
do
install_dnf_pkg "$pkg"
done
# -------- JetBrains Mono Nerd Font --------
echo "🔤 Instalando JetBrainsMono Nerd Font em ~/.fonts..."
JB_FONT_INSTALLED="no"
if command -v fc-list >/dev/null 2>&1; then
if fc-list | grep -qi "JetBrainsMono Nerd Font"; then
JB_FONT_INSTALLED="yes"
fi
fi
if [ "$JB_FONT_INSTALLED" = "yes" ]; then
echo "✔ JetBrainsMono Nerd Font já instalada — pulando..."
else
mkdir -p "$HOME/.fonts"
TMP_JB_TAR="/tmp/JetBrainsMonoNF.tar.xz"
TMP_JB_DIR="/tmp/JetBrainsMonoNF"
echo "🔽 Baixando JetBrainsMono Nerd Font (Nerd Fonts release)..."
curl -L "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.tar.xz" -o "$TMP_JB_TAR"
rm -rf "$TMP_JB_DIR"
mkdir -p "$TMP_JB_DIR"
echo "📦 Extraindo fontes..."
tar -xf "$TMP_JB_TAR" -C "$TMP_JB_DIR"
echo "📁 Copiando .ttf/.otf para ~/.fonts..."
find "$TMP_JB_DIR" -type f \( -name "*.ttf" -o -name "*.otf" \) -exec cp {} "$HOME/.fonts/" \;
if command -v fc-cache >/dev/null 2>&1; then
echo "🧹 Atualizando cache de fontes..."
fc-cache -f -v || true
fi
echo "✔ JetBrainsMono Nerd Font instalada em ~/.fonts"
fi
# -------- GOTOP (via release oficial) --------
echo "📊 Instalando gotop (binário oficial)..."
if command -v gotop >/dev/null 2>&1; then
echo "✔ gotop já instalado — pulando..."
else
echo "🔍 Buscando release mais recente do gotop..."
LATEST_URL=$(curl -s https://api.github.com/repos/xxxserxxx/gotop/releases/latest \
| grep browser_download_url \
| grep linux_amd64.tgz \
| cut -d '"' -f 4)
if [ -z "$LATEST_URL" ]; then
echo "❌ Não foi possível encontrar o .tgz do gotop. Pulando instalação."
else
echo "🔽 Baixando: $LATEST_URL"
curl -L "$LATEST_URL" -o /tmp/gotop.tgz
echo "📦 Extraindo..."
tar -xzf /tmp/gotop.tgz -C /tmp/
GOTOP_BIN=$(find /tmp -maxdepth 3 -type f -name "gotop" | head -n 1)
if [ -z "$GOTOP_BIN" ]; then
echo "❌ Binário do gotop não encontrado no .tgz. Pulando."
else
echo "📁 Movendo binário para /usr/local/bin/gotop"
sudo mv "$GOTOP_BIN" /usr/local/bin/gotop
sudo chmod +x /usr/local/bin/gotop
echo "✔ gotop instalado com sucesso em /usr/local/bin/gotop"
fi
fi
fi
# -------- Dockly via npm --------
echo "🧰 Instalando Dockly via npm..."
if command -v dockly >/dev/null 2>&1; then
echo "✔ dockly já instalado — pulando..."
else
sudo npm install -g dockly
fi
# -------- PNPM via npm --------
echo "📦 Instalando PNPM..."
if command -v pnpm >/dev/null 2>&1; then
echo "✔ pnpm já instalado — pulando..."
else
sudo npm install -g pnpm
echo "✔ pnpm instalado!"
fi
# -------- Docker --------
echo "🐳 Habilitando Docker..."
sudo systemctl enable --now docker || true
sudo usermod -aG docker "$USER" || true
# -------- Bun --------
echo "⚡ Instalando Bun..."
if command -v bun >/dev/null 2>&1; then
echo "✔ Bun já instalado — pulando..."
else
curl -fsSL https://bun.sh/install | bash
fi
# -------- Sublime Text (via latest stable rpm) --------
echo "📦 Instalando Sublime Text 4..."
if command -v subl >/dev/null 2>&1; then
echo "✔ Sublime Text já instalado — pulando..."
else
echo "🔽 Baixando último Sublime Text estável (.rpm)..."
curl -L https://download.sublimetext.com/latest/stable/linux/x64/rpm -o /tmp/sublime.rpm
echo "📦 Instalando Sublime Text via RPM..."
if sudo dnf install -y /tmp/sublime.rpm; then
echo "✔ Sublime Text instalado com sucesso!"
else
echo "❌ Falha ao instalar Sublime Text via RPM. Pulando."
fi
fi
# -------- Zed Editor (via tar.gz oficial) --------
echo "🟣 Instalando Zed Editor..."
if command -v zed >/dev/null 2>&1; then
echo "✔ Zed já instalado — pulando..."
else
TMP_ZED_DIR="/tmp/zed-linux"
TMP_ZED_TAR="/tmp/zed-linux-x86_64.tar.gz"
echo "🔽 Baixando Zed (stable, tar.gz)..."
if ! curl -fL "https://zed.dev/api/releases/stable/latest/zed-linux-x86_64.tar.gz" -o "$TMP_ZED_TAR"; then
echo "❌ Falha ao baixar o Zed (tar.gz). Pulando instalação."
else
rm -rf "$TMP_ZED_DIR"
mkdir -p "$TMP_ZED_DIR"
echo "📦 Extraindo pacote..."
if tar -xzf "$TMP_ZED_TAR" -C "$TMP_ZED_DIR"; then
if [ -d "$TMP_ZED_DIR/zed.app" ]; then
echo "📁 Movendo para /opt/zed.app..."
sudo rm -rf /opt/zed.app
sudo mv "$TMP_ZED_DIR/zed.app" /opt/zed.app
echo "🔗 Criando symlink /usr/local/bin/zed..."
sudo ln -sf /opt/zed.app/bin/zed /usr/local/bin/zed
echo "✔ Zed Editor instalado com sucesso (via /opt/zed.app)!"
else
echo "❌ Não encontrei 'zed.app' dentro do tar.gz — instalação abortada."
fi
else
echo "❌ Falha ao extrair o tar.gz do Zed."
fi
fi
fi
# -------- Flatpak apps --------
echo "📦 Instalando apps via Flatpak..."
install_flatpak_pkg com.visualstudio.code
install_flatpak_pkg com.mongodb.Compass
install_flatpak_pkg com.getpostman.Postman
install_flatpak_pkg us.zoom.Zoom
install_flatpak_pkg io.dbeaver.DBeaverCommunity
# -------- TeamViewer --------
echo "📦 Instalando TeamViewer..."
if rpm -q teamviewer &>/dev/null; then
echo "✔ TeamViewer já instalado — pulando..."
else
sudo dnf install -y https://download.teamviewer.com/download/linux/teamviewer.x86_64.rpm || true
fi
# -------- Multimedia codecs (dnf5 group) --------
echo "🎮 Instalando codecs multimídia (grupo Multimedia)..."
if dnf group list -v | grep -qi "Multimedia"; then
sudo dnf group install -y "Multimedia" || true
else
echo "ℹ️ Grupo 'Multimedia' não encontrado — pulando."
fi
# -------- Oh My Zsh --------
echo "💅 Instalando Oh My Zsh..."
if [ -d "$HOME/.oh-my-zsh" ]; then
echo "✔ Oh My Zsh já instalado — pulando..."
else
export RUNZSH=no CHSH=no KEEP_ZSHRC=yes
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
fi
# -------- Spaceship theme (Oh My Zsh) --------
echo "🚀 Instalando tema Spaceship para Oh My Zsh..."
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
if [ ! -d "$ZSH_CUSTOM/themes/spaceship-prompt" ]; then
git clone --depth=1 https://github.com/spaceship-prompt/spaceship-prompt.git \
"$ZSH_CUSTOM/themes/spaceship-prompt"
else
echo "✔ Repositório spaceship-prompt já existe — pulando clone."
fi
if [ ! -f "$ZSH_CUSTOM/themes/spaceship.zsh-theme" ]; then
ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" \
"$ZSH_CUSTOM/themes/spaceship.zsh-theme"
echo "✔ Symlink do tema Spaceship criado."
else
echo "✔ Symlink do tema Spaceship já existe — pulando."
fi
# -------- Zinit --------
echo "🔌 Instalando Zinit..."
ZINIT_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/zinit/zinit.git"
if [ -d "$ZINIT_DIR" ]; then
echo "✔ Zinit já instalado — pulando..."
else
bash -c "$(curl -fsSL https://git.io/zinit-install)"
fi
# -------- asdf --------
echo "🧱 Instalando asdf..."
if [ -d "$HOME/.asdf" ]; then
echo "✔ asdf já instalado — pulando..."
else
git clone https://github.com/asdf-vm/asdf.git "$HOME/.asdf" --branch v0.14.0
fi
# -------- NVM --------
echo "🟢 Instalando NVM..."
if [ -d "$HOME/.nvm" ]; then
echo "✔ NVM já instalado — pulando..."
else
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
fi
# -------- .zshrc --------
echo "📦 Criando backup do .zshrc antigo (se existir)..."
if [ -f "$HOME/.zshrc" ]; then
cp "$HOME/.zshrc" "$HOME/.zshrc.backup_$(date +%s)"
echo "✔ Backup criado."
fi
echo "📝 Gerando novo ~/.zshrc com Spaceship + Bun + PNPM + Zinit..."
cat > "$HOME/.zshrc" << 'EOF'
# ========= PATHS BÁSICOS =========
export ANDROID_HOME="$HOME/Android/Sdk"
export PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools"
export ZSH="$HOME/.oh-my-zsh"
export PATH="$PATH:/usr/local/bin:$HOME/.local/bin"
export DISPLAY=:0
# Tema do Oh My Zsh (Spaceship instalado em $ZSH_CUSTOM/themes)
ZSH_THEME="spaceship"
# ========= BUN =========
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
# ========= PNPM =========
export PNPM_HOME="$HOME/.local/share/pnpm"
export PATH="$PNPM_HOME:$PATH"
# ========= ASDF =========
if [ -f "$HOME/.asdf/asdf.sh" ]; then
. "$HOME/.asdf/asdf.sh"
fi
# ========= GO =========
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"
# ========= PLUGINS OH MY ZSH =========
plugins=(docker httpie git node postgres)
source "$ZSH/oh-my-zsh.sh"
# ========= ALIASES =========
alias ls='lsd'
alias l='lsd -l'
alias la='lsd -la'
alias lt='lsd --tree'
alias cls='clear'
alias python='python3'
alias dockerstopall='docker stop $(docker ps -aq)'
alias dockerremoveall='docker rm $(docker ps -aq)'
alias dockersystemprune='docker system prune -a --volumes'
alias updt='sudo dnf clean all -y && sudo dnf upgrade -y && flatpak update -y && omz update'
alias upgd='updt'
alias rando="cat /dev/urandom | base64 | tr -dc 'a-km-zA-KM-Z02-9-_!@#$%^&*+|' | fold -w 16 | head -n 4"
alias code='flatpak run com.visualstudio.code 2>/dev/null'
# ========= NVM =========
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# ========= ZINIT =========
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
if [ -f "${ZINIT_HOME}/zinit.zsh" ]; then
source "${ZINIT_HOME}/zinit.zsh"
zinit light zdharma-continuum/fast-syntax-highlighting
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-history-substring-search
zinit light zsh-users/zsh-completions
zinit light buonomo/yarn-completion
zinit light-mode for \
zdharma-continuum/zinit-annex-as-monitor \
zdharma-continuum/zinit-annex-bin-gem-node \
zdharma-continuum/zinit-annex-patch-dl \
zdharma-continuum/zinit-annex-rust
fi
autoload -Uz compinit
compinit
EOF
# -------- Default shell --------
echo "🔁 Definindo ZSH como shell padrão..."
if [ "$SHELL" != "/usr/bin/zsh" ]; then
chsh -s /usr/bin/zsh "$USER" || true
fi
echo ""
echo "🎉 Setup COMPLETO e IDEMPOTENTE finalizado!"
echo "➡ Java 21 instalado (java-21-openjdk + devel)"
echo "➡ JetBrainsMono Nerd Font instalada em ~/.fonts"
echo "➡ Bun + PNPM instalados e no PATH"
echo "➡ Apps verificados e instalados (dnf + flatpak + rpm)"
echo "➡ gotop via release oficial, Dockly via npm"
echo "➡ Sublime + Zed + VSCode etc. prontos"
echo "➡ Zsh + Oh My Zsh + Spaceship + Zinit configurados"
echo ""
echo "⚠️ Faz logout/login pra aplicar grupo docker, shell padrão e fontes."
echo "Depois abre o terminal, escolhe JetBrainsMono Nerd Font e curte o setup. 🚀"
@sidneyspe
Copy link
Author

chmod +x install-nobara.sh
./install-nobara.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment