Add project and deployment instruction (docs/DEPLOYMENT.md)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
460
scripts/rebrand_safe_final.sh
Executable file
460
scripts/rebrand_safe_final.sh
Executable file
@@ -0,0 +1,460 @@
|
||||
#!/bin/bash
|
||||
# БЕЗОПАСНЫЙ финальный ребрендинг - не ломает функциональность
|
||||
|
||||
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 ""
|
||||
|
||||
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
echo "Ошибка: Контейнер ${CONTAINER_NAME} не запущен."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "1. Замена логотипов, splash.png и favicon..."
|
||||
|
||||
STATIC_DIRS=(
|
||||
"/app/web/build/_app/immutable"
|
||||
"/app/web/static"
|
||||
"/app/web/build"
|
||||
"/app/backend/static"
|
||||
"/app/static"
|
||||
"/app/web/public"
|
||||
"/app/public"
|
||||
)
|
||||
|
||||
for dir in "${STATIC_DIRS[@]}"; do
|
||||
if docker exec "${CONTAINER_NAME}" test -d "$dir" 2>/dev/null; then
|
||||
# Основной логотип
|
||||
if [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/logo.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash.png" 2>/dev/null || true
|
||||
# Также создаем splash-dark.png для темной темы
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash-dark.png" 2>/dev/null || true
|
||||
fi
|
||||
# Логотип для светлой темы
|
||||
if [ -f "$MEDIA_DIR/logo-light.svg" ]; then
|
||||
docker cp "$MEDIA_DIR/logo-light.svg" "${CONTAINER_NAME}:${dir}/logo-light.svg" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo-light.svg" "${CONTAINER_NAME}:${dir}/logo.svg" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash-light.png" 2>/dev/null || true
|
||||
elif [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
# Если нет SVG, используем PNG для светлой темы
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/logo-light.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash-light.png" 2>/dev/null || true
|
||||
fi
|
||||
# Логотип для темной темы
|
||||
if [ -f "$MEDIA_DIR/logo-dark.svg" ]; then
|
||||
docker cp "$MEDIA_DIR/logo-dark.svg" "${CONTAINER_NAME}:${dir}/logo-dark.svg" 2>/dev/null || true
|
||||
# Для splash-dark.png используем PNG версию (если есть logo-dark.png) или обычный logo.png
|
||||
if [ -f "$MEDIA_DIR/logo-dark.png" ]; then
|
||||
docker cp "$MEDIA_DIR/logo-dark.png" "${CONTAINER_NAME}:${dir}/splash-dark.png" 2>/dev/null || true
|
||||
elif [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash-dark.png" 2>/dev/null || true
|
||||
fi
|
||||
elif [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
# Если нет темного SVG, используем PNG для темной темы
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/logo-dark.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/splash-dark.png" 2>/dev/null || true
|
||||
fi
|
||||
# Favicon
|
||||
if [ -f "$MEDIA_DIR/favicon.png" ]; then
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${dir}/favicon.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${dir}/favicon.ico" 2>/dev/null || true
|
||||
# Также создаем favicon-dark.png и favicon-light.png
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${dir}/favicon-dark.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${dir}/favicon-light.png" 2>/dev/null || true
|
||||
# Apple touch icon для iOS
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${dir}/apple-touch-icon.png" 2>/dev/null || true
|
||||
elif [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
# Если нет отдельного favicon, используем logo.png
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/favicon.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/favicon.ico" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/favicon-dark.png" 2>/dev/null || true
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/favicon-light.png" 2>/dev/null || true
|
||||
# Apple touch icon для iOS
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${dir}/apple-touch-icon.png" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Заменяем ВСЕ существующие favicon файлы (включая favicon.ico, favicon-dark.png, favicon-light.png, apple-touch-icon.png)
|
||||
echo " Замена всех favicon файлов..."
|
||||
EXISTING_FAVICONS=$(docker exec "${CONTAINER_NAME}" find /app -type f \( -name "favicon.png" -o -name "favicon.ico" -o -name "favicon.svg" -o -name "favicon-dark.png" -o -name "favicon-light.png" -o -name "apple-touch-icon.png" \) 2>/dev/null)
|
||||
if [ -f "$MEDIA_DIR/favicon.png" ]; then
|
||||
echo "$EXISTING_FAVICONS" | while read -r favicon_file; do
|
||||
if [ -n "$favicon_file" ] && [[ ! "$favicon_file" == *"node_modules"* ]]; then
|
||||
favicon_name=$(basename "$favicon_file")
|
||||
echo " Замена favicon: $favicon_file"
|
||||
# Для темной темы используем logo-dark если есть, иначе favicon.png
|
||||
if [[ "$favicon_name" == *"dark"* ]]; then
|
||||
if [ -f "$MEDIA_DIR/logo-dark.svg" ] || [ -f "$MEDIA_DIR/logo-dark.png" ]; then
|
||||
# Используем logo.png для favicon-dark (так как favicon должен быть PNG)
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true
|
||||
else
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true
|
||||
fi
|
||||
# Для светлой темы
|
||||
elif [[ "$favicon_name" == *"light"* ]]; then
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true
|
||||
# Apple touch icon или обычный favicon
|
||||
else
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true
|
||||
# Также создаем .ico версию в той же директории для обычных favicon
|
||||
if [[ "$favicon_name" == "favicon.png" ]]; then
|
||||
favicon_dir=$(dirname "$favicon_file")
|
||||
docker cp "$MEDIA_DIR/favicon.png" "${CONTAINER_NAME}:${favicon_dir}/favicon.ico" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
elif [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
# Если нет favicon.png, используем logo.png
|
||||
echo "$EXISTING_FAVICONS" | while read -r favicon_file; do
|
||||
if [ -n "$favicon_file" ] && [[ ! "$favicon_file" == *"node_modules"* ]]; then
|
||||
favicon_name=$(basename "$favicon_file")
|
||||
echo " Замена favicon: $favicon_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${favicon_file}" 2>/dev/null || true
|
||||
# Также создаем .ico версию для обычных favicon (не для dark/light/apple-touch-icon)
|
||||
if [[ "$favicon_name" == "favicon.png" ]]; then
|
||||
favicon_dir=$(dirname "$favicon_file")
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${favicon_dir}/favicon.ico" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Заменяем все существующие splash.png и splash-dark.png
|
||||
EXISTING_SPLASH=$(docker exec "${CONTAINER_NAME}" find /app -type f \( -name "splash.png" -o -name "splash-dark.png" -o -name "splash-light.png" \) 2>/dev/null)
|
||||
if [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
echo "$EXISTING_SPLASH" | while read -r splash_file; do
|
||||
if [ -n "$splash_file" ] && [[ ! "$splash_file" == *"node_modules"* ]]; then
|
||||
splash_name=$(basename "$splash_file")
|
||||
# Для темной темы используем logo-dark если есть, иначе обычный logo
|
||||
if [[ "$splash_name" == *"dark"* ]]; then
|
||||
if [ -f "$MEDIA_DIR/logo-dark.svg" ]; then
|
||||
# Конвертируем SVG в PNG или используем logo.png
|
||||
echo " Замена splash-dark.png: $splash_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${splash_file}" 2>/dev/null || true
|
||||
else
|
||||
echo " Замена splash-dark.png: $splash_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${splash_file}" 2>/dev/null || true
|
||||
fi
|
||||
# Для светлой темы
|
||||
elif [[ "$splash_name" == *"light"* ]]; then
|
||||
if [ -f "$MEDIA_DIR/logo-light.svg" ]; then
|
||||
echo " Замена splash-light.png: $splash_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${splash_file}" 2>/dev/null || true
|
||||
else
|
||||
echo " Замена splash-light.png: $splash_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${splash_file}" 2>/dev/null || true
|
||||
fi
|
||||
# Обычный splash
|
||||
else
|
||||
echo " Замена splash.png: $splash_file"
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${splash_file}" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Заменяем все существующие logo файлы (включая logo-dark и logo-light)
|
||||
EXISTING_LOGOS=$(docker exec "${CONTAINER_NAME}" find /app -type f \( -name "logo.png" -o -name "logo.svg" -o -name "logo-light.*" -o -name "logo-dark.*" \) 2>/dev/null)
|
||||
if [ -f "$MEDIA_DIR/logo.png" ]; then
|
||||
echo "$EXISTING_LOGOS" | while read -r logo_file; do
|
||||
if [ -n "$logo_file" ] && [[ ! "$logo_file" == *"node_modules"* ]]; then
|
||||
logo_name=$(basename "$logo_file")
|
||||
# Для темной темы используем logo-dark если есть, иначе обычный logo
|
||||
if [[ "$logo_name" == *"dark"* ]]; then
|
||||
if [ -f "$MEDIA_DIR/logo-dark.svg" ]; then
|
||||
docker cp "$MEDIA_DIR/logo-dark.svg" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true
|
||||
else
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true
|
||||
fi
|
||||
# Для светлой темы используем logo-light если есть
|
||||
elif [[ "$logo_name" == *"light"* ]]; then
|
||||
if [ -f "$MEDIA_DIR/logo-light.svg" ]; then
|
||||
docker cp "$MEDIA_DIR/logo-light.svg" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true
|
||||
else
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true
|
||||
fi
|
||||
# Обычный логотип
|
||||
else
|
||||
docker cp "$MEDIA_DIR/logo.png" "${CONTAINER_NAME}:${logo_file}" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "2. БЕЗОПАСНОЕ удаление '(Open WebUI)' из HTML/Svelte и Python шаблонов..."
|
||||
|
||||
# HTML, Svelte и Python файлы (шаблоны)
|
||||
FILES=$(docker exec "${CONTAINER_NAME}" find /app -type f \
|
||||
\( -name "*.html" -o -name "*.svelte" -o -name "*.py" \) \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||||
! -name "*test*" ! -name "*__pycache__*" \
|
||||
-exec grep -lE "(Open WebUI)|\(Open WebUI\)" {} \; 2>/dev/null)
|
||||
|
||||
if [ -z "$FILES" ]; then
|
||||
echo " Файлов с '(Open WebUI)' не найдено"
|
||||
else
|
||||
COUNT=$(echo "$FILES" | wc -l)
|
||||
echo " Найдено файлов: $COUNT"
|
||||
echo "$FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
# Безопасная замена только в HTML/Svelte
|
||||
docker exec "${CONTAINER_NAME}" sed -i \
|
||||
-e 's/(Open WebUI)//g' \
|
||||
-e 's/\(Open WebUI\)//g' \
|
||||
-e 's/ (Open WebUI)//g' \
|
||||
-e 's/ \(Open WebUI\)//g' \
|
||||
-e 's/iiEasyWeb (Open WebUI)/iiEasyWeb/g' \
|
||||
-e 's/Войти в iiEasyWeb (Open WebUI)/Войти в iiEasyWeb/g' \
|
||||
"$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "3. Замена ссылок на документацию (только в HTML/Svelte)..."
|
||||
|
||||
DOC_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f \
|
||||
\( -name "*.html" -o -name "*.svelte" \) \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "docs\.openwebui\.com|open-webui\.com/docs" {} \; 2>/dev/null)
|
||||
|
||||
if [ -z "$DOC_FILES" ]; then
|
||||
echo " Файлов со ссылками не найдено"
|
||||
else
|
||||
echo "$DOC_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
docker exec "${CONTAINER_NAME}" sed -i \
|
||||
-e 's|https://docs.openwebui.com|https://note.iieasy.ru|g' \
|
||||
-e 's|https://open-webui.com/docs|https://note.iieasy.ru|g' \
|
||||
-e 's|docs\.openwebui\.com|note.iieasy.ru|g' \
|
||||
"$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "4. Исправление favicon.ico, favicon.png, favicon-dark.png и apple-touch-icon.png в HTML/Svelte шаблонах..."
|
||||
|
||||
# Заменяем ссылки на favicon.ico, favicon.png, favicon-dark.png и apple-touch-icon.png на наш логотип
|
||||
TEMPLATE_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f \
|
||||
\( -name "*.html" -o -name "*.svelte" \) \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "/static/favicon(-dark|-light)?\.(png|ico)|favicon(-dark|-light)?\.(ico|png)|apple-touch-icon\.png|rel=\"(shortcut )?icon\"|rel=\"apple-touch-icon\"" {} \; 2>/dev/null)
|
||||
|
||||
if [ -n "$TEMPLATE_FILES" ]; then
|
||||
echo "$TEMPLATE_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
# Заменяем favicon.ico, favicon.png, favicon-dark.png и apple-touch-icon.png на logo.png в ссылках
|
||||
docker exec "${CONTAINER_NAME}" sed -i \
|
||||
-e 's|/static/favicon-dark\.png|/static/logo.png|g' \
|
||||
-e 's|/static/favicon-light\.png|/static/logo.png|g' \
|
||||
-e 's|/static/favicon\.ico|/static/logo.png|g' \
|
||||
-e 's|/static/favicon\.png|/static/logo.png|g' \
|
||||
-e 's|/static/apple-touch-icon\.png|/static/logo.png|g' \
|
||||
-e 's|src="/static/favicon-dark\.png"|src="/static/logo.png"|g' \
|
||||
-e 's|src="/static/favicon\.png"|src="/static/logo.png"|g' \
|
||||
-e 's|src="/static/apple-touch-icon\.png"|src="/static/logo.png"|g' \
|
||||
-e 's|href="[^"]*favicon-dark\.png"|href="/static/logo.png"|g' \
|
||||
-e 's|href="[^"]*favicon\.ico"|href="/static/logo.png"|g' \
|
||||
-e 's|href="[^"]*favicon\.png"|href="/static/logo.png"|g' \
|
||||
-e 's|href="[^"]*apple-touch-icon\.png"|href="/static/logo.png"|g' \
|
||||
-e 's|href="https://odo\.iieasy\.ru/static/favicon\.ico"|href="/static/logo.png"|g' \
|
||||
"$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "4.1. Исправление splash-dark.png, favicon-dark.png и логотипов в окне авторизации..."
|
||||
|
||||
# Ищем файлы, где используется splash-dark.png, favicon-dark.png или логотип в окне авторизации
|
||||
AUTH_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f \
|
||||
\( -name "*.html" -o -name "*.svelte" \) \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "splash-dark|splash-dark\.png|favicon-dark\.png|auth.*logo|login.*logo|dark.*splash|dark.*favicon" {} \; 2>/dev/null)
|
||||
|
||||
if [ -n "$AUTH_FILES" ]; then
|
||||
echo "$AUTH_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " Исправление логотипа в окне авторизации: $file"
|
||||
# Заменяем splash-dark.png и favicon-dark.png на наш логотип
|
||||
docker exec "${CONTAINER_NAME}" sed -i \
|
||||
-e 's|/static/splash-dark\.png|/static/logo.png|g' \
|
||||
-e 's|/static/favicon-dark\.png|/static/logo.png|g' \
|
||||
-e 's|splash-dark\.png|logo.png|g' \
|
||||
-e 's|favicon-dark\.png|logo.png|g' \
|
||||
-e 's|src="/static/favicon-dark\.png"|src="/static/logo.png"|g' \
|
||||
-e 's|src="[^"]*splash-dark[^"]*"|src="/static/logo.png"|g' \
|
||||
-e 's|src="[^"]*favicon-dark[^"]*"|src="/static/logo.png"|g' \
|
||||
"$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "5. Исправление API endpoint для изображения профиля модели..."
|
||||
|
||||
# Ищем и заменяем API endpoint для изображения профиля модели
|
||||
API_FILES=$(docker exec "${CONTAINER_NAME}" find /app -type f \
|
||||
\( -name "*.html" -o -name "*.svelte" -o -name "*.js" -o -name "*.ts" -o -name "*.py" \) \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||||
-exec grep -l "model/profile/image\|models.*profile.*image" {} \; 2>/dev/null)
|
||||
|
||||
if [ -n "$API_FILES" ]; then
|
||||
echo "$API_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " Исправление API endpoint в: $file"
|
||||
# Заменяем API endpoint на статический логотип
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|/api/v1/models/model/profile/image|/static/logo.png|g' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|api/v1/models/model/profile/image|static/logo.png|g' "$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Также ищем в Python коде, который генерирует этот endpoint
|
||||
PYTHON_API=$(docker exec "${CONTAINER_NAME}" find /app/backend -type f -name "*.py" \
|
||||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||||
-exec grep -l "profile.*image\|model.*profile\|def.*profile" {} \; 2>/dev/null)
|
||||
|
||||
if [ -n "$PYTHON_API" ]; then
|
||||
echo "$PYTHON_API" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
# Ищем функции, которые возвращают изображение профиля и заменяем на статический логотип
|
||||
echo " Проверка Python API в: $file"
|
||||
# Это нужно делать более аккуратно - просто заменим возвращаемый путь
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|/static/favicon.png|/static/logo.png|g' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|favicon.png|logo.png|g' "$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "6. Удаление проверки обновлений и ссылок на GitHub (только Svelte файлы)..."
|
||||
|
||||
# Ищем ТОЛЬКО в исходных Svelte файлах - не трогаем скомпилированные JS
|
||||
UPDATE_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f -name "*.svelte" \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "Проверить обновления|Check for updates|github.com/open-webui/releases|последняя|latest" {} \; 2>/dev/null)
|
||||
|
||||
if [ -z "$UPDATE_FILES" ]; then
|
||||
echo " Файлов с проверкой обновлений не найдено"
|
||||
else
|
||||
COUNT=$(echo "$UPDATE_FILES" | wc -l)
|
||||
echo " Найдено Svelte файлов: $COUNT"
|
||||
echo "$UPDATE_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " Удаление проверки обновлений из: $file"
|
||||
# Удаляем кнопку "Проверить обновления"
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/Проверить обновления/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/Check for updates/d' "$file" 2>/dev/null || true
|
||||
# Удаляем ссылку на GitHub releases с текстом "(последняя)"
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|<a[^>]*href="https://github.com/open-webui/open-webui/releases/tag/[^"]*"[^>]*>(последняя)</a>||g' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|(последняя)||g' "$file" 2>/dev/null || true
|
||||
# Удаляем "Посмотреть, что нового"
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/Посмотреть, что нового/d' "$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "7. Удаление социальных сетей, GitHub и блока 'Помощь' (только Svelte файлы)..."
|
||||
|
||||
# Ищем ТОЛЬКО в исходных Svelte файлах
|
||||
SOCIAL_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f -name "*.svelte" \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "discord|twitter|x\.com|Github Repo|github.com/open-webui|Помощь|Help|обратитесь за поддержкой" {} \; 2>/dev/null)
|
||||
|
||||
if [ -z "$SOCIAL_FILES" ]; then
|
||||
echo " Файлов с соцсетями не найдено"
|
||||
else
|
||||
COUNT=$(echo "$SOCIAL_FILES" | wc -l)
|
||||
echo " Найдено Svelte файлов: $COUNT"
|
||||
echo "$SOCIAL_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " Удаление соцсетей из: $file"
|
||||
# Удаляем ссылки на Discord
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|<a[^>]*href="https://discord.gg/[^"]*"[^>]*>.*</a>||g' "$file" 2>/dev/null || true
|
||||
# Удаляем ссылки на Twitter/X
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|<a[^>]*href="https://twitter.com/[^"]*"[^>]*>.*</a>||g' "$file" 2>/dev/null || true
|
||||
# Удаляем ссылки на GitHub repo
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|<a[^>]*href="https://github.com/open-webui/open-webui"[^>]*>.*</a>||g' "$file" 2>/dev/null || true
|
||||
# Удаляем badges (img.shields.io)
|
||||
docker exec "${CONTAINER_NAME}" sed -i 's|<img[^>]*shields.io[^>]*>||g' "$file" 2>/dev/null || true
|
||||
# Удаляем текст блока "Помощь"
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/Узнайте, как использовать/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/обратитесь за поддержкой/d' "$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "8. Удаление блока 'Лицензия' полностью (только Svelte файлы)..."
|
||||
|
||||
# Ищем ТОЛЬКО в исходных Svelte файлах
|
||||
LICENSE_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f -name "*.svelte" \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -lE "Лицензия|License|лицензионный тарифный план|Перейдите на лицензионный" {} \; 2>/dev/null)
|
||||
|
||||
if [ -z "$LICENSE_FILES" ]; then
|
||||
echo " Файлов с лицензией не найдено"
|
||||
else
|
||||
COUNT=$(echo "$LICENSE_FILES" | wc -l)
|
||||
echo " Найдено Svelte файлов: $COUNT"
|
||||
echo "$LICENSE_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " Удаление блока лицензии из: $file"
|
||||
# Удаляем только текст блока лицензии
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/Перейдите на лицензионный/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/расширенные возможности/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/настраиваемую тематику/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/фирменный стиль/d' "$file" 2>/dev/null || true
|
||||
docker exec "${CONTAINER_NAME}" sed -i '/специальную поддержку/d' "$file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "9. Добавление надписи 'Основано на Open WebUI' внизу настроек..."
|
||||
|
||||
# Ищем файлы настроек для добавления надписи
|
||||
# Это сложнее сделать автоматически, поэтому просто отмечаем файлы
|
||||
SETTINGS_FILES=$(docker exec "${CONTAINER_NAME}" find /app/web -type f -name "*.svelte" \
|
||||
! -path "*/node_modules/*" ! -path "*/.next/*" \
|
||||
-exec grep -l "Settings\|Настройки\|General\|Общее" {} \; 2>/dev/null | head -3)
|
||||
|
||||
if [ -n "$SETTINGS_FILES" ]; then
|
||||
echo " Найдены файлы настроек (надпись нужно добавить вручную):"
|
||||
echo "$SETTINGS_FILES" | while read file; do
|
||||
if [ -n "$file" ]; then
|
||||
echo " - $file"
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
echo " Добавьте в конец блока настроек перед закрывающим тегом:"
|
||||
echo " <div class='text-xs text-gray-400 dark:text-gray-500 mt-4 text-center'>"
|
||||
echo " Основано на <span class='text-gray-500'>Open WebUI</span>"
|
||||
echo " </div>"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "10. Перезапуск контейнера..."
|
||||
|
||||
docker restart "${CONTAINER_NAME}" >/dev/null 2>&1 || {
|
||||
echo "Предупреждение: Перезапустите вручную: docker restart ${CONTAINER_NAME}"
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "=== БЕЗОПАСНЫЙ ребрендинг завершен! ==="
|
||||
echo ""
|
||||
echo "Проверьте:"
|
||||
echo " 1. Откройте https://odo.iieasy.ru"
|
||||
echo " 2. splash.png должен быть заменен на ваш логотип"
|
||||
echo " 3. Проверка обновлений и ссылки на GitHub должны быть удалены"
|
||||
echo " 4. Социальные сети и блок лицензии должны быть удалены"
|
||||
echo " 5. Очистите кеш браузера (Ctrl+Shift+Delete)"
|
||||
echo ""
|
||||
echo "Примечание: Надпись 'Основано на Open WebUI' нужно добавить вручную"
|
||||
echo "в файлах настроек (см. вывод выше) или через Admin Panel"
|
||||
Reference in New Issue
Block a user