#!/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"