diff --git a/server/docker-installer.sh b/server/docker-installer.sh new file mode 100644 index 0000000..1f7abfd --- /dev/null +++ b/server/docker-installer.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Installs Docker Engine + Docker Compose plugin on Ubuntu/Debian or RHEL-like (CentOS/Rocky/Alma). +# Adds a user to the "docker" group (so they can run docker without sudo). +# +# Usage: +# sudo ./install-docker.sh +# sudo ./install-docker.sh --user username +# sudo ./install-docker.sh --user username --no-docker-group +# +# Notes: +# - After adding a user to docker group, they must re-login (or run: newgrp docker). + +TARGET_USER="" +ADD_TO_DOCKER_GROUP="1" + +usage() { + cat <<'EOF' +Usage: + install-docker.sh [--user ] [--no-docker-group] + +Options: + --user Add this user to docker group (default: current sudo user if set) + --no-docker-group Do not add any user to docker group + -h, --help Show help +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --user) + [[ $# -ge 2 ]] || { echo "Missing value for --user" >&2; usage; exit 2; } + TARGET_USER="$2" + shift 2 + ;; + --no-docker-group) + ADD_TO_DOCKER_GROUP="0" + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage + exit 2 + ;; + esac +done + +if [[ "${EUID}" -ne 0 ]]; then + echo "Run as root (sudo)." >&2 + exit 1 +fi + +# Default user: the sudo invoker (if any), else empty +if [[ -z "${TARGET_USER}" && -n "${SUDO_USER:-}" && "${SUDO_USER}" != "root" ]]; then + TARGET_USER="${SUDO_USER}" +fi + +if command -v docker >/dev/null 2>&1; then + echo "Docker already installed: $(docker --version || true)" +fi + +detect_os() { + if [[ -r /etc/os-release ]]; then + # shellcheck disable=SC1091 + . /etc/os-release + echo "${ID:-unknown}" "${VERSION_CODENAME:-}" "${VERSION_ID:-}" + else + echo "unknown" "" "" + fi +} + +ID="" CODENAME="" VERSION_ID="" +read -r ID CODENAME VERSION_ID < <(detect_os) + +echo "Detected OS: ID=${ID} CODENAME=${CODENAME} VERSION_ID=${VERSION_ID}" + +setup_daemon_json() { + mkdir -p /etc/docker + if [[ ! -f /etc/docker/daemon.json ]]; then + cat > /etc/docker/daemon.json <<'JSON' +{ + "log-driver": "json-file", + "log-opts": { + "max-size": "10m", + "max-file": "3" + } +} +JSON + echo "Created /etc/docker/daemon.json (log rotation)." + else + echo "/etc/docker/daemon.json already exists; leaving as-is." + fi +} + +install_debian_ubuntu() { + apt-get update + apt-get -y install ca-certificates curl gnupg + + install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + chmod a+r /etc/apt/keyrings/docker.gpg + + ARCH="$(dpkg --print-architecture)" + CODENAME_LOCAL="${CODENAME}" + if [[ -z "${CODENAME_LOCAL}" ]]; then + CODENAME_LOCAL="$(. /etc/os-release && echo "${VERSION_CODENAME}")" + fi + + cat > /etc/apt/sources.list.d/docker.list </dev/null 2>&1; then + PM="dnf" + else + PM="yum" + fi + + $PM -y install yum-utils ca-certificates curl + + # Repo + yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + + $PM -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +} + +case "${ID}" in + ubuntu|debian) + install_debian_ubuntu + ;; + rhel|centos|fedora|rocky|almalinux) + install_rhel_like + ;; + *) + echo "Unsupported OS ID='${ID}'. Supported: ubuntu, debian, centos/rhel/rocky/almalinux/fedora" >&2 + exit 1 + ;; +esac + +setup_daemon_json + +systemctl enable docker +systemctl restart docker + +# docker group/user permissions +if ! getent group docker >/dev/null; then + groupadd docker || true +fi + +if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then + if id "${TARGET_USER}" >/dev/null 2>&1; then + usermod -aG docker "${TARGET_USER}" + echo "Added user '${TARGET_USER}' to group 'docker'." + else + echo "User '${TARGET_USER}' not found; skipping docker group assignment." >&2 + fi +fi + +echo +echo "=== Installed ===" +docker --version +docker compose version + +echo +echo "=== Service status ===" +systemctl --no-pager --full status docker | sed -n '1,25p' || true + +echo +if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then + echo "IMPORTANT: user '${TARGET_USER}' must re-login for docker group to apply." + echo "Quick test after relogin: docker run --rm hello-world" +else + echo "To use docker without sudo: add a user to docker group:" + echo " sudo usermod -aG docker && newgrp docker" +fi \ No newline at end of file