#!/bin/bash # Обновление кода из админки (git pull + npm + перезапуск shop) # Запуск: bash scripts/admin-web-update.sh # С www-data: ADMIN_UPDATE_USE_SUDO=1 + sudoers NOPASSWD на этот скрипт set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=shop-root.sh source "$SCRIPT_DIR/shop-root.sh" PORT="${PORT:-3000}" REPO_OWNER="${SHOP_GIT_USER:-$(stat -c '%U' "$SHOP_ROOT/.git" 2>/dev/null || stat -c '%U' "$SHOP_ROOT" 2>/dev/null || echo root)}" ensure_git_safe() { local user="$1" if [ -z "$user" ]; then return; fi if [ "$(id -u)" -eq 0 ]; then sudo -u "$user" git config --global --add safe.directory "$SHOP_ROOT" 2>/dev/null || true else git config --global --add safe.directory "$SHOP_ROOT" 2>/dev/null || true fi } run_as_owner() { local cmd="$1" if [ "$(id -u)" -eq 0 ] && [ "$(whoami)" != "$REPO_OWNER" ]; then sudo -u "$REPO_OWNER" env SHOP_ROOT="$SHOP_ROOT" bash -c "cd \"$SHOP_ROOT\" && $cmd" else bash -c "cd \"$SHOP_ROOT\" && $cmd" fi } ensure_git_safe "$REPO_OWNER" ensure_git_safe "$(whoami)" echo "=== Обновление Shop (админка) ===" echo "Каталог: $SHOP_ROOT" echo "Git от пользователя: $REPO_OWNER (текущий: $(whoami))" if [ ! -d .git ]; then echo "Ошибка: нет .git в $SHOP_ROOT" exit 1 fi echo "" echo "Текущая версия:" run_as_owner "git log -1 --oneline" echo "" echo "--- git sync ---" run_as_owner "bash scripts/git-sync.sh" echo "" echo "--- npm install ---" run_as_owner "npm install --omit=dev" echo "" echo "Новая версия:" run_as_owner "git log -1 --oneline" echo "" echo "--- перезапуск shop ---" if command -v systemctl >/dev/null 2>&1 && systemctl cat shop.service >/dev/null 2>&1; then if systemctl restart shop; then sleep 2 if curl -sf "http://127.0.0.1:${PORT}/health" >/dev/null; then echo "OK: служба shop перезапущена, /health отвечает" else echo "WARN: shop перезапущен, но /health не ответил — journalctl -u shop -n 40" fi else echo "WARN: systemctl restart shop не удался. Выполните от root: systemctl restart shop" exit 1 fi else echo "INFO: служба shop не найдена — перезапустите Node вручную" fi echo "" echo "Готово."