#!/bin/bash # БЕЗОПАСНЫЙ скрипт ребрендинга Open WebUI для iiEasy # Только логотипы и favicon, БЕЗ изменения кода Python/JS 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 "⚠ ВНИМАНИЕ: Этот скрипт изменяет ТОЛЬКО логотипы и favicon" echo "⚠ Код Python/JS НЕ изменяется для защиты 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..." # Определяем пути для статических файлов в Open WebUI 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 echo " Предупреждение: Директория статических файлов не найдена, пробуем найти через поиск favicon..." 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") echo " Найдена директория через поиск favicon: $STATIC_DIR" else STATIC_DIR="/app/web/build/_app/immutable" echo " Используем стандартный путь: $STATIC_DIR" docker exec "${CONTAINER_NAME}" mkdir -p "$STATIC_DIR" 2>/dev/null || true fi fi # Копирование логотипов (приоритет: PNG > SVG) 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 # Favicon 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 файлов echo " Поиск существующих 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) # Заменяем существующие favicon файлы if [ -f "$MEDIA_DIR/favicon.png" ]; then echo "$EXISTING_FAVICONS" | while read -r favicon_file; do if [ -n "$favicon_file" ]; then echo " Замена: $favicon_file" 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 # Заменяем существующие logo файлы if [ -f "$MEDIA_DIR/logo.png" ]; then echo "$EXISTING_LOGOS" | while read -r logo_file; do if [ -n "$logo_file" ]; then echo " Замена: $logo_file" 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 echo " Копирование в $pub_dir..." 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 "" echo "=== БЕЗОПАСНЫЙ ребрендинг завершен! ===" echo "" echo "⚠ Изменены ТОЛЬКО логотипы и favicon" echo "⚠ Код Python/JS НЕ изменялся - OAuth/Authentik защищены" echo "" echo "Рекомендуется использовать Admin Panel для постоянных изменений:" echo " Settings → Appearance → Logo (загрузите файлы из /app/media/)" echo "" echo "Если нужно изменить текст интерфейса, используйте Admin Panel или" echo "настройте переменные окружения в docker-compose.yml"