From 42177555ac963df4310ae53a1d3d927c1eeda0b9 Mon Sep 17 00:00:00 2001 From: shop Date: Sun, 17 May 2026 13:14:06 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20server-update=20=D0=B8=D1=89=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D1=8C=20=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=20(=D0=B2=20=D1=82.=D1=87.=20/opt/shop/shop10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- README.md | 16 +++++++++++++--- deploy/shop.service | 5 +++-- scripts/diagnose-502.sh | 12 +++++++----- scripts/fix-db-connection.sh | 2 +- scripts/server-update.sh | 15 +++++++++++---- scripts/shop-root.sh | 33 +++++++++++++++++++++++++++++++++ wiki/Install-Native.md | 10 ++++++++-- wiki/Troubleshooting.md | 15 ++++++++++++++- 8 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 scripts/shop-root.sh diff --git a/README.md b/README.md index 9ab9c92..3b366a4 100644 --- a/README.md +++ b/README.md @@ -203,18 +203,28 @@ journalctl -u shop -n 5 --no-pager ## Обновление на сервере (git pull) +Каталог клона — там, где лежат `package.json` и `scripts/` (часто `/opt/shop` или `/opt/shop/shop10`): + ```bash -cd /opt/shop -git config --global --add safe.directory /opt/shop +cd /opt/shop/shop10 # ваш путь к репозиторию +git config --global --add safe.directory "$(pwd)" bash scripts/server-update.sh ``` +Или одной командой (путь к скрипту в вашем клоне): + +```bash +bash /opt/shop/shop10/scripts/server-update.sh +``` + +Скрипт сам найдёт корень репозитория. В `deploy/shop.service` поле `WorkingDirectory` должно указывать на тот же каталог. + Скрипт: `git pull` → `npm install` → проверка PostgreSQL → `restart shop` → `curl /health` → `reload caddy`. Вручную: ```bash -cd /opt/shop +cd /opt/shop/shop10 git pull npm install --omit=dev systemctl restart shop diff --git a/deploy/shop.service b/deploy/shop.service index a075f66..3829616 100644 --- a/deploy/shop.service +++ b/deploy/shop.service @@ -7,8 +7,9 @@ Wants=postgresql.service Type=simple User=www-data Group=www-data -WorkingDirectory=/opt/shop -EnvironmentFile=/opt/shop/.env +# Путь к клону (package.json): /opt/shop или /opt/shop/shop10 +WorkingDirectory=/opt/shop/shop10 +EnvironmentFile=/opt/shop/shop10/.env # Дождаться PostgreSQL (запуск от root, +) ExecStartPre=+/bin/bash -c 'for i in $(seq 1 60); do pg_isready -h 127.0.0.1 -p 5432 -q && exit 0; sleep 1; done; echo "PostgreSQL не отвечает на 127.0.0.1:5432"; exit 1' ExecStart=/usr/bin/node src/server.js diff --git a/scripts/diagnose-502.sh b/scripts/diagnose-502.sh index c3ae0d8..2466153 100644 --- a/scripts/diagnose-502.sh +++ b/scripts/diagnose-502.sh @@ -2,7 +2,9 @@ # Диагностика HTTP 502 (Caddy не достучался до Node / БД) set -e -echo "=== Shop / Caddy 502 diagnostic ===" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/shop-root.sh" 2>/dev/null || SHOP_ROOT=/opt/shop + +echo "=== Shop / Caddy 502 diagnostic ($SHOP_ROOT) ===" echo echo "1. PostgreSQL" @@ -40,11 +42,11 @@ fi echo echo "6. .env" -if [ -f /opt/shop/.env ]; then - grep -E '^(DATABASE_URL|HOST|PORT)=' /opt/shop/.env 2>/dev/null | sed 's/=.*/=***/' || true - grep -E '^DATABASE_URL=' /opt/shop/.env || echo " DATABASE_URL не задан" +if [ -f "$SHOP_ROOT/.env" ]; then + grep -E '^(DATABASE_URL|HOST|PORT)=' "$SHOP_ROOT/.env" 2>/dev/null | sed 's/=.*/=***/' || true + grep -E '^DATABASE_URL=' "$SHOP_ROOT/.env" || echo " DATABASE_URL не задан" else - echo " /opt/shop/.env не найден" + echo " $SHOP_ROOT/.env не найден" fi echo diff --git a/scripts/fix-db-connection.sh b/scripts/fix-db-connection.sh index c0c7587..1723719 100644 --- a/scripts/fix-db-connection.sh +++ b/scripts/fix-db-connection.sh @@ -2,7 +2,7 @@ # Быстрое исправление ECONNREFUSED 127.0.0.1:5432 set -euo pipefail -cd /opt/shop 2>/dev/null || cd "$(dirname "$0")/.." +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/shop-root.sh" echo "=== Исправление подключения к PostgreSQL ===" diff --git a/scripts/server-update.sh b/scripts/server-update.sh index fe4e103..475b1b9 100644 --- a/scripts/server-update.sh +++ b/scripts/server-update.sh @@ -1,10 +1,16 @@ #!/bin/bash -# Обновление на сервере (запускать от root в /opt/shop) +# Обновление на сервере: git pull, npm, restart shop +# Запуск из любого места: +# bash /opt/shop/shop10/scripts/server-update.sh +# cd /opt/shop/shop10 && bash scripts/server-update.sh set -euo pipefail -cd /opt/shop +# shellcheck source=shop-root.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/shop-root.sh" -git config --global --add safe.directory /opt/shop 2>/dev/null || true +echo "=== Shop update: $SHOP_ROOT ===" + +git config --global --add safe.directory "$SHOP_ROOT" 2>/dev/null || true git pull npm install --omit=dev @@ -31,5 +37,6 @@ if systemctl is-active --quiet shop 2>/dev/null; then systemctl reload caddy 2>/dev/null || true echo "OK" else - echo "Служба shop не установлена. См. deploy/shop.service в README." + echo "Служба shop не установлена. См. deploy/shop.service" + echo "WorkingDirectory в unit должен совпадать с: $SHOP_ROOT" fi diff --git a/scripts/shop-root.sh b/scripts/shop-root.sh new file mode 100644 index 0000000..6a578c6 --- /dev/null +++ b/scripts/shop-root.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Каталог репозитория (где package.json). Переопределение: SHOP_ROOT=/path +_resolve_shop_root() { + if [ -n "${SHOP_ROOT:-}" ] && [ -f "${SHOP_ROOT}/package.json" ]; then + return 0 + fi + local here + here="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + if [ -f "${here}/package.json" ]; then + SHOP_ROOT="$here" + return 0 + fi + if [ -f /opt/shop/shop10/package.json ]; then + SHOP_ROOT=/opt/shop/shop10 + return 0 + fi + if [ -f /opt/shop/package.json ]; then + SHOP_ROOT=/opt/shop + return 0 + fi + return 1 +} + +if ! _resolve_shop_root; then + echo "Ошибка: не найден каталог Shop (нет package.json)." + echo "Перейдите в каталог клона и запустите:" + echo " bash scripts/server-update.sh" + echo "Или задайте: SHOP_ROOT=/opt/shop/shop10 bash scripts/server-update.sh" + exit 1 +fi + +export SHOP_ROOT +cd "$SHOP_ROOT" diff --git a/wiki/Install-Native.md b/wiki/Install-Native.md index adde46b..2053e64 100644 --- a/wiki/Install-Native.md +++ b/wiki/Install-Native.md @@ -195,11 +195,17 @@ systemctl daemon-reload ## 10. Обновление ```bash -cd /opt/shop -git config --global --add safe.directory /opt/shop +cd /opt/shop/shop10 +git config --global --add safe.directory "$(pwd)" bash scripts/server-update.sh ``` +Если клон в `/opt/shop` без подкаталога — используйте `/opt/shop`. Скрипт ищет `package.json` автоматически; можно запустить так: + +```bash +bash /opt/shop/shop10/scripts/server-update.sh +``` + Или вручную: ```bash diff --git a/wiki/Troubleshooting.md b/wiki/Troubleshooting.md index 139feef..2e66059 100644 --- a/wiki/Troubleshooting.md +++ b/wiki/Troubleshooting.md @@ -3,9 +3,22 @@ ## Диагностика одной командой ```bash -bash /opt/shop/scripts/diagnose-502.sh +bash /opt/shop/shop10/scripts/diagnose-502.sh ``` +(замените путь на каталог вашего клона — где есть `package.json`) + +## scripts/server-update.sh: No such file or directory + +Вы не в каталоге репозитория или клон в подпапке (например `/opt/shop/shop10`): + +```bash +ls /opt/shop/shop10/package.json +bash /opt/shop/shop10/scripts/server-update.sh +``` + +В `deploy/shop.service` укажите тот же путь в `WorkingDirectory` и `EnvironmentFile`. + --- ## HTTP 502 (Caddy / браузер)