Po kilku dniach użytkowania prywatnej instancji ↗ mastodon doszedłem do krytycznego momentu: zabrakło miejsca na serwerze. To z kolei sprawiło że baza danych Postgres przestała działać i w ostateczności Mastodon zwracał błąd 500. CO poszło nie tak?!
Miniseria
Co poszło nie tak?
Jakiś czas temu - tuż po publikacji wpisu o osobistej instancji ↗ - uruchomiłem na szybko monitoring serwera, dzięki czemu na bieżąco mam informacje o procesach, zajętości dysku oraz SWAP.
Największym problemem jest cache i przechowanie wszystkich assetów graficznych, pochodzących z obserwowanych przeze mnie profili, ale także z timeline całej federacji (szczególnie tych, do których ustawiłem przekaźniki).
Wbudowane mechanizmy do czyszczenia cache
Mastodon ma w sobie mechanizmy do czyszczenia cache czy optymalizacji systemu. Warto zajrzeć do dokumentacji - Using the admin CLI - Mastodon documentation ↗ - interesujące nas komendy:
-
tootctl cache clear
-
tootctl media remove-orphans
-
tootctl preview_cards remove
-
tootctl statuses remove
Subiektywnie, to nie za bardzo to działa. Jeśli nawet, to praktycznie niezauważalnie dla całego osobistego ekosystemu, bo w ostateczności doprowadziło do przekroczenia krytycznych zasobów i ubicia całego VPS.
Manualne usunięcie cache
Nie mając wiele do stracenia, zalogowałem się do serwera via SSH i usunąłem całą zawartość /mastodon/public/system/cache
za pomocą polecenia rm -rf /mastodon/public/system/cache
. Odzyskałem przestrzeń i mogłem ponownie wystartować własną instancję - różnica jest ogromna, bo mówimy o ponad 20 GB danych.
Druga strona medalu to niedostępne grafiki (avatary + covery profilów), które przewijały się przez cały czas na timeline. Gdy próbowałem pobrać grafiiki, to mój serwer zwracał 404
. Zastanawiam się, dlaczego mastodon ponownie nie pobrał tych grafik, skoro nie było ich w zasobie pamięci tymczasowej?
Tak czy siak, można odbudować cache poleceniem tootctl accounts refresh -all
. Przy czym zaznaczam: jest to operacja zasobo- / czaso- chłonna.
Retencja danych
Naiwnie uznałem, ze wartości 10d
sa optymalne dla ustawień retencji danych danego serwera. Po ww. krytycznej sytuacji szybko zmieniłem na 1d
i czekałem na to, co się stanie.
Z wykresu wynika, że cyklicznie gdzieś nad ranem system czyści się z niepotrzebnych rzeczy i tym samym odzyskujemy cenne miejsce na kolejne aktualizacje, avatary czy załączniki. I tak co 24 h.
Skrypt optymalizujący grafikę
Nadal nie dawało mi to spokoju, więc zacząłem przeglądać zgłoszone problemy w oficjalnym repo Mastodona i trafiłem na temat związany z brakiem optymalizacji multimediów ↗.
Delikatnie ucieszyłem się z faktu, iż nie jestem jedyną osobą, która ma ten problem. @phocks przygotował prosty skrypt ↗ do optymalizacji cache, przy wykorzystaniu 2 bibliotek do kompresji.
sudo apt install jpegoptim pngquant -y
a skrypty wygląda tak:
#!/usr/bin/env bash
cd /home/mastodon/live/public/system/cache
find -name '*.jpg' -print0 | xargs -0 jpegoptim --verbose --preserve --threshold=1 --max=45
find -name '*.jpeg' -print0 | xargs -0 jpegoptim --verbose --preserve --threshold=1 --max=45
cd /home/mastodon/live/public/system/cache/accounts
find -name '*.png' -print0 | xargs -0 pngquant --verbose --ext=.png --force --speed 10 --quality 45-50 --skip-if-larger
cd /home/mastodon/live/public/system/cache/media_attachments
find -name '*.png' -print0 | xargs -0 pngquant --verbose --ext=.png --force --speed 10 --quality 45-50 --skip-if-larger
cd /home/mastodon/live/public/system/cache/preview_cards
find -name '*.png' -print0 | xargs -0 pngquant --verbose --ext=.png --force --speed 10 --quality 45-50 --skip-if-larger
Sprawdza się znakomicie, więc można zautomatyzować proces, poprzez dodawanie go do crona i już. nie jestem pewien, czy tak to powinno się robić, ale jednak jako One-Man
swojego prywatnego serwera muszę tak to czynić.
Czyszczenie z poziomu dockera
A skoro mowa o skryptcie do optymalizacji cache i ogólnie multimediów, to warto też dodać poniższy skrypt:
docker exec -ti mastodon_web_1 /bin/sh -c "tootctl statuses remove && tootctl media remove --days=2 && tootctl preview_cards remove --days=2 && tootctl media remove-orphans && tootctl media usage"
Co robi?
-
logujemy się do dockera,
-
usuwamy niepotrzebne statusy
-
multimedia (załączniki, avatary czy covery) starsze niż 2d
-
wyświetla obecny stan uzycia mediów w mastadon
Czy to pomaga? Tak, zdecydowanie tak. Można odzyskać od 2-7GB danych dziennie. Mówimy o prywatnej instancji i trudno mi wyobrazić sytuację z kilkoma użytkownikami