Bezpieczna granica aktualizacji Jellyfin to zestaw elementów środowiska uruchomieniowego i trwałego stanu, które muszą pozostać zgodne wersyjnie, możliwe do odzyskania i testowalne jako jedna jednostka zmiany.
W przypadku kontenera domowego serwera wymiana obrazu Jellyfin wygląda na banalną, ponieważ warstwa wykonywalna jest jednorazowa, ale baza danych, konfiguracja, wtyczki, ścieżki multimediów i stan generowany zachowują się podczas odtwarzania kontenerów. Nowa wersja może natychmiast przeprowadzić migrację tych trwałych struktur. Granica aktualizacji znajduje się tam, gdzie nowy kod zaczyna zmieniać stan, którego starszy kod może już nie rozumieć, dlatego wycofanie musi zachować zgodną kopię sprzed aktualizacji, a nie tylko stary tag obrazu.
Granica aktualizacji obejmuje więcej niż plik binarny Jellyfin
Aktualizacja zmienia kod wykonywalny, ale ten kod odczytuje i zapisuje trwały stan należący do dłuższego cyklu życia. Konfiguracja, rekordy użytkowników, historia oglądania, metadane biblioteki, stan wtyczek, struktury pamięci podręcznej i ścieżki systemu plików mogą uczestniczyć w uruchamianiu i migracji. Bezpieczna granica wskazuje, które z tych obiektów mogą zmieniać się razem, a które można zastąpić.
Przejście do wersji 10.11 pokazuje zakres problemu, ponieważ migracja bazy danych zmieniła sposób reprezentowania stanu biblioteki i ujawniła problemy operacyjne w kolejnych wydaniach poprawkowych. To zdarzenie związane z granicą aktualizacji: środowisko uruchomieniowe nie tylko wyświetla ten sam stary stan w inny sposób, lecz przekształca trwałe dane, od których zależą przyszłe uruchomienia.
Dla każdego wdrożenia należy spisać wersję środowiska uruchomieniowego, definicję hosta lub kontenera, ścieżki trwałych danych, katalogi wtyczek, zewnętrzne zależności uwierzytelniania, montowania multimediów oraz kopie zapasowe należące do tej zmiany. Jeśli operator nie potrafi wskazać tych obiektów, plan wycofania nie będzie wiedział, co trzeba przywrócić razem.
Wycofanie środowiska uruchomieniowego i wycofanie danych to różne operacje
Obraz kontenera można często szybko wymienić, ponieważ obraz jest niezmienny, a trwały wolumin pozostaje zachowany. Ta sama właściwość sprawia, że wycofanie bywa mylące: uruchomienie starszego obrazu na danych zmigrowanych już przez nowszą wersję może się nie powieść, mimo że stary plik binarny jest nienaruszony. Odwracalność środowiska uruchomieniowego nie oznacza odwracalności stanu.
Wytyczne dotyczące wdrażania baz danych wyraźnie rozróżniają te kwestie: wycofanie kodu jest bezpieczne tylko wtedy, gdy starsza aplikacja pozostaje zgodna ze schematem i danymi, które napotka. W przypadku Jellyfin prawdziwe wycofanie po migracji jednokierunkowej może wymagać przywrócenia stanu bazy danych i konfiguracji sprzed aktualizacji wraz z poprzednim środowiskiem uruchomieniowym.
Dlatego „zachowaj poprzedni tag Dockera” to niepełna ochrona. Stary obraz dowodzi, że można odtworzyć stary kod; kopia zapasowa dowodzi, że można odtworzyć stary stan. Bezpieczna granica aktualizacji utrzymuje te dwa obiekty odzyskiwania w parze i zapisuje, która wersja utworzyła kopię, aby przyszły operator nie przywrócił niezgodnych elementów niezależnie od siebie.
Migracje schematu tworzą najtrudniejszą granicę zgodności
Kod aplikacji można często ponownie wdrożyć, ale migracja schematu lub danych może przepisać rekordy do nowej postaci. Gdy destrukcyjne lub transformujące zmiany zostaną zatwierdzone, starsza wersja może nie wiedzieć, jak zinterpretować powstałą bazę danych. Najbezpieczniejszy proces aktualizacji traktuje zatem rozpoczęcie migracji jako moment, w którym stan odzyskiwania musi już być zapisany i zweryfikowany.
Aktualna analiza wycofania Jellyfin wskazuje na nieodwracalne migracje bazy danych jako powód, dla którego nowszej bazy danych nie można po prostu otworzyć starszą wersją serwera. Nawet jeśli każda migracja jest starannie zaprojektowana, operator powinien zakładać, że granica zgodności zależy od wersji, dopóki ścieżka odwrotna nie zostanie wyraźnie przetestowana.
Praktyczny wniosek to rozdzielenie pytań „czy mogę zatrzymać nowy kontener?” oraz „czy mogę przywrócić całą usługę do starego stanu?”. Pierwsze jest banalne; drugie wymaga zgodnych trwałych danych. Kopię migawkową lub zapasową sprzed aktualizacji należy zapisać jako część zgłoszenia zmiany i nie usuwać jej, dopóki zaktualizowany serwer nie przejdzie określonego okresu stabilnej pracy.
Wtyczki i interfejsy API klientów tworzą dodatkowe granice zgodności
Główny serwer może uruchomić się poprawnie, podczas gdy rozszerzenia lub klienci zawiodą, ponieważ zależą od interfejsów zmienionych w nowym wydaniu. Wtyczki mogą ładować kod po stronie serwera, dostawcy uwierzytelniania mogą wpływać na logowanie, a klienci mogą zależeć od działania API. Są to dodatkowe granice, ponieważ mogą zakłócić funkcje usługi nawet wtedy, gdy sama migracja bazy danych zakończy się powodzeniem.
Wtyczki mogą tworzyć własną granicę wersji, nawet gdy rdzeń Jellyfin uruchamia się poprawnie. Wydanie konserwacyjne JellyfinTweaks wprowadziło osobne manifesty i wyraźne wsparcie wersji 10.11, pokazując wsparcie wtyczki zależne od wersji. Wymagane wtyczki należy traktować jako zależności aktualizacji i testować je z docelową wersją serwera, zamiast zakładać, że poprawne uruchomienie procesu dowodzi zgodności.
Granica powinna być jasno określona w testach akceptacyjnych. Jeśli gospodarstwo domowe wymaga LDAP lub innej wtyczki uwierzytelniania, pomyślne logowanie lokalnego administratora nie wystarczy. Jeśli główny klient telewizyjny wymaga minimalnej wersji serwera lub zmienionego API, należy przetestować dokładnie tę parę. Gotowość do aktualizacji obejmuje zależności, których użytkownicy rzeczywiście potrzebują po przełączeniu.
Granica awarii: uruchomienie nowej wersji na jedynej dobrej kopii stanu uniemożliwia bezpieczne wycofanie
Niebezpiecznym momentem nie jest pobranie nowego obrazu, lecz dopuszczenie do tego, aby obraz zmodyfikował jedyną autorytatywną bazę danych i konfigurację, zanim zostanie potwierdzona kopia odzyskiwania. Jeśli aktualizacja zakończy się niepowodzeniem po częściowej migracji, wielokrotne eksperymentowanie na tym samym stanie może utrudnić odwrócenie pierwotnej awarii i zniszczyć czysty punkt odniesienia.
Wytyczne dotyczące testowania migracji baz danych zalecają bezpieczne wycofywanie migracji z użyciem danych testowych zbliżonych do produkcyjnych, prób przywracania i testów częściowych awarii, zamiast zakładać, że polecenia `up` i `down` dowodzą możliwości odzyskania. W przypadku Jellyfin produkcyjnym odpowiednikiem jest zweryfikowana kopia zapasowa lub migawka sprzed aktualizacji, której docelowa wersja nie zmodyfikuje, dopóki decyzja o wycofaniu nie będzie już potrzebna.
Tę kopię należy połączyć ze znanym zgodnym środowiskiem uruchomieniowym i udokumentowanymi mapowaniami ścieżek. Nieaktualna lub niepełna kopia może dawać fałszywe poczucie bezpieczeństwa, a dobra kopia bez pasującej definicji wdrożenia może przywrócić pustą bibliotekę lub uszkodzone uprawnienia. Bezpieczna granica to możliwy do odzyskania stan usługi, a nie sam plik bazy danych rozpatrywany w izolacji.
Stosuj protokół aktualizacji z zachowaniem par stanu
Przed zmianą przypnij bieżącą i docelową wersję, zapisz definicję wdrożenia, zinwentaryzuj wtyczki i wymaganych klientów, wykonaj spójną kopię trwałego stanu oraz co najmniej raz odtwórz tę kopię w izolacji. Podczas aktualizacji zatrzymaj niezwiązane automatyzacje, monitoruj zakończenie migracji i unikaj wielokrotnego odtwarzania stanu, jeśli pierwsza próba zakończy się niepowodzeniem wymagającym zebrania dowodów.
Analiza ZimaSpace dotycząca ścieżki migracji podczas uruchamiania potwierdza, dlaczego uruchamianie należy obserwować jako sekwencję operacji na trwałym stanie, a nie pojedyncze zdarzenie „kontener uruchomiony”. Akceptacja aktualizacji powinna obejmować zakończenie migracji, integralność biblioteki, użytkowników, stan oglądania, reprezentatywne odtwarzanie, wymagane wtyczki oraz czysty restart.
Zachowaj zestaw odzyskiwania sprzed aktualizacji do czasu przejścia tych kontroli w wybranym okresie obserwacji. Jeśli konieczne jest wycofanie, przywróć stare środowisko uruchomieniowe i powiązany z nim stan sprzed aktualizacji razem, zamiast mieszać wersje. Granicę można uznać za przekroczoną dopiero wtedy, gdy zarówno ścieżka aktualizacji, jak i ścieżka powrotu są zdefiniowane przed udostępnieniem danych produkcyjnych nowej wersji.
Centrum Technologii i Sztucznej Inteligencji
Więcej do przeczytania

Jak częstotliwość tworzenia kopii zapasowych wpływa na jakość punktu odtwarzania w Jellyfin?
Krótsze odstępy między kopiami zapasowymi mogą ograniczyć utratę stanu Jellyfin, ale jakość punktu odzyskiwania zależy również od spójności przechwytywania, historii przechowywania oraz przetestowanych procedur...

Jak Jellyfin wykrywa i synchronizuje zmiany między urządzeniami?
Spójność Jellyfin między urządzeniami jest oparta na serwerze: serwer wykrywa zmiany lub je otrzymuje, zapisuje stan, a klienci odświeżają dane na podstawie tego wspólnego...

Co powoduje, że Jellyfin przechowuje więcej danych tymczasowych, niż oczekiwano?
Tymczasowe dane Jellyfin mają różnych właścicieli i różny cykl życia; określ zasady przechowywania na podstawie twórcy, wartości ponownego użycia oraz wyzwalacza czyszczenia, który powinien...

