diff --git a/CLAUDE.md b/CLAUDE.md index 6ef44e6..d267340 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,6 +37,7 @@ Current modules in execution order: - `bootstrap` — installs `yq` and `age` (required by all other modules) - `ssh` — decrypts `secrets/sshKeys.tar.gz.age` with `age` and installs keys into `~/.ssh` - `registry` — reads `config/registry.yaml` and applies every entry (packages, dotfiles, services, drivers, audio) +- `docker` — installs Docker Engine, Docker Compose plugin, adds user to `docker` group, and installs Lazydocker - `thunderbird` — installs Thunderbird (snap) and restores profile from `secrets/thunderbirdProfile.zip` - `claudeCode` — configures the Anthropic apt repository and installs `claude-code` - `easyEffects` — restores EasyEffects config and presets from `secrets/easyEffectsConfig.zip` diff --git a/README.md b/README.md index 557c306..27aaab9 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ El orden está definido en `config/modules` (un módulo por línea, `#` para com | `bootstrap` | Instala `yq` y `age` (requeridos por los demás módulos) | | `ssh` | Descifra e instala claves SSH en `~/.ssh` | | `registry` | Aplica todo lo declarado en `config/registry.yaml` | +| `docker` | Instala Docker Engine, Docker Compose, agrega el usuario al grupo `docker` e instala Lazydocker | | `thunderbird` | Instala Thunderbird (snap) y restaura el perfil | | `claudeCode` | Configura el repositorio apt de Anthropic e instala `claude-code` | | `easyEffects` | Restaura configuración y presets de EasyEffects | diff --git a/config/modules b/config/modules index 3b98344..5ea1585 100644 --- a/config/modules +++ b/config/modules @@ -5,6 +5,7 @@ bootstrap ssh registry +docker thunderbird claudeCode easyEffects diff --git a/modules/docker.sh b/modules/docker.sh new file mode 100644 index 0000000..d95fe45 --- /dev/null +++ b/modules/docker.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$stpRoot/lib/log.sh" +source "$stpRoot/lib/utils.sh" + +readonly dockerKeyring="/etc/apt/keyrings/docker.asc" +readonly dockerSources="/etc/apt/sources.list.d/docker.list" + +dockerIsInstalled() { + util::cmdExists docker +} + +dockerRepositoryIsConfigured() { + [[ -f "$dockerSources" ]] +} + +userIsInDockerGroup() { + groups "$USER" | grep -qw docker +} + +lazydockerIsInstalled() { + util::cmdExists lazydocker +} + +latestGithubReleaseTag() { + local repository="$1" + curl -fsSL "https://api.github.com/repos/${repository}/releases/latest" \ + | grep '"tag_name"' \ + | cut -d'"' -f4 +} + +addDockerSigningKey() { + sudo install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ + | sudo tee "$dockerKeyring" > /dev/null + sudo chmod a+r "$dockerKeyring" + log::ok "Clave GPG de Docker instalada" +} + +addDockerRepository() { + local ubuntuCodename + ubuntuCodename="$(. /etc/os-release && echo "$VERSION_CODENAME")" + echo "deb [arch=amd64 signed-by=${dockerKeyring}] https://download.docker.com/linux/ubuntu ${ubuntuCodename} stable" \ + | sudo tee "$dockerSources" > /dev/null + sudo apt-get update -qq + log::ok "Repositorio Docker configurado para Ubuntu ${ubuntuCodename}" +} + +installDockerPackages() { + sudo apt-get install -y \ + docker-ce \ + docker-ce-cli \ + containerd.io \ + docker-buildx-plugin \ + docker-compose-plugin + log::ok "Docker Engine y Docker Compose instalados" +} + +addUserToDockerGroup() { + sudo usermod -aG docker "$USER" + log::ok "Usuario $USER agregado al grupo docker" + log::info "Cerrá sesión y volvé a entrar para usar Docker sin sudo" +} + +installLazydocker() { + local version versionNumber temporaryDirectory + version="$(latestGithubReleaseTag "jesseduffield/lazydocker")" + versionNumber="${version#v}" + temporaryDirectory="$(mktemp -d)" + trap 'rm -rf "$temporaryDirectory"' RETURN + curl -fsSL \ + "https://github.com/jesseduffield/lazydocker/releases/download/${version}/lazydocker_${versionNumber}_Linux_x86_64.tar.gz" \ + | tar -xz -C "$temporaryDirectory" + mkdir -p "$HOME/.local/bin" + mv "$temporaryDirectory/lazydocker" "$HOME/.local/bin/lazydocker" + log::ok "Lazydocker ${version} instalado en ~/.local/bin/" +} + +if dockerIsInstalled; then + log::info "Docker ya instalado: $(docker --version)" +else + log::info "Instalando Docker Engine..." + util::requireSudo + if ! dockerRepositoryIsConfigured; then + addDockerSigningKey + addDockerRepository + fi + installDockerPackages +fi + +if userIsInDockerGroup; then + log::info "Usuario $USER ya en el grupo docker" +else + util::requireSudo + addUserToDockerGroup +fi + +if lazydockerIsInstalled; then + log::info "Lazydocker ya instalado" +else + installLazydocker +fi