feat: add NixOS support, Go, and Ruby on Rails; remove Rust

- Add nixos/ directory with declarative flake.nix and home.nix for NixOS
- Make all setup scripts NixOS-aware with proper detection and early exit
- Update bashrc, zshrc, and aliases with Go, Ruby on Rails, and Nix profile paths
- Replace Rust/Cargo references in shell configs with rbenv/Ruby on Rails
- Update README with NixOS quick start and full documentation
This commit is contained in:
Blake Ridgway
2026-07-30 20:13:13 -05:00
parent 5efb3dab48
commit 0b1e7b7f51
11 changed files with 776 additions and 50 deletions

View File

@@ -3,6 +3,7 @@
# 00-system-prep.sh
# Updates system and sets up Flathub.
# Relies on DISTRO and PACKAGE_MANAGER being set by the caller.
# Supports NixOS, Fedora (dnf), and Debian/Ubuntu (apt).
echo "--- Starting System Preparation ---"
@@ -11,23 +12,32 @@ if [ -z "$DISTRO" ] || [ -z "$PACKAGE_MANAGER" ]; then
exit 1
fi
# Update system before installing packages
echo "Updating system packages..."
if [ "$PACKAGE_MANAGER" == "dnf" ]; then
sudo dnf update -y && sudo dnf upgrade -y
elif [ "$PACKAGE_MANAGER" == "apt" ]; then
sudo apt update && sudo apt upgrade -y
else
echo "WARNING: Unknown package manager '$PACKAGE_MANAGER'. Skipping system update."
# ── NixOS path: system updates are declarative via flake ──
if [ "$DISTRO" == "nixos" ]; then
echo "NixOS detected: system updates are managed declaratively via flake.nix."
echo "Run 'nixos-rebuild switch --flake ~/dotfiles/nixos#nixos' to apply changes."
echo "Skipping imperative system update."
fi
# Setup Flatpak
# ── Traditional distro path ────────────────────────────────
if [ "$DISTRO" != "nixos" ]; then
echo "Updating system packages..."
if [ "$PACKAGE_MANAGER" == "dnf" ]; then
sudo dnf update -y && sudo dnf upgrade -y
elif [ "$PACKAGE_MANAGER" == "apt" ]; then
sudo apt update && sudo apt upgrade -y
else
echo "WARNING: Unknown package manager '$PACKAGE_MANAGER'. Skipping system update."
fi
fi
# Setup Flatpak (works on NixOS too if enabled in flake.nix)
echo "Setting up Flathub repository..."
if command -v flatpak &> /dev/null; then
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
else
echo "WARNING: flatpak command not found. Skipping Flathub setup."
echo "Ensure Flatpak is installed via 01-package-install.sh or manually."
echo "Ensure Flatpak is installed via your package manager or flake.nix."
fi
echo "--- System Preparation Finished ---"

View File

