#!/bin/bash # Обновление кода из админки (git pull + npm + перезапуск shop) # Запуск: bash scripts/admin-web-update.sh # С www-data часто нужен sudoers: NOPASSWD на этот скрипт (ADMIN_UPDATE_USE_SUDO=1) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=shop-root.sh source "$SCRIPT_DIR/shop-root.sh" RUN_USER="${SHOP_RUN_USER:-www-data}" PORT="${PORT:-3000}" run_in_shop() { local cmd="$1" if [ "$(id -u)" -eq 0 ] && [ "$(whoami)" != "$RUN_USER" ]; then sudo -u "$RUN_USER" env SHOP_ROOT="$SHOP_ROOT" bash -c "cd \"$SHOP_ROOT\" && $cmd" else bash -c "cd \"$SHOP_ROOT\" && $cmd" fi } ensure_git_safe() { git config --global --add safe.directory "$SHOP_ROOT" 2>/dev/null || true if [ "$(id -u)" -eq 0 ] && id "$RUN_USER" &>/dev/null; then sudo -u "$RUN_USER" git config --global --add safe.directory "$SHOP_ROOT" 2>/dev/null || true fi } ensure_git_safe echo "=== Обновление Shop (админка) ===" echo "Каталог: $SHOP_ROOT" echo "Пользователь для git/npm: $(id -un 2>/dev/null || echo ?)" if [ ! -d .git ]; then echo "Ошибка: нет .git в $SHOP_ROOT" exit 1 fi echo "" echo "Текущая версия:" git log -1 --oneline || true echo "" echo "--- git sync ---" run_in_shop "bash scripts/git-sync.sh" echo "" echo "--- npm install ---" run_in_shop "npm install --omit=dev" echo "" echo "Новая версия:" 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 вручную (pm2/npm start)" fi echo "" echo "Готово."