Skip to content

Instantly share code, notes, and snippets.

@ryanmoralesaz
Last active December 25, 2025 01:07
Show Gist options
  • Select an option

  • Save ryanmoralesaz/7a8ea34c7cf1054666326e07b8dc836e to your computer and use it in GitHub Desktop.

Select an option

Save ryanmoralesaz/7a8ea34c7cf1054666326e07b8dc836e to your computer and use it in GitHub Desktop.
ubuntu-dev-learning-server-install-script
#!/bin/bash
# Complete installation script for teaching server
set -e # Exit on any error
echo "=== Checking disk usage BEFORE installation ==="
df -h / | grep -v Filesystem
du -sh /usr /var /home 2>/dev/null || true
echo ""
echo "=== Starting installation ==="
# Update system
echo "Updating system packages..."
sudo apt update && sudo apt upgrade -y
# Core system tools
echo "Installing core tools..."
sudo apt install -y tmux git curl wget htop build-essential unzip zsh
# Neovim 0.10+ (from unstable PPA)
echo "Installing Neovim 0.10+..."
sudo add-apt-repository ppa:neovim-ppa/unstable -y
sudo apt update
sudo apt install -y neovim
# Podman (rootless containers)
echo "Installing Podman..."
sudo apt install -y podman podman-compose
# Apache + PHP + Laravel extensions
echo "Installing Apache + PHP + extensions..."
sudo apt install -y \
apache2 \
php \
libapache2-mod-php \
php-cli \
php-mbstring \
php-xml \
php-bcmath \
php-curl \
php-zip \
php-sqlite3 \
php-mysql \
php-pgsql \
php-gd
# Composer (Laravel/PHP package manager)
echo "Installing Composer..."
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
# Enable Apache mod_rewrite
echo "Configuring Apache..."
sudo a2enmod rewrite
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
sudo systemctl restart apache2
# Node.js (latest LTS)
echo "Installing Node.js..."
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Deno
echo "Installing Deno..."
curl -fsSL https://deno.land/install.sh | sh
sudo mv ~/.deno/bin/deno /usr/local/bin/
# Rust
echo "Installing Rust..."
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
sudo cp ~/.cargo/bin/* /usr/local/bin/
# Zig 0.16 dev
echo "Installing Zig..."
wget https://ziglang.org/builds/zig-x86_64-linux-0.16.0-dev.1657+985a3565c.tar.xz
tar -xf zig-x86_64-linux-0.16.0-dev.1657+985a3565c.tar.xz
sudo mv zig-x86_64-linux-0.16.0-dev.1657+985a3565c/zig /usr/local/bin/
sudo mv zig-x86_64-linux-0.16.0-dev.1657+985a3565c/lib /usr/local/lib/zig
rm -rf zig-x86_64-linux*
# Disk quota tools
echo "Installing quota tools..."
sudo apt install -y quota
# Oh My Zsh (for ubuntu user)
echo "Installing Oh My Zsh..."
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
sudo chsh -s $(which zsh) ubuntu
# Global Neovim config
echo "Installing global Neovim config..."
sudo git clone -b hetzner https://github.com/ryanmoralesaz/neovim-setup.git /etc/xdg/nvim
sudo chmod -R 755 /etc/xdg/nvim
echo ""
echo "=== Installation complete! ==="
echo ""
echo "Installed versions:"
echo "- Neovim: $(nvim --version | head -n1)"
echo "- Composer: $(composer --version 2>/dev/null | head -n1)"
echo "- PHP: $(php -v | head -n 1)"
echo "- Node: $(node -v)"
echo "- npm: $(npm -v)"
echo "- Deno: $(deno --version | head -n1)"
echo "- Rust: $(rustc --version)"
echo "- Zig: $(zig version)"
echo "- Podman: $(podman --version)"
echo ""
echo "=== Checking disk usage AFTER installation ==="
df -h / | grep -v Filesystem
du -sh /usr /var /home 2>/dev/null || true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment