diff --git a/docs/quickstart-30min.md b/docs/quickstart-30min.md index 5c08be3..e37a01d 100644 --- a/docs/quickstart-30min.md +++ b/docs/quickstart-30min.md @@ -141,3 +141,11 @@ cd ~/openclaude-LLM-local/docs/rag-mcp-starter chmod +x restore.sh ./restore.sh --from /path/to/backup_YYYYMMDD_HHMMSS ``` + +## 15) Безопасное обновление стенда + +```bash +cd ~/openclaude-LLM-local/docs/rag-mcp-starter +chmod +x upgrade.sh +./upgrade.sh +``` diff --git a/docs/rag-mcp-starter/README.md b/docs/rag-mcp-starter/README.md index c24c896..3dd3031 100644 --- a/docs/rag-mcp-starter/README.md +++ b/docs/rag-mcp-starter/README.md @@ -124,6 +124,22 @@ chmod +x restore.sh ./healthcheck.sh --mode full ``` +## Upgrade (safe workflow) + +Безопасное обновление: backup -> update -> healthcheck -> rollback configs при ошибке. + +```bash +chmod +x upgrade.sh +./upgrade.sh +``` + +Опции: + +```bash +./upgrade.sh --model qwen2.5:3b +./upgrade.sh --skip-model-pull +``` + ## Переменные окружения - `QDRANT_URL` (default `http://127.0.0.1:6333`) diff --git a/docs/rag-mcp-starter/upgrade.sh b/docs/rag-mcp-starter/upgrade.sh new file mode 100755 index 0000000..d0fe5bf --- /dev/null +++ b/docs/rag-mcp-starter/upgrade.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Safe upgrade workflow: +# 1) backup +# 2) upgrade dependencies/components +# 3) run healthcheck +# 4) optional rollback (config restore) on failure +# +# Usage: +# ./upgrade.sh +# ./upgrade.sh --model qwen2.5-coder:7b +# ./upgrade.sh --skip-model-pull + +WORKDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +MODEL="${MODEL:-qwen2.5-coder:7b}" +SKIP_MODEL_PULL=0 +BACKUP_DIR="${BACKUP_DIR:-$HOME/openclaude-backups}" +LAST_BACKUP="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --model) + MODEL="$2" + shift 2 + ;; + --skip-model-pull) + SKIP_MODEL_PULL=1 + shift + ;; + *) + echo "Unknown argument: $1" + exit 2 + ;; + esac +done + +step() { echo; echo "==> $*"; } +fail() { echo "ERROR: $*" >&2; exit 1; } + +run_backup() { + step "Creating backup before upgrade" + pushd "$WORKDIR" >/dev/null + ./backup.sh --output-dir "$BACKUP_DIR" + popd >/dev/null + LAST_BACKUP="$(ls -dt "$BACKUP_DIR"/backup_* 2>/dev/null | head -n 1 || true)" + [[ -n "$LAST_BACKUP" ]] || fail "Could not find created backup directory" + echo "Backup: $LAST_BACKUP" +} + +rollback_configs() { + if [[ -z "${LAST_BACKUP:-}" ]]; then + echo "No backup found, cannot rollback." + return + fi + step "Rolling back configs from backup" + pushd "$WORKDIR" >/dev/null + ./restore.sh --from "$LAST_BACKUP" + popd >/dev/null +} + +upgrade_system() { + step "Updating apt packages" + sudo apt update + sudo apt install -y curl git docker.io docker-compose-plugin python3 python3-venv python3-pip +} + +upgrade_openclaude() { + step "Updating OpenClaude CLI" + if command -v npm >/dev/null 2>&1; then + npm install -g @gitlawb/openclaude + else + echo "npm not found, skipping OpenClaude update" + fi +} + +upgrade_ollama() { + step "Ensuring Ollama is installed and running" + if ! command -v ollama >/dev/null 2>&1; then + curl -fsSL https://ollama.com/install.sh | sh + fi + sudo systemctl enable ollama + sudo systemctl restart ollama +} + +upgrade_models() { + if [[ "$SKIP_MODEL_PULL" -eq 1 ]]; then + step "Skipping model pull (--skip-model-pull)" + return + fi + step "Refreshing model: $MODEL" + ollama pull "$MODEL" + ollama pull nomic-embed-text || true +} + +upgrade_qdrant() { + step "Refreshing Qdrant container" + pushd "$WORKDIR" >/dev/null + docker compose pull + docker compose up -d + popd >/dev/null +} + +upgrade_python_deps() { + step "Refreshing Python virtual environment dependencies" + pushd "$WORKDIR" >/dev/null + if [[ ! -d ".venv" ]]; then + python3 -m venv .venv + fi + source .venv/bin/activate + pip install --upgrade pip + pip install -r requirements.txt + deactivate || true + popd >/dev/null +} + +run_checks() { + step "Running healthcheck (full)" + pushd "$WORKDIR" >/dev/null + ./healthcheck.sh --mode full --model "$MODEL" + popd >/dev/null +} + +main() { + run_backup + + if ! { + upgrade_system + upgrade_openclaude + upgrade_ollama + upgrade_models + upgrade_qdrant + upgrade_python_deps + run_checks + }; then + echo + echo "Upgrade failed. Starting config rollback..." + rollback_configs + fail "Upgrade aborted. Config rollback executed from: $LAST_BACKUP" + fi + + step "Upgrade completed successfully" + echo "Backup kept at: $LAST_BACKUP" + echo "Tip: run ./status.sh for quick post-upgrade overview." +} + +main "$@"