mbs-panel/mbs

126 lines
4.3 KiB
Text
Raw Normal View History

#!/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 обновить код (зеркало api.savsis.xyz, потом 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 "проверяю обновления..."
local remote="origin"
if ! git fetch --quiet origin main 2>/dev/null; then
if git remote | grep -q '^github$'; then
echo "зеркало недоступно, пробую github..."
if ! git fetch --quiet github main 2>/dev/null; then
echo "не удалось получить обновления ни с зеркала, ни с github"
return 1
fi
remote="github"
else
echo "не удалось получить обновления"
return 1
fi
fi
local before after
before=$(git rev-parse HEAD)
after=$(git rev-parse "$remote/main")
if [ "$before" = "$after" ]; then
echo "уже последняя версия ($before)."
return 0
fi
echo "текущая: $before"
echo "новая: $after"
if ! git merge --ff-only "$remote/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