Add safe upgrade workflow script.
Made-with: Cursor
This commit is contained in:
@@ -141,3 +141,11 @@ cd ~/openclaude-LLM-local/docs/rag-mcp-starter
|
|||||||
chmod +x restore.sh
|
chmod +x restore.sh
|
||||||
./restore.sh --from /path/to/backup_YYYYMMDD_HHMMSS
|
./restore.sh --from /path/to/backup_YYYYMMDD_HHMMSS
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 15) Безопасное обновление стенда
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/openclaude-LLM-local/docs/rag-mcp-starter
|
||||||
|
chmod +x upgrade.sh
|
||||||
|
./upgrade.sh
|
||||||
|
```
|
||||||
|
|||||||
@@ -124,6 +124,22 @@ chmod +x restore.sh
|
|||||||
./healthcheck.sh --mode full
|
./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`)
|
- `QDRANT_URL` (default `http://127.0.0.1:6333`)
|
||||||
|
|||||||
Executable
+147
@@ -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 "$@"
|
||||||
Reference in New Issue
Block a user