From 76eef6fece1fc2a98fda998e036e36aee6198cd1 Mon Sep 17 00:00:00 2001 From: savsis Date: Thu, 10 Sep 2026 22:57:49 +0500 Subject: [PATCH] =?UTF-8?q?cli:=20mbs=20update=20=E2=80=94=20safe=20git=20?= =?UTF-8?q?pull=20with=20syntax=20check=20+=20auto-rollback=20on=20failure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 --- README.md | 3 +++ mbs | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/README.md b/README.md index 4f9e555..1836b48 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,11 @@ mbs status статус bot / api / xray / nginx mbs restart перезапустить bot + api mbs logs [bot|api|xray] последние строки лога (по умолчанию api) mbs domain текущий домен панели +mbs update обновить код с GitHub и перезапустить ``` +`mbs update` тянет `git pull` (только fast-forward — если на сервере что-то правили руками, честно откажется и не полезет мержить), ставит зависимости, **проверяет, что новый код вообще компилируется**, и только потом перезапускает. Если после рестарта `mbs-bot`/`mbs-api` не поднялись — сам откатывает на предыдущий коммит и поднимает его. `.env` и база (`mbs.db`) не в гите — их не тронет ни при каком раскладе. + ## Добавление ноды В панели: Ноды → Добавить ноду → выбираешь страну, протоколы (Reality-транспорты всегда включены, WS+TLS и Hysteria2 — опционально) → получаешь команду вида: diff --git a/mbs b/mbs index f25734a..c17b209 100644 --- a/mbs +++ b/mbs @@ -13,6 +13,7 @@ mbs — управление MBS Panel mbs restart перезапустить bot + api mbs logs [bot|api|xray] последние строки лога (по умолчанию api) mbs domain показать текущий домен панели + mbs update обновить код с GitHub и перезапустить (не трогает .env и базу) EOF } @@ -53,11 +54,53 @@ cmd_domain() { grep "^PANEL_DOMAIN=" "$ENV_FILE" } +cmd_update() { + cd "$APP_DIR" + echo "проверяю обновления..." + git fetch --quiet origin main + local before after + before=$(git rev-parse HEAD) + after=$(git rev-parse origin/main) + if [ "$before" = "$after" ]; then + echo "уже последняя версия ($before)." + return 0 + fi + echo "текущая: $before" + echo "новая: $after" + if ! git merge --ff-only origin/main --quiet; then + echo "не вышло быстро обновиться (похоже, файлы правились вручную на сервере) — разберись руками: git status" + return 1 + fi + echo "обновляю зависимости..." + venv/bin/pip install --quiet -r requirements.txt + echo "проверяю код..." + if ! venv/bin/python -m py_compile *.py; then + echo "новый код не проходит проверку, откатываюсь на $before..." + git reset --hard "$before" --quiet + venv/bin/pip install --quiet -r requirements.txt + return 1 + fi + echo "перезапускаю..." + systemctl restart mbs-bot mbs-api + sleep 2 + if systemctl is-active --quiet mbs-bot && systemctl is-active --quiet mbs-api; then + echo "обновлено: $before -> $(git rev-parse --short HEAD)" + else + echo "сервисы не поднялись после обновления, откатываюсь на $before..." + git reset --hard "$before" --quiet + venv/bin/pip install --quiet -r requirements.txt + systemctl restart mbs-bot mbs-api + echo "откачено обратно на $before" + return 1 + fi +} + case "$1" in pass) cmd_pass "$2" ;; status) cmd_status ;; restart) cmd_restart ;; logs) cmd_logs "$2" ;; domain) cmd_domain ;; + update) cmd_update ;; *) usage ;; esac