diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 72be33f..16a3179 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -5,7 +5,12 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${ROOT_DIR}" if ! command -v docker &>/dev/null; then - echo "Docker не найден. Сначала: sudo ./scripts/install-ubuntu.sh" + echo "Docker не найден. Сначала: sudo bash scripts/install-ubuntu.sh" + exit 1 +fi + +if ! docker compose version &>/dev/null; then + echo "Docker Compose plugin не найден." exit 1 fi @@ -25,7 +30,12 @@ docker compose up --build -d echo "" echo "Сервисы запущены." -echo " Магазин: http://$(hostname -I | awk '{print $1}')" -echo " Админка: http://$(hostname -I | awk '{print $1}')/admin/login" +IP=$(hostname -I | awk '{print $1}') +echo " Магазин: http://${IP}" +echo " Админка: http://${IP}/admin/login" +if [[ -f .env ]]; then + echo " Логин: $(grep '^ADMIN_EMAIL=' .env | cut -d= -f2-)" + echo " Пароль: $(grep '^ADMIN_PASSWORD=' .env | cut -d= -f2-)" +fi echo "" echo "Логи: docker compose logs -f" diff --git a/scripts/install-ubuntu.sh b/scripts/install-ubuntu.sh index b22b14b..1e02741 100644 --- a/scripts/install-ubuntu.sh +++ b/scripts/install-ubuntu.sh @@ -4,7 +4,7 @@ set -euo pipefail # Установка Docker и Docker Compose на Ubuntu 22.04 / 24.04 if [[ "${EUID}" -ne 0 ]]; then - echo "Запустите с sudo: sudo ./scripts/install-ubuntu.sh" + echo "Запустите с sudo: sudo bash scripts/install-ubuntu.sh" exit 1 fi @@ -13,41 +13,86 @@ if ! grep -qi ubuntu /etc/os-release 2>/dev/null; then exit 1 fi -export DEBIAN_FRONTEND=noninteractive +wait_for_apt() { + local max=600 waited=0 + while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 \ + || fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do + if [[ "${waited}" -eq 0 ]]; then + echo "Ожидание фонового обновления Ubuntu (unattended-upgrades)..." + echo "Это нормально, подождите 1–5 минут." + fi + sleep 5 + waited=$((waited + 5)) + if [[ "${waited}" -ge "${max}" ]]; then + echo "Таймаут 10 мин. Повторите позже: sudo bash scripts/install-ubuntu.sh" + exit 1 + fi + done + if [[ "${waited}" -gt 0 ]]; then + echo "Обновление завершено, продолжаем установку." + fi +} -apt-get update -apt-get install -y ca-certificates curl gnupg ufw +docker_ready() { + command -v docker &>/dev/null \ + && docker compose version &>/dev/null \ + && systemctl is-active --quiet docker 2>/dev/null +} -# Docker official repo -install -m 0755 -d /etc/apt/keyrings -if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg - chmod a+r /etc/apt/keyrings/docker.gpg +configure_firewall() { + if command -v ufw &>/dev/null; then + ufw allow OpenSSH >/dev/null 2>&1 || true + ufw allow 80/tcp >/dev/null 2>&1 || true + ufw allow 443/tcp >/dev/null 2>&1 || true + ufw --force enable >/dev/null 2>&1 || true + echo "Firewall (ufw): порты 22, 80, 443 открыты." + fi +} + +add_user_to_docker_group() { + local user_name="${SUDO_USER:-}" + if [[ -z "${user_name}" || "${user_name}" == "root" ]]; then + return + fi + if id "${user_name}" &>/dev/null; then + usermod -aG docker "${user_name}" + echo "Пользователь ${user_name} добавлен в группу docker." + echo "Перелогиньтесь или выполните: newgrp docker" + fi +} + +if docker_ready; then + echo "Docker уже установлен: $(docker --version)" + echo "Compose: $(docker compose version)" +else + export DEBIAN_FRONTEND=noninteractive + + wait_for_apt + apt-get update + apt-get install -y ca-certificates curl gnupg ufw + + install -m 0755 -d /etc/apt/keyrings + if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + chmod a+r /etc/apt/keyrings/docker.gpg + fi + + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${VERSION_CODENAME}") stable" \ + > /etc/apt/sources.list.d/docker.list + + wait_for_apt + apt-get update + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + + systemctl enable --now docker + echo "Docker установлен: $(docker --version)" + echo "Compose: $(docker compose version)" fi -echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "${VERSION_CODENAME}") stable" \ - > /etc/apt/sources.list.d/docker.list - -apt-get update -apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - -systemctl enable --now docker - -# Firewall -ufw allow OpenSSH -ufw allow 80/tcp -ufw allow 443/tcp -ufw --force enable - -SUDO_USER_NAME="${SUDO_USER:-$USER}" -if id "${SUDO_USER_NAME}" &>/dev/null; then - usermod -aG docker "${SUDO_USER_NAME}" - echo "Пользователь ${SUDO_USER_NAME} добавлен в группу docker." - echo "Перелогиньтесь или выполните: newgrp docker" -fi +configure_firewall +add_user_to_docker_group echo "" -echo "Docker установлен: $(docker --version)" -echo "Compose: $(docker compose version)" +echo "Готово. Запустите магазин: bash scripts/deploy.sh" diff --git a/setup.sh b/setup.sh index 8de3fa7..6e4973c 100644 --- a/setup.sh +++ b/setup.sh @@ -11,12 +11,16 @@ fi bash scripts/install-ubuntu.sh -REAL_USER="${SUDO_USER:-ubuntu}" -if id "${REAL_USER}" &>/dev/null; then - sudo -u "${REAL_USER}" bash scripts/deploy.sh +# root может запускать docker напрямую; обычный пользователь — через sudo -u +if [[ -n "${SUDO_USER:-}" ]] && [[ "${SUDO_USER}" != "root" ]] && id "${SUDO_USER}" &>/dev/null; then + sudo -u "${SUDO_USER}" bash scripts/deploy.sh else bash scripts/deploy.sh fi +IP=$(hostname -I | awk '{print $1}') echo "" -echo "Готово! Откройте http://$(hostname -I | awk '{print $1}')" +echo "Готово!" +echo " Магазин: http://${IP}" +echo " Админка: http://${IP}/admin/login" +echo " Пароль: grep ADMIN_PASSWORD .env"