Created
February 25, 2026 17:55
-
-
Save paulweezydesign/982ece73a08633584b3ab4975016d27b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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