Dokumentation
Shopify-apparna på jaktarjakt.se och driftlagret runt dem.
Uppdaterad 2026-07-20. Täcker Feedreader, Vidlib och drift (backup/övervakning). Kan utökas med portalens övriga delar.
Översikt
Vad som körs och var.
Två Shopify-appar driver videobiblioteket och dropship-sortimentet på jaktarjakt.se (butik te30e0-uv.myshopify.com). Båda körs på AWS-servern under processhanteraren PM2 och startar om automatiskt vid krasch eller serveromstart.
| App | Vad den gör | Port |
|---|---|---|
| feedreader | Hämtar leverantörernas produktflöden och håller produkter, lager och pris i synk i Shopify. Automatiserar order till leverantör. | 3010 |
| wix-migrator (Vidlib) | Videobiblioteket: synkar filmer från Vimeo/YouTube, bygger video- och kurssidor, grid med sök och filter. | 3011 |
Runt apparna finns ett driftlager: nattlig backup, en övervakning som larmar om något går ner, och automatisk omstart via PM2. Se avsnittet Drift.
Feedreader - Dropship-flöden
Leverantörernas XML-flöden blir produkter i Shopify.
Feedreader läser produktflöden (XML) från dina dropship-leverantörer och skapar eller uppdaterar motsvarande produkter i Shopify. Den håller lagersaldo och pris uppdaterade, och när en order kommer in skickas den vidare till rätt leverantör enligt reglerna du satt upp.
Hur synken fungerar
- Schemalagd synk körs var 15:e minut (kan ställas per butik).
- Synken kör bara skarpt när miljövariabeln SYNC_MODE=active. Det är en säkerhetsspärr: en test- eller stagingkopia kan aldrig råka skriva till den riktiga butiken.
- Bara det som ändrats skrivs till Shopify (oförändrade varianter hoppas över).
Så lägger du till ett flöde
- Öppna Feedreader-appen från Shopify admin.
- Under Lägg till leverantörsflöde: fyll i namn, leverantör och flödets URL.
- Klicka Sync för att köra direkt, eller vänta på nästa schemalagda körning.
Produktkategorier
Rena kategorier i stället för leverantörernas röriga sökvägar.
Tidigare skrev leverantörsflödena in hela sökvägen i Shopifys produkttyp, t.ex. Accessoarer / Bälten & Hängslen / Bälten. Det gav 144 olika värden och ett djupt nästlat, oanvändbart Produkttyp-filter.
Nu översätter Feedreader varje sökväg till en ren struktur i två nivåer, plus kön och den ursprungliga sökvägen sparad separat:
| Fält | Vad | Exempel |
|---|---|---|
| Produkttyp huvud | Huvudkategori, 24 rena värden | Byxor, Jackor, Accessoarer |
| custom.underkategori under | Underkategori, 37 värden | Jaktbyxor, Huvudbonader |
| custom.kon | Kön, för separat filter | Dam, Herr |
| custom.category_path | Ursprunglig sökväg (referens) | Byxor / Jaktbyxor / … |
Kön vägs alltså inte in i kategorin: Dam / Jaktbyxor och Herr / Jaktbyxor blir båda Byxor. Så slipper filtret dubbletter, och kön kan bli ett eget filter.
Så visas det för kunden
I appen Search & Discovery i Shopify visas två filter sida vid sida: Produkttyp (huvudkategori) och Kategori (underkategori). Produkttyp-filtret finns redan. För att slå på Kategori-filtret: lägg till ett filter på metafältet custom.underkategori (och ev. custom.kon som Kön).
Leverantörsregler
Hur en order skickas vidare till leverantören.
När en kund köper en dropship-produkt grupperar Feedreader orderraderna per leverantör och skickar iväg dem enligt den regel du satt upp för varje leverantör.
- E-post eller SFTP: ordern skickas som fil/meddelande till leverantören.
- Webhook: ordern postas till en URL.
- Manuell: bara loggas, för hantering för hand.
Alla försök loggas i Order Log i appen, med möjlighet att köra om misslyckade. En retry-arbetare försöker om automatiskt (upp till 5 gånger).
Vidlib - Videobibliotek
Filmer och kurser från Vimeo/YouTube, som sidor i butiken.
Vidlib synkar videor från Vimeo och YouTube till Shopify som metaobjekt, och ger varje video en egen sida. Det finns fyra typer:
| Typ | Vad | Sidadress |
|---|---|---|
| alla-filmer | De Wix-migrerade filmerna (huvudbiblioteket) | /pages/alla-filmer/… |
| vimeo_video | Filmer synkade från Vimeo | /pages/vimeo-videos/… |
| youtube_video | Filmer synkade från YouTube | /pages/youtube-videos/… |
| kurser | Kurssidor med avsnitt (medlemslåsta) | /pages/kurs/… |
Så synkar du filmer
- Öppna Vidlib-appen i Shopify admin, gå till Vimeo (eller YouTube).
- Bläddra i mappträdet och klicka Sync på en mapp eller en enskild film.
- Mappens namn blir filmens kategori. Kryssa i låst för medlemsvideor.
Kurser
En kurs är ett kurser-metaobjekt (titel, trailer, beskrivning) plus flera avsnitt (filmerkurser) som kopplas till kursen. Avsnitten är medlemslåsta och visas bara för inloggade kunder.
Grid & filter
Kundens sök- och filterupplevelse på filmsidorna.
Filmsidorna (t.ex. /pages/filmer) visar ett rutnät av videokort. Kunden kan smalna av med:
- Sök: fritextsök på titel och text.
- Kategori: rullgardin med de riktiga kategorierna (mappnamnen).
- Typ: Kurser eller Filmer (visas bara när båda finns).
- Åtkomst: Gratis eller För medlemmar (visas bara när det finns låsta).
- Sortering: Senaste, Titel A-Ö, eller Längd.
Allt filtrerande sker direkt i webbläsaren, med träffräknare, tomt-läge och en Rensa-knapp. Vilka filter som visas styrs i temat (sektionen Vidlib Content Layout).
Video-SEO
Strukturerad data så Google förstår filmerna.
Varje videosida skickar med en komplett VideoObject som strukturerad data (JSON-LD): namn, beskrivning, thumbnail, uppladdningsdatum, längd (ISO 8601) samt embed- och content-URL. Det var det Google Search Console saknade ("Missing field description"), nu åtgärdat på alla filmtyper.
- Saknar en film beskrivning fylls en standardtext i, så fältet aldrig saknas.
- Låsta filmer märks isAccessibleForFree: false och visar en inloggningsuppmaning i stället för spelaren. Sidan syns i Google, men själva filmen är kvar bakom inloggning.
- Varje film har en egen sida (kanonisk URL). Gridsidorna länkar dit, och Shopifys sitemap listar dem.
Backup
Nattlig säkerhetskopiering av all appdata.
Ett skript (/home/ubuntu/apps/backup-apps.sh) körs varje natt 03:30 och sparar en ögonblicksbild i /home/ubuntu/backups/, med 14 dagars historik. Varje ögonblicksbild innehåller:
- Feedreaders Postgres-databas (produkter, flöden, tokens) som .dump.
- Vidlibs data (segment, sidlayouter, inställningar, token) som .tar.gz.
- En checksummefil för integritet.
Så återställer du
# Feedreaders databas
pg_restore -d "$DATABASE_URL" --clean /home/ubuntu/backups/<datum>/feedreader-db.dump
# Vidlibs data
tar -xzf /home/ubuntu/backups/<datum>/vidlib-data.tar.gz -C /home/ubuntu/apps/wix-migrator/backend/data
Övervakning & larm
Upptäcker om en app går ner och larmar via e-post.
En vakthund (/home/ubuntu/apps/healthcheck.sh) körs var 5:e minut och kollar båda apparnas hälsokontroll och PM2-status. Den är läsande och kan inte skada något.
- Larmar när en app blir otillgänglig, sedan som mest en gång i timmen så länge den är nere, och skickar ett återställningsmeddelande när den är uppe igen. Inget spam.
- E-post via Microsoft Graph: larmen mejlas till daniel.bjorck@3fmediagroup.com. Skickas via samma Graph-appregistrering som 3F-portalen redan använder (behörigheten Mail.Send). Ingen SMTP behövs.
- Alla larm loggas dessutom i /home/ubuntu/monitor/alerts.log.
Testa larmet
node /home/ubuntu/apps/send-alert.js --verify # bekräftar Graph-anslutning
node /home/ubuntu/apps/send-alert.js "[TEST]" "Hej" # skickar ett testmejl
Deploy & utveckling
Var koden finns och hur en ändring går live.
| App | Katalog | GitHub |
|---|---|---|
| feedreader | /home/ubuntu/apps/feedreader | dbjorck/shopify-app |
| wix-migrator | /home/ubuntu/apps/wix-migrator | dbjorck/wix-migrator |
Backend (båda apparna)
cd /home/ubuntu/apps/<app>/backend # feedreader har inte /backend
npm run build # kompilerar TypeScript till dist/
pm2 restart <app> # startar om med ny kod
Vidlibs temafiler
Video- och gridsidornas Liquid ligger i temat. De pushas med hjälpskript i wix-migrator/backend/scripts/ (t.ex. deploy-video-templates.js --push), som skriver in filerna i det aktiva temat.