mbs-panel/mbs
savsis 320742bd63 cli: mbs update now also refreshes /usr/local/bin/mbs itself after pulling
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-10 23:32:20 +05:00

112 lines
3.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
APP_DIR="/opt/mbs-panel"
ENV_FILE="$APP_DIR/.env"
usage() {
cat << 'EOF'
mbs — управление MBS Panel
mbs pass [новый_пароль] сменить пароль админ-панели (без аргумента — сгенерировать случайный)
mbs status статус всех сервисов (bot, api, xray, nginx)
mbs restart перезапустить всё (bot, api, xray, reload nginx)
mbs logs [bot|api|xray] последние строки лога (по умолчанию api)
mbs domain показать текущий домен панели
mbs update обновить код с GitHub и перезапустить (не трогает .env и базу)
EOF
}
cmd_pass() {
local new_pass="$1"
if [ -z "$new_pass" ]; then
new_pass=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 14)
fi
if grep -q "^ADMIN_PANEL_PASSWORD=" "$ENV_FILE"; then
sed -i "s#^ADMIN_PANEL_PASSWORD=.*#ADMIN_PANEL_PASSWORD=$new_pass#" "$ENV_FILE"
else
echo "ADMIN_PANEL_PASSWORD=$new_pass" >> "$ENV_FILE"
fi
systemctl restart mbs-api
echo "Новый пароль панели: $new_pass"
}
cmd_status() {
systemctl --no-pager status mbs-bot mbs-api xray nginx 2>&1 | grep -E "●|Active:"
}
cmd_restart() {
systemctl restart mbs-bot mbs-api xray
systemctl reload nginx 2>/dev/null || true
echo "Перезапущено: bot, api, xray (+ reload nginx)."
}
cmd_logs() {
local svc="${1:-api}"
case "$svc" in
bot) journalctl -u mbs-bot -n 60 --no-pager ;;
api) journalctl -u mbs-api -n 60 --no-pager ;;
xray) journalctl -u xray -n 60 --no-pager ;;
*) echo "неизвестный сервис: $svc (bot|api|xray)"; exit 1 ;;
esac
}
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 "обновляю сам CLI..."
cp "$APP_DIR/mbs" /usr/local/bin/mbs
chmod +x /usr/local/bin/mbs
echo "перезапускаю..."
systemctl restart mbs-bot mbs-api xray
systemctl reload nginx 2>/dev/null || true
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