275 lines
15 KiB
Bash
Executable File
275 lines
15 KiB
Bash
Executable File
#!/bin/bash
|
||
# ПОЛНЫЙ ребрендинг Open WebUI для iiEasy
|
||
# Удаляет ВСЕ упоминания Open WebUI, отключает телеметрию
|
||
# НО защищает OAuth/Authentik файлы
|
||
|
||
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 "✓ Отключение телеметрии и аналитики"
|
||
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_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' из фронтенда..."
|
||
|
||
# Изменяем ТОЛЬКО фронтенд файлы (веб-интерфейс)
|
||
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
|
||
if docker exec "${CONTAINER_NAME}" grep -q "Open WebUI\|open-webui\|openwebui\|\(Open WebUI\)" "$file" 2>/dev/null; then
|
||
echo " Фронтенд: $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)//g' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i 's/\(Open WebUI\)//g' "$file" 2>/dev/null || true
|
||
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
|
||
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. Удаление упоминаний 'Open WebUI' из бэкенда (кроме OAuth)..."
|
||
|
||
# Изменяем бэкенд Python файлы, НО исключаем OAuth/аутентификационные файлы
|
||
docker exec "${CONTAINER_NAME}" find /app/backend -type f -name "*.py" \
|
||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||
! -name "*oauth*" ! -name "*oidc*" ! -name "*auth*" ! -name "*login*" \
|
||
! -path "*/utils/oauth*" ! -path "*/utils/auth*" \
|
||
! -path "*/open_webui/utils/oauth*" ! -path "*/open_webui/utils/auth*" \
|
||
! -path "*/open_webui/main.py" \
|
||
2>/dev/null | while read file; do
|
||
if docker exec "${CONTAINER_NAME}" grep -q "Open WebUI\|open-webui\|openwebui\|\(Open WebUI\)" "$file" 2>/dev/null; then
|
||
echo " Бэкенд: $file"
|
||
# Замена только текста, не URL или конфигурации
|
||
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)//g' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i 's/\(Open WebUI\)//g' "$file" 2>/dev/null || true
|
||
# НЕ заменяем open-webui/openwebui в бэкенде - может быть частью конфигурации
|
||
fi
|
||
done
|
||
|
||
echo "4. Отключение телеметрии и аналитики в бэкенде..."
|
||
|
||
# Отключаем телеметрию в Python файлах, НО исключаем OAuth файлы
|
||
docker exec "${CONTAINER_NAME}" find /app/backend -type f -name "*.py" \
|
||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||
! -name "*oauth*" ! -name "*oidc*" ! -name "*auth*" ! -name "*login*" \
|
||
! -path "*/utils/oauth*" ! -path "*/utils/auth*" \
|
||
! -path "*/open_webui/utils/oauth*" ! -path "*/open_webui/utils/auth*" \
|
||
! -path "*/open_webui/main.py" \
|
||
-exec grep -l "from.*telemetry\|import.*telemetry\|analytics\|tracking\|gtag\|ga(\|google-analytics\|sentry\|posthog" {} \; 2>/dev/null | while read file; do
|
||
echo " Отключение телеметрии в: $file"
|
||
# Комментируем только целые строки импорта
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*from.*telemetry/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*import.*telemetry/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*from.*analytics/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*import.*analytics/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*from.*tracking/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*import.*tracking/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*from.*sentry/s/^/# /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/^[[:space:]]*import.*sentry/s/^/# /' "$file" 2>/dev/null || true
|
||
done
|
||
|
||
echo "5. Отключение телеметрии во фронтенде..."
|
||
|
||
docker exec "${CONTAINER_NAME}" find /app/web -type f \( -name "*.js" -o -name "*.ts" -o -name "*.jsx" -o -name "*.tsx" \) \
|
||
! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" \
|
||
-exec grep -l "telemetry\|analytics\|tracking\|gtag\|ga(\|google-analytics\|sentry\|posthog" {} \; 2>/dev/null | while read file; do
|
||
echo " Отключение телеметрии в: $file"
|
||
docker exec "${CONTAINER_NAME}" sed -i '/import.*telemetry/s/^/\/\/ /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/from.*telemetry/s/^/\/\/ /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/import.*analytics/s/^/\/\/ /' "$file" 2>/dev/null || true
|
||
docker exec "${CONTAINER_NAME}" sed -i '/from.*analytics/s/^/\/\/ /' "$file" 2>/dev/null || true
|
||
done
|
||
|
||
echo "6. Отключение проверки обновлений..."
|
||
|
||
# Отключаем проверку обновлений в бэкенде (кроме OAuth)
|
||
docker exec "${CONTAINER_NAME}" find /app/backend -type f -name "*.py" \
|
||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||
! -name "*oauth*" ! -name "*oidc*" ! -name "*auth*" ! -name "*login*" \
|
||
! -path "*/utils/oauth*" ! -path "*/utils/auth*" \
|
||
! -path "*/open_webui/utils/oauth*" ! -path "*/open_webui/utils/auth*" \
|
||
! -path "*/open_webui/main.py" \
|
||
-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
|
||
|
||
# Отключаем проверку обновлений во фронтенде
|
||
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 "7. Удаление '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
|
||
|
||
# Удаляем футеры из бэкенда (кроме OAuth)
|
||
docker exec "${CONTAINER_NAME}" find /app/backend -type f \( -name "*.py" -o -name "*.html" \) \
|
||
! -path "*/oauth*" ! -path "*/oidc*" ! -path "*authentik*" ! -path "*openid*" \
|
||
! -name "*oauth*" ! -name "*oidc*" ! -name "*auth*" ! -name "*login*" \
|
||
! -path "*/utils/oauth*" ! -path "*/utils/auth*" \
|
||
! -path "*/open_webui/utils/oauth*" ! -path "*/open_webui/utils/auth*" \
|
||
! -path "*/open_webui/main.py" \
|
||
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 ""
|
||
echo "✓ Бэкенд файлы обработаны (телеметрия отключена)"
|
||
echo "✓ OAuth/Authentik файлы защищены"
|
||
echo "✓ Фронтенд файлы обработаны"
|
||
echo ""
|
||
|
||
echo "8. Перезапуск контейнера..."
|
||
|
||
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 " 4. Проверьте отсутствие телеметрии (DevTools → Network)"
|
||
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"
|