feat: Migrate Docker setup from Desktop to Colima and refactor .zshrc for improved path handling and Zsh completion.

This commit is contained in:
Marco Gallegos
2025-11-20 23:01:28 -06:00
parent 98c8ac3dbb
commit f7b7a98558
3 changed files with 299 additions and 96 deletions

View File

@@ -1,27 +1,39 @@
# --------------------------------------------------------------- # =======================================================================
# Vanity Shell Configuración base para Zsh en macOS # Vanity Shell - Configuracion base para macOS (inspirada en MG v3.0)
# --------------------------------------------------------------- # =======================================================================
# Incluye Oh My Zsh, Oh My Posh, historial afinado y alias útiles. # Orientada a Zsh + Oh My Zsh + Oh My Posh. Ajusta cualquier seccion
# Este archivo es copiado automáticamente a ~/.zshrc por vanity_setup.sh. # segun tus necesidades personales antes de copiarla a ~/.zshrc.
# =======================================================================
# --------------------------------------------------------------- # --- Locale --------------------------------------------------------------
# PATH — añade rutas clave antes del resto del sistema export LANG=en_US.UTF-8
# --------------------------------------------------------------- export LC_ALL=en_US.UTF-8
if [ -d /opt/homebrew/bin ]; then
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH" # --- Homebrew + PATH -----------------------------------------------------
fi if [[ -x /opt/homebrew/bin/brew ]]; then
if [ -d "$HOME/.local/bin" ]; then eval "$(/opt/homebrew/bin/brew shellenv)"
export PATH="$HOME/.local/bin:$PATH" elif [[ -x /usr/local/bin/brew ]]; then
fi eval "$(/usr/local/bin/brew shellenv)"
if [ -d "$HOME/bin" ]; then
export PATH="$HOME/bin:$PATH"
fi fi
# --------------------------------------------------------------- typeset -U path PATH
# Oh My Zsh — Framework principal + plugins path=(
# --------------------------------------------------------------- /opt/homebrew/bin
/opt/homebrew/sbin
/usr/local/bin
/usr/local/sbin
$HOME/.local/bin
$HOME/bin
$HOME/.npm-global/bin
$HOME/AppImages
$HOME/go/bin
$path
)
export PATH
# --- Oh My Zsh -----------------------------------------------------------
export ZSH="$HOME/.oh-my-zsh" export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell" # el prompt real lo gestiona Oh My Posh ZSH_THEME="" # el prompt final lo gestiona Oh My Posh
plugins=( plugins=(
git sudo history colorize git sudo history colorize
@@ -33,71 +45,237 @@ plugins=(
zsh-completions zsh-completions
) )
source $ZSH/oh-my-zsh.sh export ZSH_DISABLE_COMPFIX=true
zstyle ':completion::complete:*' use-cache on
zstyle ':completion::complete:*' cache-path "$HOME/.zcompcache"
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*' menu select
# --------------------------------------------------------------- [[ -r "$ZSH/oh-my-zsh.sh" ]] && source "$ZSH/oh-my-zsh.sh"
# Oh My Posh — Prompt moderno (tema Catppuccin)
# --------------------------------------------------------------- for plugin_file in \
"${ZSH_CUSTOM:-$ZSH/custom}/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" \
"/usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh"
do
[[ -r "$plugin_file" ]] && source "$plugin_file" && break
done
for plugin_file in \
"${ZSH_CUSTOM:-$ZSH/custom}/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" \
"/usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
do
[[ -r "$plugin_file" ]] && source "$plugin_file" && break
done
# --- Oh My Posh ----------------------------------------------------------
if command -v oh-my-posh >/dev/null 2>&1; then if command -v oh-my-posh >/dev/null 2>&1; then
eval "$(oh-my-posh init zsh --config ~/.poshthemes/catppuccin.omp.json)" if [[ -f "$HOME/.poshthemes/catppuccin.omp.json" ]]; then
eval "$(oh-my-posh init zsh --config "$HOME/.poshthemes/catppuccin.omp.json")"
else
eval "$(oh-my-posh init zsh)"
fi
fi fi
# --------------------------------------------------------------- # --- Direnv --------------------------------------------------------------
# Historial y opciones de shell
# ---------------------------------------------------------------
HISTFILE=~/.zsh_history
HISTSIZE=50000
SAVEHIST=50000
setopt SHARE_HISTORY
setopt HIST_IGNORE_SPACE
setopt HIST_IGNORE_DUPS
setopt HIST_VERIFY
setopt AUTO_CD
setopt CORRECT
setopt COMPLETE_ALIASES
# ---------------------------------------------------------------
# Preferencias básicas
# ---------------------------------------------------------------
export CLICOLOR=1
export LSCOLORS="GxFxCxDxBxegedabagacad"
export EDITOR="nano"
# ---------------------------------------------------------------
# Alias — accesos rápidos de uso frecuente
# ---------------------------------------------------------------
alias ll="ls -lah"
alias gs="git status -sb"
alias gl="git log --oneline --graph --decorate"
alias gc="git commit"
alias gp="git push"
alias d="docker"
alias dc="docker compose"
alias reload-zsh="source ~/.zshrc"
alias portainer="open https://localhost:9443"
alias ytv='yt-dlp -P "$HOME/videos/youtube"'
alias ytm='yt-dlp -x --audio-format mp3 --audio-quality 0 -o "%(title)s.%(ext)s" -P "$HOME/musica/youtube"'
# ---------------------------------------------------------------
# Integraciones opcionales
# ---------------------------------------------------------------
if command -v direnv >/dev/null 2>&1; then if command -v direnv >/dev/null 2>&1; then
eval "$(direnv hook zsh)" eval "$(direnv hook zsh)"
fi fi
# --------------------------------------------------------------- # --- Go / Node / Python --------------------------------------------------
# Ayuda rápida de Vanity Shell export GOPATH="$HOME/go"
# --------------------------------------------------------------- export GOBIN="$GOPATH/bin"
help() { export PATH="$GOBIN:$PATH"
cat <<'EOF'
Vanity Shell — comandos rápidos:
ytv <url> -> Descarga el video completo en ~/videos/youtube
ytm <url> -> Descarga solo el audio (mp3) en ~/musica/youtube
Ejemplos: export NVM_DIR="$HOME/.nvm"
ytv https://youtu.be/videoID [[ -s "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh"
ytm https://youtu.be/trackID [[ -s "$NVM_DIR/bash_completion" ]] && source "$NVM_DIR/bash_completion"
Recuerda que ambos comandos requieren yt-dlp/ffmpeg instalados (el setup ya los incluye). alias pip='pip3'
alias python='python3'
venv() {
case "$1" in
create) python -m venv .venv && echo "Entorno virtual creado en .venv" ;;
on|activate)
if [[ -f .venv/bin/activate ]]; then
source .venv/bin/activate && echo "Entorno virtual activado"
else
echo "No se encontro .venv/bin/activate"
fi
;;
off|deactivate)
command -v deactivate >/dev/null 2>&1 && deactivate && echo "Entorno virtual desactivado" || echo "No hay entorno activo"
;;
*) echo "Uso: venv [create|on|off|activate|deactivate]" ;;
esac
}
# --- Alias Generales ------------------------------------------------------
alias cls='clear'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias reload='source ~/.zshrc'
# --- Git ------------------------------------------------------------------
alias gs='git status -sb'
alias ga='git add'
alias gc='git commit'
alias gcm='git commit -m'
alias gp='git push'
alias gl='git pull'
alias gd='git diff'
alias gb='git branch'
alias gco='git checkout'
alias gcb='git checkout -b'
alias glog='git log --oneline --graph --decorate'
gac() { git add . && git commit -m "$1"; }
# --- Docker / Colima ------------------------------------------------------
if docker compose version >/dev/null 2>&1; then
alias dc='docker compose'
else
alias dc='docker-compose'
fi
alias d='docker'
alias dps='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dlog='docker logs -f'
alias colima-start='colima start --cpu 4 --memory 8 --disk 60'
# --- NPM ------------------------------------------------------------------
alias nrs='npm run start'
alias nrd='npm run dev'
alias nrb='npm run build'
alias nrt='npm run test'
alias ni='npm install'
alias nid='npm install --save-dev'
alias nig='npm install -g'
# --- Utilidades -----------------------------------------------------------
alias clima='curl wttr.in/Mexico+City'
mkcd() { mkdir -p "$1" && cd "$1"; }
extract() {
[[ ! -f "$1" ]] && echo "No es un archivo" && return 1
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar e "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "Formato no soportado: $1" ;;
esac
}
killport() {
[[ -z "$1" ]] && echo "Uso: killport <puerto>" && return 1
local pid
pid=$(lsof -ti:"$1" 2>/dev/null)
[[ -n "$pid" ]] && kill -9 "$pid" && echo "Proceso $pid detenido en puerto $1" || echo "Sin procesos en puerto $1"
}
serve() { python -m http.server "${1:-8000}"; }
# --- yt-dlp ---------------------------------------------------------------
export YTDLP_DIR="$HOME/videos/youtube"
mkdir -p "$YTDLP_DIR"/{audio,video} >/dev/null 2>&1
ytm() {
if [[ -z "$1" || "$1" == "-h" || "$1" == "--help" ]]; then
echo "Uso: ytm <url|busqueda> - Descarga audio MP3 en $YTDLP_DIR/audio"
return 0
fi
yt-dlp -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 \
--embed-metadata --embed-thumbnail \
-o "$YTDLP_DIR/audio/%(title).180s.%(ext)s" "$1"
}
ytv() {
if [[ -z "$1" ]]; then
echo "Uso: ytv <url|busqueda> [1080|720|480]" && return 1
fi
local quality="${2:-best}"
local fmt
case "$quality" in
1080) fmt='bv*[height<=1080][ext=mp4]+ba/b[height<=1080]' ;;
720) fmt='bv*[height<=720][ext=mp4]+ba/b[height<=720]' ;;
480) fmt='bv*[height<=480][ext=mp4]+ba/b[height<=480]' ;;
*) fmt='bv*[ext=mp4]+ba/b[ext=mp4]/b' ;;
esac
yt-dlp -f "$fmt" --embed-subs --embed-metadata --embed-thumbnail \
-o "$YTDLP_DIR/video/%(title).180s.%(ext)s" "$1"
}
ytls() {
echo "Audios recientes:"
ls -1t "$YTDLP_DIR/audio" 2>/dev/null | head -5 | sed 's/^/ /' || echo " (vacio)"
echo "Videos recientes:"
ls -1t "$YTDLP_DIR/video" 2>/dev/null | head -5 | sed 's/^/ /' || echo " (vacio)"
}
# --- SSH Agent ------------------------------------------------------------
if [[ -z "$SSH_AUTH_SOCK" ]]; then
export SSH_AGENT_DIR="$HOME/.ssh/agent"
mkdir -p "$SSH_AGENT_DIR"
SSH_ENV="$SSH_AGENT_DIR/env"
start_agent() {
ssh-agent >"$SSH_ENV"
chmod 600 "$SSH_ENV"
source "$SSH_ENV" >/dev/null
}
if [[ -f "$SSH_ENV" ]]; then
source "$SSH_ENV" >/dev/null
ps -p "$SSH_AGENT_PID" >/dev/null 2>&1 || start_agent
else
start_agent
fi
fi
alias ssh-list='ssh-add -l'
alias ssh-clear='ssh-add -D'
alias ssh-github='ssh -T git@github.com'
# --- zoxide ---------------------------------------------------------------
if command -v zoxide >/dev/null 2>&1; then
eval "$(zoxide init zsh)"
alias zz='z -'
alias zi='zi'
fi
# --- Historial ------------------------------------------------------------
HISTFILE="$HOME/.zsh_history"
HISTSIZE=100000
SAVEHIST=100000
setopt APPEND_HISTORY SHARE_HISTORY HIST_IGNORE_DUPS HIST_IGNORE_ALL_DUPS HIST_IGNORE_SPACE AUTO_CD EXTENDED_GLOB
stty -ixon 2>/dev/null
# --- Completions Extras ---------------------------------------------------
if command -v kubectl >/dev/null 2>&1; then
source <(kubectl completion zsh)
fi
if command -v docker >/dev/null 2>&1; then
source <(docker completion zsh)
fi
# --- Ayuda rapida ---------------------------------------------------------
vanity_help() {
cat <<EOF
Comandos claves:
colima-start - Arranca el daemon Docker (sin Desktop)
ytv / ytm / ytls - Descargas con yt-dlp
venv create/on/off - Manejo rapido de entornos Python
mkcd / extract / killport / serve - Utilidades basicas
reload - Recarga este archivo
EOF EOF
} }
alias help='vanity_help'
echo "[Vanity Shell] Ejecuta 'help' para ver los comandos principales."

