From 80ea7d5302f925c69299f349331061c5d15ddd75 Mon Sep 17 00:00:00 2001 From: iqubik Date: Thu, 26 Mar 2026 01:19:48 +0300 Subject: [PATCH] Create update-custom.sh --- update-custom.sh | 117 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 update-custom.sh diff --git a/update-custom.sh b/update-custom.sh new file mode 100644 index 0000000..456c958 --- /dev/null +++ b/update-custom.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +set -euo pipefail + +trap 'echo -e "\033[1;31m[ERROR]\033[0m Ошибка в строке $LINENO"; exit 1' ERR + +log() { echo -e "\033[1;32m[INFO]\033[0m $1"; } +warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; } +die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } + +usage() { + cat <<'EOF' +Использование: + update-custom.sh -r -b [-p ] [-s ] + +Параметры: + -r Git URL вашего форка (обязательно), например: + https://github.com//3dp-manager.git + -b Ветка с вашими правками (обязательно), например: + dp-fix + -p Папка установленного 3dp-manager (по умолчанию /opt/3dp-manager) + -s Папка исходников для сборки (по умолчанию /opt/3dp-manager-src) + -h Показать эту справку + +Пример: + ./update-custom.sh -r https://github.com/me/3dp-manager.git -b dp-fix +EOF +} + +need_root() { + [[ $EUID -eq 0 ]] || die "Запускать только от root" +} + +REPO_URL="" +BRANCH="" +PROJECT_DIR="/opt/3dp-manager" +SOURCE_DIR="/opt/3dp-manager-src" + +while getopts ":r:b:p:s:h" opt; do + case "$opt" in + r) REPO_URL="$OPTARG" ;; + b) BRANCH="$OPTARG" ;; + p) PROJECT_DIR="$OPTARG" ;; + s) SOURCE_DIR="$OPTARG" ;; + h) + usage + exit 0 + ;; + :) + die "Параметр -$OPTARG требует значение" + ;; + \?) + die "Неизвестный параметр: -$OPTARG" + ;; + esac +done + +[[ -n "$REPO_URL" ]] || { usage; die "Укажите -r "; } +[[ -n "$BRANCH" ]] || { usage; die "Укажите -b "; } + +need_root + +[[ -d "$PROJECT_DIR" ]] || die "Папка проекта не найдена: $PROJECT_DIR" +[[ -f "$PROJECT_DIR/docker-compose.yml" ]] || die "Не найден docker-compose.yml в $PROJECT_DIR" + +command -v git >/dev/null 2>&1 || die "git не установлен" +command -v docker >/dev/null 2>&1 || die "docker не установлен" +docker compose version >/dev/null 2>&1 || die "docker compose v2 недоступен" + +log "Подготовка исходников в $SOURCE_DIR" +if [[ ! -d "$SOURCE_DIR/.git" ]]; then + if [[ -e "$SOURCE_DIR" ]]; then + die "Путь $SOURCE_DIR существует, но это не git-репозиторий. Укажите другой -s или подготовьте папку вручную." + fi + git clone --single-branch --branch "$BRANCH" "$REPO_URL" "$SOURCE_DIR" +else + cd "$SOURCE_DIR" + git remote set-url origin "$REPO_URL" + git fetch origin "$BRANCH" + + if git show-ref --verify --quiet "refs/heads/$BRANCH"; then + git checkout "$BRANCH" + else + git checkout -b "$BRANCH" --track "origin/$BRANCH" + fi + + # Обновляем только fast-forward, чтобы не переписывать локальные ручные правки. + git merge --ff-only "origin/$BRANCH" || die "Не удалось fast-forward merge. Проверьте локальные изменения в $SOURCE_DIR." +fi + +COMPOSE_OVERRIDE="$PROJECT_DIR/docker-compose.custom.yml" +cat > "$COMPOSE_OVERRIDE" </dev/null"; then + log "Scanner binary найден в backend-контейнере" +else + warn "Scanner binary не найден в backend-контейнере" +fi + +log "Готово: VPS обновлен на ваш fork/branch"