Skip to content

Instantly share code, notes, and snippets.

@paulweezydesign
Created February 25, 2026 17:55
Show Gist options
  • Select an option

  • Save paulweezydesign/982ece73a08633584b3ab4975016d27b to your computer and use it in GitHub Desktop.

Select an option

Save paulweezydesign/982ece73a08633584b3ab4975016d27b to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -euo pipefail
# Installs on Ubuntu:
# - Docker Engine + Compose plugin
# - MongoDB Community Edition (7.0)
# - Redis
# - PostgreSQL
# - nvm (plus latest LTS Node)
# - Astral uv
#
# Usage:
# chmod +x setup-dev-stack.sh
# ./setup-dev-stack.sh
if ! command -v apt-get >/dev/null 2>&1; then
echo "This script supports Ubuntu/Debian systems with apt-get."
exit 1
fi
if [[ -f /etc/os-release ]]; then
# shellcheck disable=SC1091
. /etc/os-release
if [[ "${ID:-}" != "ubuntu" ]]; then
echo "This script is intended for Ubuntu. Detected ID=${ID:-unknown}."
exit 1
fi
fi
if [[ "${EUID}" -eq 0 ]]; then
SUDO=""
TARGET_USER="${SUDO_USER:-root}"
else
SUDO="sudo"
TARGET_USER="${USER}"
fi
if [[ -z "${TARGET_USER}" || "${TARGET_USER}" == "root" ]]; then
echo "Warning: nvm/uv will install for root. Run as a normal user for best results."
fi
run_as_target_user() {
if [[ "${TARGET_USER}" == "root" ]]; then
bash -lc "$1"
else
sudo -u "${TARGET_USER}" bash -lc "$1"
fi
}
echo "==> Installing apt prerequisites"
${SUDO} apt-get update
${SUDO} apt-get install -y ca-certificates curl gnupg lsb-release software-properties-common apt-transport-https
echo "==> Setting up Docker repository"
${SUDO} install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | ${SUDO} gpg --dearmor -o /etc/apt/keyrings/docker.gpg
${SUDO} chmod a+r /etc/apt/keyrings/docker.gpg
ARCH="$(dpkg --print-architecture)"
UBUNTU_CODENAME="$(. /etc/os-release && echo "${VERSION_CODENAME}")"
echo \
"deb [arch=${ARCH} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${UBUNTU_CODENAME} stable" \
| ${SUDO} tee /etc/apt/sources.list.d/docker.list >/dev/null
echo "==> Setting up MongoDB repository"
${SUDO} install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | ${SUDO} gpg --dearmor -o /etc/apt/keyrings/mongodb-server-7.0.gpg
${SUDO} chmod a+r /etc/apt/keyrings/mongodb-server-7.0.gpg
MONGO_CODENAME="${UBUNTU_CODENAME}"
case "${UBUNTU_CODENAME}" in
focal|jammy|noble) ;;
*)
echo "Warning: MongoDB repo may not support ${UBUNTU_CODENAME}; defaulting to jammy repo."
MONGO_CODENAME="jammy"
;;
esac
echo \
"deb [ arch=${ARCH} signed-by=/etc/apt/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu ${MONGO_CODENAME}/mongodb-org/7.0 multiverse" \
| ${SUDO} tee /etc/apt/sources.list.d/mongodb-org-7.0.list >/dev/null
echo "==> Installing Docker, MongoDB, Redis, PostgreSQL"
${SUDO} apt-get update
${SUDO} apt-get install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
mongodb-org redis-server postgresql postgresql-contrib
echo "==> Enabling and starting services"
${SUDO} systemctl enable --now docker
${SUDO} systemctl enable --now mongod
${SUDO} systemctl enable --now redis-server
${SUDO} systemctl enable --now postgresql
if id -nG "${TARGET_USER}" | tr ' ' '\n' | rg -xq docker; then
echo "==> ${TARGET_USER} is already in docker group"
else
echo "==> Adding ${TARGET_USER} to docker group"
${SUDO} usermod -aG docker "${TARGET_USER}"
fi
echo "==> Installing nvm for ${TARGET_USER}"
run_as_target_user "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash"
run_as_target_user "export NVM_DIR=\"\$HOME/.nvm\" && [ -s \"\$NVM_DIR/nvm.sh\" ] && . \"\$NVM_DIR/nvm.sh\" && nvm install --lts && nvm alias default lts/*"
echo "==> Installing Astral uv for ${TARGET_USER}"
run_as_target_user "curl -LsSf https://astral.sh/uv/install.sh | sh"
echo
echo "Installation complete."
echo "- Re-login (or run: newgrp docker) before using Docker without sudo."
echo "- Open a new shell so nvm/uv are loaded."
echo
echo "Quick checks:"
echo " docker --version"
echo " docker compose version"
echo " mongod --version"
echo " redis-server --version"
echo " psql --version"
echo " bash -lc 'source ~/.nvm/nvm.sh && node -v && npm -v'"
echo " uv --version"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment