#!/bin/bash # ПОЛНЫЙ ребрендинг Open WebUI для iiEasy # Удаляет ВСЕ упоминания Open WebUI из интерфейса, но защищает OAuth set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" MEDIA_DIR="$PROJECT_DIR/media" CONTAINER_NAME="open-webui" echo "=== ПОЛНЫЙ ребрендинг Open WebUI для iiEasy ===" echo "⚠ Удаление ВСЕХ упоминаний Open WebUI из интерфейса" echo "⚠ OAuth/Authentik файлы защищены" echo "" # Проверка наличия контейнера if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "Ошибка: Контейнер ${CONTAINER_NAME} не найден. Запустите docker-compose up -d сначала." exit 1 fi # Проверка, что контейнер запущен if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "Ошибка: Контейнер ${CONTAINER_NAME} не запущен. Запустите docker-compose up -d." exit 1 fi echo "1. Замена логотипов и favicon..." # Определяем пути для статических файлов STATIC_DIRS=( "/app/web/build/_app/immutable" "/app/web/static" "/app/web/build" "/app/backend/static" "/app/static" "/app/public" ) STATIC_DIR="" for dir in "${STATIC_DIRS[@]}"; do if docker exec "${CONTAINER_NAME}" test -d "$dir" 2>/dev/null; then STATIC_DIR="$dir" echo " Найдена директория: $STATIC_DIR" break fi done if [ -z "$STATIC_DIR" ]; then FAVICON_PATH=$(docker exec "${CONTAINER_NAME}" find /app -name "favicon.png" -o -name "favicon.ico" 2>/dev/null | head -1) if [ -n "$FAVICON_PATH" ]; then STATIC_DIR=$(dirname "$FAVICON_PATH") else STATIC_DIR="/app/web/build/_app/immutable" docker exec "${CONTAINER_NAME}" mkdir -p "$STATIC_DIR" 2>/dev/null || true fi fi # Копирование логотипов for target_dir in "$STATIC_DIR" "/app/web/build/_app/immutable" "/app/web/static" "/app/web/build"; do if docker exec "${CONTAINER_NAME}" test -d "$target_dir" 2>/dev/null || [ "$target_dir" = "$STATIC_DIR" ]; then echo " Копирование в $target_dir..." if [ -f "$MEDIA_DIR/logo.png" ]; then docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${target_dir}/logo.png" 2>/dev/null || true docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${target_dir}/logo.svg" 2>/dev/null || true elif [ -f "$MEDIA_DIR/logo-light.svg" ]; then docker cp "$MEDIA_DIR/logo-light.svg" "${CONTAINER_NAME}:${target_dir}/logo.svg" 2>/dev/null || true fi if [ -f "$MEDIA_DIR/logo-dark.svg" ]; then docker cp "$MEDIA_DIR/logo-dark.svg" "${CONTAINER_NAME}:${target_dir}/logo-dark.svg" 2>/dev/null || true fi if [ -f "$MEDIA_DIR/favicon.ico" ]; then docker cp "$MEDIA_DIR/favicon.ico" "${CONTAINER_NAME}:${target_dir}/favicon.ico" 2>/dev/null || true elif [ -f "$MEDIA_DIR/favicon.png" ]; then docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${target_dir}/favicon.png" 2>/dev/null || true docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${target_dir}/favicon.ico" 2>/dev/null || true docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${target_dir}/favicon-96x96.png" 2>/dev/null || true elif [ -f "$MEDIA_DIR/favicon.svg" ]; then docker cp "$MEDIA_DIR/favicon.svg" "${CONTAINER_NAME}:${target_dir}/favicon.svg" 2>/dev/null || true fi fi done # Замена существующих favicon и logo EXISTING_FAVICONS=$(docker exec "${CONTAINER_NAME}" find /app -type f \( -name "favicon.png" -o -name "favicon.ico" -o -name "favicon.svg" \) 2>/dev/null | head -10) EXISTING_LOGOS=$(docker exec "${CONTAINER_NAME}" find /app -type f \( -name "logo.png" -o -name "logo.svg" \) 2>/dev/null | head -10) if [ -f "$MEDIA_DIR/favicon.png" ]; then echo "$EXISTING_FAVICONS" | while read -r favicon_file; do if [ -n "$favicon_file" ]; then docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true favicon_dir=$(dirname "$favicon_file") docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_dir}/favicon.ico" 2>/dev/null || true fi done fi if [ -f "$MEDIA_DIR/logo.png" ]; then echo "$EXISTING_LOGOS" | while read -r logo_file; do if [ -n "$logo_file" ]; then docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true fi done fi # Копируем в public директории PUBLIC_DIRS=("/app/web/public" "/app/public" "/app/backend/public") for pub_dir in "${PUBLIC_DIRS[@]}"; do if docker exec "${CONTAINER_NAME}" test -d "$pub_dir" 2>/dev/null; then if [ -f "$MEDIA_DIR/logo.png" ]; then docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${pub_dir}/logo.png" 2>/dev/null || true fi if [ -f "$MEDIA_DIR/favicon.png" ]; then docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${pub_dir}/favicon.png" 2>/dev/null || true docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${pub_dir}/favicon.ico" 2>/dev/null || true fi break fi done echo "2. Удаление упоминаний 'Open WebUI' из фронтенда (HTML/JS/TSX/Svelte)..." # КРИТИЧНО: Изменяем ТОЛЬКО фронтенд файлы (веб-интерфейс) # НЕ трогаем Python бэкенд файлы вообще, кроме исключений для безопасности docker exec "${CONTAINER_NAME}" find /app/web -type f \( -name "*.html" -o -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" -o -name "*.svelte" -o -name "*.json" \) \ ! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" \ 2>/dev/null | while read file; do # Проверяем, содержит ли файл упоминания Open WebUI if docker exec "${CONTAINER_NAME}" grep -q "Open WebUI\|open-webui\|openwebui\|\(Open WebUI\)" "$file" 2>/dev/null; then echo " Обработка фронтенд: $file" # Замена "Open WebUI" на "iiEasyWeb" docker exec "${CONTAINER_NAME}" sed -i 's/Open WebUI/iiEasyWeb/g' "$file" 2>/dev/null || true # Удаление "(Open WebUI)" в скобках docker exec "${CONTAINER_NAME}" sed -i 's/(Open WebUI)//g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's/\(Open WebUI\)//g' "$file" 2>/dev/null || true # Замена "iiEasyWeb (Open WebUI)" на "iiEasyWeb" docker exec "${CONTAINER_NAME}" sed -i 's/iiEasyWeb (Open WebUI)/iiEasyWeb/g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's/iiEasyWeb \(Open WebUI\)/iiEasyWeb/g' "$file" 2>/dev/null || true # Удаление "open-webui" и "openwebui" в тексте (но не в URL - они обычно в кавычках или переменных) docker exec "${CONTAINER_NAME}" sed -i 's/open-webui/iieasyweb/g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's/openwebui/iieasyweb/g' "$file" 2>/dev/null || true fi done echo "3. Удаление упоминаний из статических JSON файлов конфигурации..." # Изменяем только JSON файлы конфигурации фронтенда (не бэкенд) docker exec "${CONTAINER_NAME}" find /app/web -type f -name "*.json" \ ! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" \ 2>/dev/null | while read file; do if docker exec "${CONTAINER_NAME}" grep -q "Open WebUI\|open-webui\|openwebui" "$file" 2>/dev/null; then echo " Обработка JSON: $file" docker exec "${CONTAINER_NAME}" sed -i 's/Open WebUI/iiEasyWeb/g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's/open-webui/iieasyweb/g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's/openwebui/iieasyweb/g' "$file" 2>/dev/null || true fi done echo "4. Удаление 'Powered by' футеров из фронтенда..." docker exec "${CONTAINER_NAME}" find /app/web -type f \( -name "*.html" -o -name "*.js" -o -name "*.tsx" -o -name "*.jsx" -o -name "*.svelte" \) \ ! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" \ 2>/dev/null | while read file; do if docker exec "${CONTAINER_NAME}" grep -q "Powered by\|powered by" "$file" 2>/dev/null; then echo " Удаление футера из: $file" docker exec "${CONTAINER_NAME}" sed -i '/Powered by.*[Oo]pen.*[Ww]eb[Uu][Ii]/d' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i '/powered by.*[Oo]pen.*[Ww]eb[Uu][Ii]/d' "$file" 2>/dev/null || true fi done echo "5. Отключение проверки обновлений (только фронтенд)..." docker exec "${CONTAINER_NAME}" find /app/web -type f \( -name "*.js" -o -name "*.ts" \) \ ! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" \ -exec grep -l "github.com.*releases\|check.*update\|update.*check" {} \; 2>/dev/null | while read file; do echo " Отключение проверки обновлений в: $file" docker exec "${CONTAINER_NAME}" sed -i 's|https://api.github.com/repos/open-webui|# https://api.github.com/repos/open-webui|g' "$file" 2>/dev/null || true docker exec "${CONTAINER_NAME}" sed -i 's|github.com/open-webui|# github.com/open-webui|g' "$file" 2>/dev/null || true done echo "" echo "⚠ ВАЖНО: Python бэкенд файлы НЕ изменялись" echo "⚠ OAuth/Authentik файлы защищены" echo "⚠ Изменены только фронтенд файлы (веб-интерфейс)" echo "" echo "6. Перезапуск контейнера..." docker restart "${CONTAINER_NAME}" >/dev/null 2>&1 || { echo "Предупреждение: Не удалось перезапустить контейнер автоматически." echo "Перезапустите вручную: docker restart ${CONTAINER_NAME}" } echo "" echo "=== ПОЛНЫЙ ребрендинг завершен! ===" echo "" echo "Проверьте:" echo " 1. Откройте https://odo.iieasy.ru" echo " 2. Проверьте отсутствие упоминаний 'Open WebUI'" echo " 3. Проверьте OAuth - должен работать нормально" echo "" echo "Если OAuth не работает, пересоздайте контейнер:" echo " sudo docker compose stop open-webui" echo " sudo docker compose rm -f open-webui" echo " sudo docker compose up -d open-webui"