@@ -3,6 +3,7 @@
# 01-package-install.sh
# Installs system packages and Flatpak applications.
# Relies on DISTRO and PACKAGE_MANAGER being set by the caller.
# Supports NixOS (nix profile), Fedora (dnf), and Debian/Ubuntu (apt).
echo "--- Starting Package Installation ---"
@@ -11,6 +12,26 @@ if [ -z "$DISTRO" ] || [ -z "$PACKAGE_MANAGER" ]; then
exit 1
fi
# ── NixOS path ─────────────────────────────────────────────
if [ "$DISTRO" == "nixos" ]; then
echo "NixOS detected: packages are managed declaratively via nixos/flake.nix"
echo "and nixos/home.nix. Run the main-setup.sh workflow or apply manually."
echo ""
echo " sudo nixos-rebuild switch --flake ~/dotfiles/nixos#nixos"
echo " home-manager switch --flake ~/dotfiles/nixos#blake"
echo ""
echo "If you want imperative ad-hoc packages, uncomment the lines below"
echo "or run manually:"
echo ""
echo " nix profile install nixpkgs#<package>"
echo ""
echo "Skipping imperative package installation."
echo "--- Package Installation Finished ---"
exit 0
fi
# ── Traditional distro path (Fedora / Ubuntu / Debian) ─────
# Define base package list
BASE_PACKAGE_LIST=(
ansible
@@ -127,7 +148,7 @@ done
if [ "$PACKAGE_MANAGER" == "apt" ] && command -v fdfind &>/dev/null && ! command -v fd &>/dev/null; then
if dpkg-query -W -f='${Status}' "fd-find" 2>/dev/null | grep -q "ok installed"; then
echo "Creating symlink for fd from fdfind..."
sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd
sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd
fi
fi

View File

@@ -2,9 +2,43 @@
# 02-dev-tools-setup.sh
# Installs various development tools and utilities.
# Supports NixOS (declarative via flake), Fedora, and Debian/Ubuntu.
# Relies on DISTRO and PACKAGE_MANAGER being set by the caller.
echo "--- Starting Development Tools Setup ---"
if [ -z "$DISTRO" ] || [ -z "$PACKAGE_MANAGER" ]; then
echo "ERROR: DISTRO and PACKAGE_MANAGER must be set in the environment."
exit 1
fi
# ── NixOS path ─────────────────────────────────────────────
if [ "$DISTRO" == "nixos" ]; then
echo "NixOS detected: development tools are managed declaratively"
echo "via nixos/flake.nix and nixos/home.nix."
echo ""
echo "The following packages are already configured in the flake:"
echo " - Go (go, gopls, delve)"
echo " - Ruby on Rails (ruby, bundler, rails, rbenv, nodejs)"
echo " - Python (python3, pip, virtualenv)"
echo " - Neovim (latest)"
echo " - Cloud/DevOps (kubectl, k9s, terraform, helm, awscli2)"
echo " - Other tools (oh-my-posh, fzf, bat, eza, ripgrep, fd)"
echo ""
echo "Run the main-setup.sh NixOS workflow or apply manually:"
echo ""
echo " sudo nixos-rebuild switch --flake ~/dotfiles/nixos#nixos"
echo " home-manager switch --flake ~/dotfiles/nixos#blake"
echo ""
echo "Skipping imperative dev tools setup."
echo "--- Development Tools Setup Finished ---"
exit 0
fi
# ═══════════════════════════════════════════════════════════
# TRADITIONAL DISTRO PATH (Fedora / Ubuntu / Debian / Pop)
# ═══════════════════════════════════════════════════════════
# Setup NVIM
echo "Setting up Neovim..."
_nvim_asset_name() {
@@ -140,21 +174,68 @@ else
echo "✔ Oh-My-Posh already installed: $(oh-my-posh --version | head -n1)"
fi
# Install Rust Up
echo "Installing Rust via rustup..."
if command -v rustc &>/dev/null; then
echo "Rust (rustc) already installed."
# ── Ruby on Rails ──────────────────────────────────────────
echo ""
echo "--- Setting up Ruby on Rails ---"
if ! command -v ruby &>/dev/null; then
echo "➤ Installing Ruby via rbenv..."
# Install rbenv
if [ ! -d "$HOME/.rbenv" ]; then
git clone https://github.com/rbenv/rbenv.git "$HOME/.rbenv"
git clone https://github.com/rbenv/ruby-build.git "$HOME/.rbenv/plugins/ruby-build"
echo 'export PATH="$PATH:$HOME/.rbenv/bin"' >> "$HOME/.bashrc"
echo 'export PATH="$PATH:$HOME/.rbenv/bin"' >> "$HOME/.zshrc"
echo 'eval "$(rbenv init -)"' >> "$HOME/.bashrc"
echo 'eval "$(rbenv init -)"' >> "$HOME/.zshrc"
echo "rbenv installed. A new shell is needed or run:"
echo " export PATH=\"\$PATH:\$HOME/.rbenv/bin\" && eval \"\$(rbenv init -)\""
else
echo "rbenv already installed."
fi
# Install Ruby latest stable via rbenv
export PATH="$PATH:$HOME/.rbenv/bin"
eval "$(rbenv init - bash 2>/dev/null || true)"
if command -v rbenv &>/dev/null; then
RUBY_LATEST=$(rbenv install -l 2>/dev/null | grep -v - | tail -1)
if [ -n "$RUBY_LATEST" ]; then
echo "➤ Installing Ruby ${RUBY_LATEST} (this may take a while)..."
rbenv install "$RUBY_LATEST"
rbenv global "$RUBY_LATEST"
echo "Ruby ${RUBY_LATEST} installed and set as global version."
fi
fi
else
# The -y flag automates the installation, --no-modify-path prevents it from altering .profile/.bashrc directly
# You'll need to source "$HOME/.cargo/env" or add it to your shell's config manually
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
echo "Rust installed via rustup. Source \"\$HOME/.cargo/env\" or add it to your shell config."
echo "For the current session, you can run: source \"\$HOME/.cargo/env\""
echo "✔ Ruby already installed: $(ruby --version 2>/dev/null | head -n1)"
fi
# Install Bundler
if command -v gem &>/dev/null; then
if ! command -v bundler &>/dev/null; then
echo "➤ Installing Bundler..."
gem install bundler
echo "Bundler installed."
else
echo "✔ Bundler already installed."
fi
# Install Rails
if ! command -v rails &>/dev/null; then
echo "➤ Installing Rails..."
gem install rails
rbenv rehash 2>/dev/null || true
echo "Rails installed."
else
echo "✔ Rails already installed: $(rails --version 2>/dev/null | head -n1)"
fi
fi
echo "--- Development Tools Setup Finished ---"
# --- Helm (Kubernetes package manager) ---
# ── Helm (Kubernetes package manager) ──────────────────────
echo ""
echo "--- Installing Helm ---"
if command -v helm &>/dev/null; then