- Переведен файл README.md на русский язык и дополнен подробными инструкциями по упаковке и тестированию приложений для DFWebOS. - Создан файл lint-apps.yml для GitHub Actions для проверки приложений в запросах на слияние. - Обновлен файл .gitignore для добавления дополнительных временных и сборочных файлов. - Добавлены файлы .gitkeep для поддержания структуры каталогов конфигурационных данных в Emby и Jellyfin. - Создан файл dfwebos-app.yml для Emby с подробными метаданными и описанием. - Добавлен файл docker-compose.yml для конфигурации сервиса Emby. - Создан файл dfwebos-app.yml для Jellyfin с исчерпывающими сведениями о приложении. - Добавлен файл docker-compose.yml для конфигурации сервиса Jellyfin. - Реализован хук pre-start для Jellyfin для безопасной обработки миграций версий. Co-authored-by: Copilot <copilot@github.com>
153 lines
6.3 KiB
Bash
Executable File
153 lines
6.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Этот сценарий обрабатывает миграцию версий Jellyfin, чтобы обеспечить безопасное обновление через необходимые промежуточные версии.
|
||
|
||
set -euo pipefail
|
||
|
||
APP_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
|
||
APP_DATA_DIR="${APP_DIR}/data"
|
||
APP_COMPOSE_FILE="${APP_DIR}/docker-compose.yml"
|
||
JELLYFIN_SYSTEM_FILE="${APP_DATA_DIR}/config/system.xml"
|
||
JELLYFIN_UPDATE_FLAG_FILE="${APP_DATA_DIR}/POST_1_10_VERSION"
|
||
MIGRATION_IN_PROGRESS_FILE="${APP_DATA_DIR}/MIGRATION_IN_PROGRESS"
|
||
MIGRATION_FIX_FLAG="${APP_DATA_DIR}/MIGRATION_20250618_FIXED"
|
||
|
||
# Если файлы базы данных еще не существуют
|
||
# Тогда скорее всего это новая установка
|
||
# Создайте файл флага, чтобы указать, что это версия 1.10+.
|
||
if [[ ! -f "${JELLYFIN_SYSTEM_FILE}" ]]; then
|
||
touch "${JELLYFIN_UPDATE_FLAG_FILE}"
|
||
touch "${MIGRATION_FIX_FLAG}"
|
||
fi
|
||
|
||
# Выйти, если файл флага существует
|
||
if [[ -f "${JELLYFIN_UPDATE_FLAG_FILE}" ]]; then
|
||
echo "Jellyfin update flag file already exists at ${JELLYFIN_UPDATE_FLAG_FILE}. Skipping migration steps."
|
||
exit 0
|
||
fi
|
||
|
||
# Проверьте, выполняется ли уже миграция, чтобы предотвратить бесконечные циклы.
|
||
if [[ -f "${MIGRATION_IN_PROGRESS_FILE}" ]]; then
|
||
echo "Migration already in progress, exiting to prevent loops"
|
||
exit 0
|
||
fi
|
||
|
||
# Отметить миграцию как выполняемую
|
||
touch "${MIGRATION_IN_PROGRESS_FILE}"
|
||
|
||
# Функция очистки ловушки
|
||
cleanup() {
|
||
local exit_code=$?
|
||
if [[ $exit_code -ne 0 ]]; then
|
||
echo "Migration failed, cleaning up..."
|
||
# Восстановить исходный файл компоновки, если у нас есть исходное изображение.
|
||
if [[ -n "${original_server_image:-}" ]]; then
|
||
yq -i ".services.server.image = \"${original_server_image}\"" "${APP_COMPOSE_FILE}" 2>/dev/null || true
|
||
fi
|
||
fi
|
||
rm -f "${MIGRATION_IN_PROGRESS_FILE}"
|
||
}
|
||
trap cleanup EXIT
|
||
|
||
# Если файл флага не существует, сначала обновите его до версии 1.10.7, а затем перейдите к последней версии.
|
||
echo "No POST_1_10_VERSION flag found - performing update to v1.10.7 and then to latest version"
|
||
|
||
# Образы Docker для промежуточного шага v1.10.7
|
||
INTERMEDIATE_SERVER_IMAGE="linuxserver/jellyfin:10.10.7@sha256:01c9d2311eb7710867fb3a8c2718068a276cff468a71d2a2dc58a0f5165ad0d2"
|
||
|
||
# Получить текущие изображения с docker-compose.yml
|
||
get_current_images_from_compose() {
|
||
local server_image=$(yq '.services.server.image' "${APP_COMPOSE_FILE}" 2>/dev/null || echo "")
|
||
echo "${server_image}"
|
||
}
|
||
|
||
# Обновить файл компоновки новыми изображениями.
|
||
update_compose_images() {
|
||
local server_image="${1}"
|
||
|
||
yq -i ".services.server.image = \"${server_image}\"" "${APP_COMPOSE_FILE}"
|
||
}
|
||
|
||
# Сохраните исходное изображение для последнего шага.
|
||
original_server_image=$(get_current_images_from_compose)
|
||
|
||
echo "Step 1: Updating to v1.10.7 for safe migration"
|
||
update_compose_images "${INTERMEDIATE_SERVER_IMAGE}"
|
||
|
||
# Начните с версии 1.10.7
|
||
echo "Starting Jellyfin v1.10.7..."
|
||
"${DFWEBOS_ROOT}/scripts/app" start jellyfin
|
||
|
||
# Дождитесь завершения запуска и миграции.
|
||
echo "Waiting for v1.10.7 to complete startup and migrations..."
|
||
|
||
# Конечная точка опроса работоспособности с тайм-аутом
|
||
MAX_WAIT=300
|
||
POLL_INTERVAL=5
|
||
elapsed=0
|
||
|
||
while [[ $elapsed -lt $MAX_WAIT ]]; do
|
||
if curl -sf "http://localhost:8096/health" > /dev/null 2>&1; then
|
||
echo "Jellyfin v1.10.7 is healthy after ${elapsed}s"
|
||
# Дайте дополнительное время для завершения оставшихся миграций.
|
||
sleep 10
|
||
break
|
||
fi
|
||
sleep $POLL_INTERVAL
|
||
elapsed=$((elapsed + POLL_INTERVAL))
|
||
done
|
||
|
||
if [[ $elapsed -ge $MAX_WAIT ]]; then
|
||
echo "Warning: Jellyfin health check timed out after ${MAX_WAIT}s, proceeding anyway"
|
||
fi
|
||
|
||
# Остановить приложение
|
||
echo "Stopping Jellyfin v1.10.7..."
|
||
"${DFWEBOS_ROOT}/scripts/app" stop jellyfin
|
||
|
||
# Примените исправление таблицы UserDatas к library.db BEFORE. Запускается версия 10.11.5.
|
||
# При миграции MigrateLibraryDb в версии 10.11.5 library.db будет переименован в library.db.old.
|
||
# Тогда MigrateLibraryUserData попытается прочитать UserDatas из library.db.old.
|
||
# Поэтому мы добавляем таблицу в library.db сейчас, прежде чем она будет переименована.
|
||
LIBRARY_DB="${APP_DATA_DIR}/config/data/data/library.db"
|
||
if [[ -f "${LIBRARY_DB}" && ! -f "${MIGRATION_FIX_FLAG}" ]]; then
|
||
echo "Applying UserDatas table fix to library.db (before 10.11.5 renames it)..."
|
||
|
||
if python3 -c "
|
||
import sqlite3
|
||
conn = sqlite3.connect('${LIBRARY_DB}')
|
||
cursor = conn.cursor()
|
||
cursor.execute('''
|
||
CREATE TABLE IF NOT EXISTS UserDatas (
|
||
key TEXT NOT NULL,
|
||
userId TEXT NOT NULL,
|
||
rating REAL,
|
||
played INTEGER NOT NULL,
|
||
playCount INTEGER NOT NULL,
|
||
isFavorite INTEGER NOT NULL,
|
||
playbackPositionTicks INTEGER NOT NULL,
|
||
lastPlayedDate TEXT,
|
||
AudioStreamIndex INTEGER,
|
||
SubtitleStreamIndex INTEGER,
|
||
PRIMARY KEY (key, userId)
|
||
)
|
||
''')
|
||
conn.commit()
|
||
conn.close()
|
||
"; then
|
||
echo "UserDatas table fix applied successfully"
|
||
touch "${MIGRATION_FIX_FLAG}"
|
||
else
|
||
echo "Failed to apply UserDatas table fix"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo "Step 2: Updating to latest version"
|
||
update_compose_images "${original_server_image}"
|
||
|
||
# Создайте файл флага, чтобы предотвратить повторный запуск этой миграции.
|
||
touch "${JELLYFIN_UPDATE_FLAG_FILE}"
|
||
|
||
echo "Migration completed: v1.10.7 -> latest version"
|
||
echo "Created ${JELLYFIN_UPDATE_FLAG_FILE} flag file"
|