View File

@@ -1,6 +1,6 @@
# VanityOS Shell — macOS Developer Setup 🚀 # VanityOS Shell — macOS Developer Setup 🚀
Automatiza en pocos minutos un entorno de desarrollo moderno para macOS. VanityOS Shell instala Zsh optimizado, Oh My Posh, utilidades CLI esenciales, Docker Desktop con Portainer y Lazydocker, dejando tu `.zshrc` listo para trabajar. Automatiza en pocos minutos un entorno de desarrollo moderno para macOS. VanityOS Shell instala Zsh optimizado, Oh My Posh, utilidades CLI esenciales, Docker CLI (sin Desktop) con Colima, Portainer y Lazydocker, dejando tu `.zshrc` listo para trabajar.
--- ---
@@ -10,7 +10,7 @@ Automatiza en pocos minutos un entorno de desarrollo moderno para macOS. VanityO
- Oh My Posh (tema Catppuccin) + fuente Meslo Nerd Font. - Oh My Posh (tema Catppuccin) + fuente Meslo Nerd Font.
- Node.js, Python, Git, direnv y herramientas base de terminal. - Node.js, Python, Git, direnv y herramientas base de terminal.
- yt-dlp + ffmpeg para descargas directas desde YouTube (video y audio). - yt-dlp + ffmpeg para descargas directas desde YouTube (video y audio).
- Docker Desktop, Lazydocker y despliegue automático de Portainer CE. - Docker CLI, Colima, Lazydocker y despliegue automático de Portainer CE.
- Archivo `.zshrc` documentado para seguir personalizando tu shell. - Archivo `.zshrc` documentado para seguir personalizando tu shell.
## ✅ Requisitos previos ## ✅ Requisitos previos
@@ -31,9 +31,9 @@ El script muestra un menú para elegir qué componentes instalar.
## 🧩 Opciones del menú ## 🧩 Opciones del menú
| Opción | Descripción | Incluye | | Opción | Descripción | Incluye |
|--------|-------------|---------| |--------|-------------|---------|
| `A` | Instalación completa (recomendada). | Homebrew + stack Zsh + Docker/Portainer/Lazydocker. | | `A` | Instalación completa (recomendada). | Homebrew + stack Zsh + Docker CLI/Colima/Portainer/Lazydocker. |
| `C` | Solo configura la terminal. | Homebrew + Zsh, Oh My Zsh, Oh My Posh, utilidades CLI. | | `C` | Solo configura la terminal. | Homebrew + Zsh, Oh My Zsh, Oh My Posh, utilidades CLI. |
| `D` | Solo herramientas de contenedores. | Homebrew + Docker Desktop, Portainer, Lazydocker. | | `D` | Solo herramientas de contenedores. | Homebrew + Docker CLI, Colima, Portainer, Lazydocker. |
| `Q` | Salir. | — | | `Q` | Salir. | — |
## 🔧 Detalles de la configuración Zsh ## 🔧 Detalles de la configuración Zsh
@@ -44,13 +44,14 @@ El script muestra un menú para elegir qué componentes instalar.
- Genera los directorios `~/videos/youtube` y `~/musica/youtube` y define alias listos para descargar con `ytv <url>` (video completo) y `ytm <url>` (solo audio MP3). - Genera los directorios `~/videos/youtube` y `~/musica/youtube` y define alias listos para descargar con `ytv <url>` (video completo) y `ytm <url>` (solo audio MP3).
- Añade un comando `help` dentro de Zsh que describe el uso de estos alias. - Añade un comando `help` dentro de Zsh que describe el uso de estos alias.
## 🐳 Stack Docker + Portainer ## 🐳 Stack Docker + Portainer (sin Desktop)
1. Instala Docker Desktop via Homebrew Cask. 1. Instala el Docker CLI oficial (`brew install docker docker-buildx docker-compose`).
2. Inicia la app automáticamente y espera a que el daemon esté listo. 2. Instala Colima, que levanta el daemon de Docker usando Hypervisor.framework.
3. Instala Lazydocker (`brew install lazydocker`). 3. Intenta iniciar Colima automáticamente con `colima start --cpu 4 --memory 8 --disk 60`.
4. Lanza Portainer CE con los puertos `8000` y `9443`. Acceso: `https://localhost:9443`. 4. Instala Lazydocker (`brew install lazydocker`).
5. Despliega Portainer CE con los puertos `8000` y `9443`. Acceso: `https://localhost:9443`.
> Si Docker Desktop aún no ha terminado de iniciar, el script dejará Portainer pendiente y te indicará que abras la app manualmente y ejecutes de nuevo la opción `D`. > Si Colima no logra iniciar (por ejemplo, porque falta el permiso de virtualización), el script salta Portainer y te recuerda ejecutar `colima start` manualmente antes de volver a elegir la opción `D`.
## ✅ Verificación rápida ## ✅ Verificación rápida
- Recargar Zsh: `source ~/.zshrc` - Recargar Zsh: `source ~/.zshrc`
@@ -69,14 +70,14 @@ El script muestra un menú para elegir qué componentes instalar.
## ❗️ Solución de problemas ## ❗️ Solución de problemas
- **“command not found: brew”**: ejecuta `eval "$(/opt/homebrew/bin/brew shellenv)"` (o `/usr/local/bin/brew`) y vuelve a correr la opción deseada. - **“command not found: brew”**: ejecuta `eval "$(/opt/homebrew/bin/brew shellenv)"` (o `/usr/local/bin/brew`) y vuelve a correr la opción deseada.
- **Docker no arranca**: abre manualmente Docker Desktop desde Launchpad y espera a que el icono indique “Running” antes de reintentar la opción `D`. - **Docker no arranca**: ejecuta `colima start` (o `colima status` para verificar) y vuelve a lanzar la opción `D` cuando `docker info` funcione.
- **Oh My Posh sin fuente correcta**: instala Meslo manualmente desde `~/Library/Fonts` o selecciona *Meslo LG S DZ Nerd Font* en tu terminal. - **Oh My Posh sin fuente correcta**: instala Meslo manualmente desde `~/Library/Fonts` o selecciona *Meslo LG S DZ Nerd Font* en tu terminal.
- **Conflictos con un `.zshrc` previo**: el instalador hace backup implícito sobrescribiendo `~/.zshrc`. Asegúrate de versionar tu archivo antes si necesitas conservarlo. - **Conflictos con un `.zshrc` previo**: el instalador hace backup implícito sobrescribiendo `~/.zshrc`. Asegúrate de versionar tu archivo antes si necesitas conservarlo.
## 🧽 Desinstalación rápida ## 🧽 Desinstalación rápida
- Elimina Portainer: `docker stop portainer && docker rm portainer && docker volume rm portainer_data`. - Elimina Portainer: `docker stop portainer && docker rm portainer && docker volume rm portainer_data`.
- Borra la config Zsh (opcional): `rm -rf ~/.oh-my-zsh ~/.poshthemes ~/.zshrc`. - Borra la config Zsh (opcional): `rm -rf ~/.oh-my-zsh ~/.poshthemes ~/.zshrc`.
- Desinstala apps con Homebrew: `brew uninstall --cask docker` o `brew uninstall lazydocker oh-my-posh`. - Desinstala apps con Homebrew: `brew uninstall docker colima lazydocker oh-my-posh`.
## 📄 Licencia ## 📄 Licencia
Distribuido bajo la licencia MIT. Consulta `LICENSE` para más detalles. Distribuido bajo la licencia MIT. Consulta `LICENSE` para más detalles.

