Har under en längre tid samlat på mig en hel del böcker i PDF-format. Problemet med att ha dem direkt på en surfplatta är ganska uppenbart: förr eller senare börjar lagringsutrymmet ta slut. Dessutom blir det besvärligt att hålla samma bibliotek tillgängligt från flera olika enheter.
Eftersom jag redan kör flera egna tjänster hemma blev lösningen ganska naturlig: böckerna får bo på en server och surfplattan får bara vara läsaren.
Resultatet blev ett självhostat bibliotek baserat på Calibre, Calibre-Web, Samba och Tailscale.
Servern: konservburkaMaskinen som fick uppdraget har det något föga glamorösa namnet konservburka.
Den visade sig dock ha betydligt mer kräm än namnet antyder:
- Intel Core i5-4460, fyra kärnor på 3,2 GHz
- 8 GB RAM
- 1 TB hårddisk
- Ubuntu 20.04 LTS
- cirka 840 GB ledigt diskutrymme
Servern används sedan tidigare för AtoM, Access to Memory, och kör därför bland annat nginx, MariaDB, Elasticsearch och PHP.
Trots detta låg systemets load praktiskt taget på noll och det fanns omkring 4 GB tillgängligt RAM. Det fanns alltså gott om resurser kvar för ett relativt lätt system som Calibre-Web.
All installation och konfiguration görs via Ansible, så att installationen går att återskapa senare.
Calibre och Calibre-WebSjälva bokbiblioteket lagras i:
/srv/books Calibre håller ordning på bibliotekets interna katalogstruktur och databasen:
/srv/books/metadata.db Ovanpå detta körs Calibre-Web, installerat i en separat Python virtual environment:
/opt/calibre-web/venv Calibre-Web körs under en egen systemanvändare:
calibreweb och startas automatiskt av systemd.
Webbgränssnittet lyssnar på port:
8083 Det innebär att serverns befintliga AtoM-installation kan fortsätta leva sitt eget liv utan att Calibre-Web behöver blanda sig i dess nginx-, PHP- eller databaskonfiguration.
Åtkomst utifrån med TailscaleEn viktig del av projektet var att biblioteket skulle vara tillgängligt även när jag inte befinner mig hemma.
På samma sätt som för andra tjänster i hemnätverket löstes detta med Tailscale.
Tailscale installerades på konservburka och servern anslöts till mitt befintliga tailnet. Calibre-Web kan därför nås från exempelvis surfplatta och mobil även när de använder 5G eller befinner sig på ett annat nätverk.
Ingen port behöver öppnas i routern och Calibre-Web behöver inte exponeras publikt mot internet.
I praktiken blir vägen:
Surfplatta │ │ Tailscale ▼ konservburka:8083 │ ▼ Calibre-Web │ ▼ /srv/books Böcker från den vanliga datornJag ville samtidigt ha ett enkelt sätt att lägga till böcker från min vanliga Windows-dator.
Att dela ut /srv/books direkt via Samba vore däremot ingen särskilt bra idé. Calibre vill själv bestämma hur katalogerna och filerna inne i biblioteket organiseras.
Därför skapades i stället en separat inkorg:
/srv/books-inbox/
├── incoming/
├── imported/
└── failed/ Katalogen incoming delas ut med Samba som:
\\konservburka\books-inbox Från Windows behöver jag därför bara kopiera en PDF eller EPUB till denna nätverksmapp.
Samba är konfigurerat så att filer som läggs där ägs av användaren calibreweb, vilket gör att rättigheterna fungerar genom hela kedjan.
För att slippa logga in på servern och manuellt importera varje ny bok skapades också ett litet Bash-script:
/usr/local/bin/calibre-import-books Scriptet letar efter bland annat:
- EPUB
- MOBI
- AZW/AZW3
- DjVu
- CBZ
- CBR
Filerna importeras med calibredb till det riktiga biblioteket i /srv/books.
Om importen lyckas flyttas originalfilen till:
/srv/books-inbox/imported Om något går fel hamnar den i:
/srv/books-inbox/failed På så sätt försvinner inte en bok bara för att Calibre av någon anledning inte lyckas importera den.
Systemd sköter automatikenImportscriptet körs genom en liten systemd-service:
calibre-book-import.service och en timer:
calibre-book-import.timer Timern kontrollerar inkorgen var femte minut.
Det färdiga arbetsflödet ser därför ut så här:
Windows
│
│
kopiera PDF/EPUB
▼ \\konservburka\books-inbox │
▼ /srv/books-inbox/incoming │
│ var femte minut ▼
calibre-book-import │ ├── misslyckad ──► failed/
│ └── lyckad ──────► imported/
│ ▼ calibredb
│ ▼ /srv/books
│ ▼ Calibre-Web
│ ▼ Tailscale
│ ▼ Surfplatta / mobil Första riktiga provetSom test kopierades PDF-filen:
Ereb Altor Världsboken.pdf till Samba-inkorgen.
Systemd-tjänsten upptäckte filen och loggen visade:
Importerar: Ereb Altor Världsboken.pdf Tillagda bokidentiteter: 3 Import lyckades: Ereb Altor Världsboken.pdf Boken dök därefter upp i Calibre-biblioteket och originalfilen flyttades korrekt till imported.
Katalogen failed förblev tom.
Med andra ord fungerade hela kedjan.
Resultatetkonservburka har därmed fått ytterligare ett arbete vid sidan av sin gamla arkivtjänst.
Det färdiga systemet ger mig ett centralt bibliotek där böckerna kan ligga kvar på serverns betydligt större hårddisk. Från den vanliga datorn lägger jag bara en bok i en nätverksmapp. Några minuter senare finns den i Calibre-Web.
När jag befinner mig hemma kan biblioteket nås över det vanliga nätverket. När jag är någon annanstans går trafiken via Tailscale.
Det innebär också att surfplattan inte längre behöver bära omkring på hela PDF-samlingen. Den behöver bara innehålla de böcker jag faktiskt vill ha tillgängliga offline.
Och kanske viktigast av allt: installationen ligger i en Ansible-playbook. Om konservburka en dag skulle gå vidare till den stora återvinningscentralen i skyn behöver jag alltså inte försöka komma ihåg hur allting sattes upp.
Jag kan bygga biblioteket igen.
📚 Nästa steg: fylla hyllorna.