Kilka lat temu wrocilem z dwutygodniowej wyprawy rowerowej po Pomorzu. Mialem ponad trzy tysiace zdjec. Lezaly na karcie pamieci, nikt ich nie ogladal, nikt nie komentowal. Wtedy zrozumialem, ze potrzebuje porzadnego narzedzia do porzadkowania i udostepniania fotografii. Nie chcialem jednak korzystac z chmury wielkich korporacji. Wolalem zbudowac cos wlasnego, na swoim serwerze.
Pomysl wydawal sie prosty. W praktyce okazal sie bardziej skomplikowany. Zaczalem od szukania gotowych rozwiazan open source. Znalazlem kilka ciekawych, ale zadne nie odpowiadalo moim potrzebom w stu procentach. W koncu postanowilem napisac wlasny skrypt w Pythonie i Flasku. To pozwolilo mi na pelna kontrole nad danymi i wygladem galerii. Jesli tez planujesz podobny projekt, warto zaczac od sprawdzenia, jak inni radza sobie z podobnymi wyzwaniami. Na przyklad na stronie https://auragdansk.pl mozna znalezc inspiracje, jak profesjonalnie prezentowac zdjecia w internecie, choc ich rozwiazanie jest komercyjne, a moje pozostaje hobbystyczne.
Pierwszym krokiem bylo skonfigurowanie serwera na Raspberry Pi. Postawilem na system Linux z lekkim serwerem Nginx. Podlaczylem dysk SSD, zeby przyspieszyc wczytywanie plikow. Zainstalowalem baze danych SQLite, bo nie potrzebowalem rozbudowanych relacji. Kazde zdjecie dostalo znaczniki z data, miejscem i opisem trasy. Wszystko dzialalo, ale interfejs byl surowy. Musialem dodac warstwe CSS, zeby galeria wygladala przyzwoicie na telefonie i na laptopie.
Oprogramowanie do obrobki zdjec na serwerze
Zdjecia prosto z aparatu maja ogromne rozmiary. Wczytywanie pelnych plikow na stronie trwaloby wieki. Napisalem skrypt, ktory automatycznie tworzy miniaturki. Uzywalem biblioteki Pillow w Pythonie. Skalowalem zdjecia do trzech rozmiarow: mala miniaturka do galerii, srednia do podgladu i pelny rozmiar do pobrania przy duzym wyswietlaczu. Dodatkowo dodalem obracanie na podstawie danych EXIF. Wiele zdjec z telefonu bywalo odwroconych – skrypt naprawial to automatycznie.
Potrzebowalem tez systemu tagowania. Kazda wycieczka miala swoja kategorie: szosa, gravel, mtb, city. Zdjecia dostawaly tez tagi geograficzne, jesli w EXIF byla zapisana szerokosc i dlugosc. Niestety nie wszystkie aparaty zapisuja GPS. Dlatego dodalem reczne mapowanie. Moge kliknac na zdjeciu i przypisac je do konkretnego punktu na mapie OpenStreetMap.
Bezpieczenstwo i dostep zdalny
Nie chcialem, zeby kazdy mogl ogladac moje prywatne zdjecia. Zastosowalem logowanie przez OAuth z Google. Tylko ja i kilka zaufanych osob mamy dostep. Dodatkowo wlaczylem HTTPS przez Let’s Encrypt. Certyfikat odnawia sie automatycznie. Zabezpieczylem tez koncowki API przed atakami SQL injection i XSS. Wszystkie zapytania do bazy przechodza przez parametryzowane prepared statements.
System ma tez opcje udostepniania pojedynczych albumow przez link bez hasla. To przydatne, gdy chce wyslac rodzinie zdjecia z wakacji. Link dziala przez 30 dni, potem wygasa. Zapisuje tez do logow, kto i kiedy ogladal dany album. To daje mi poglad, ktore zdjecia najbardziej interesuja innych.
Automatyczne tworzenie plikow wideo
Do kazdej wyprawy generuje automatycznie pokaz slajdow w formacie MP4. Skrypt laczy zdjecia w kolejnosci chronologicznej, dodaje przejscia i podklad muzyczny z wolnej licencji. Dlugosc filmu to maksymalnie 3 minuty, okolo 60 klatek. To latwiejsze do wyslania na WhatsApp niz cala galeria. Ostatnio probowalem dodac tez nakladanie mapy trasy w rogu ekranu. Wymagalo to synchronizacji z plikiem GPX z licznika rowerowego. Niby prosta rzecz, a zajelo mi dwa weekendy, zeby dzialalo poprawnie.
- Przygotowalem skrypt do odczytywania danych EXIF i zapisywania ich w bazie
- Zaimplementowalem system kolejek do przetwarzania duzych partii zdjec
- Dodalem mozliwosc recznego poprawiania lokalizacji, jesli GPS nie dzialal
- Naprawilem blad z pamiecia podreczna przy przetwarzaniu 1000+ zdjec
- Zintegrowalem system z usluga wysylania powiadomien o nowych albumach
- Stworzylem prosty edytor znacznikow czasu w interfejsie webowym
- Zabezpieczylem przesylanie plikow przed przekroczeniem limitu rozmiaru
Wnioski z kilku miesiecy uzytkowania
System dziala stabilnie od szesciu miesiecy. Przetworzylem juz ponad 15 tysiecy zdjec z roznych wypraw. Najwiekszym problemem okazala sie szybkosc generowania miniaturek na Raspberry Pi. Procesor sie grzeje, wiec musialem dodac radiator. Planuje przeniesc calosc na starszy laptop z Intel i5, ktory lepiej radzi sobie z wielozadaniowoscia. Mimo to jestem zadowolony. Moge teraz latwo wrocic do zdjec z konkretnej trasy i pokazac je znajomym bez wrzucania na Facebooka.
Zbudowanie wlasnego systemu do zdjec to nie tylko techniczne wyzwanie. To lekcja, jak wazne jest miec kontrole nad swoimi wspomnieniami i nie oddawac ich bezmyslnie wielkim platformom.