View File

@@ -136,19 +136,43 @@ ensure_docker_daemon() {
fi fi
echo "No se detectó un demonio de Docker en ejecución." >&2 echo "No se detectó un demonio de Docker en ejecución." >&2
echo "Asegúrate de tener un entorno Docker corriendo (Docker Desktop, Colima, OrbStack, etc)." >&2 echo "Asegúrate de tener un entorno Docker corriendo (Colima, OrbStack, Docker Desktop, etc)." >&2
return 1 return 1
} }
ensure_colima_daemon() {
if ensure_docker_daemon; then
return 0
fi
if ! command -v colima >/dev/null 2>&1; then
echo "Colima no está instalado; no se puede iniciar un daemon Docker automáticamente." >&2
return 1
fi
if colima status >/dev/null 2>&1; then
docker context use colima >/dev/null 2>&1 || true
else
echo "Iniciando daemon de Docker con Colima…"
if ! colima start --cpu 4 --memory 8 --disk 60; then
echo "No se pudo iniciar Colima automáticamente; ejecútalo manualmente con 'colima start'." >&2
return 1
fi
fi
sleep 2
docker context use colima >/dev/null 2>&1 || true
ensure_docker_daemon
return $?
}
install_docker_stack() { install_docker_stack() {
echo "Instalando Docker CLI..." echo "Instalando Docker CLI y utilidades…"
brew install docker brew install docker docker-buildx docker-compose lazydocker colima
echo "Instalando Lazydocker…" if ! ensure_colima_daemon; then
brew install lazydocker echo "Se omitió Portainer porque no hay un daemon Docker en ejecución." >&2
echo "Sugerencia: inicia Colima manualmente con 'colima start' y vuelve a ejecutar la opción D." >&2
if ! ensure_docker_daemon; then
echo "Se omitió Portainer porque Docker no está operativo."
return return
fi fi