Simrishamn – Projektdokumentation

Det här projektet bygger en snabb, lokal och publik bildvisningslösning för landskapsbilder från Simrishamn. Bilderna hämtas från Google Drive till en VPS, publiceras via Docker och Caddy, och kan visas både direkt på projektets egen domän och inbäddat i WordPress på en annan server.

Startsida Galleri Viewer Filvy Docker Caddy Google Drive WordPress-embed

Projektmål

Målet är att skapa en snabb och kontrollerad lösning för att visa samma landskap över tid, samtidigt som projektet fungerar som praktisk träning i:

VPS och Docker

Bygga och köra en egen webbdel på VPS med tydlig struktur.

Google Drive-synk

Hämta bilder från Drive till lokal disk, i stället för att läsa dem live från Drive vid varje sidvisning.

Snabb publik visning

Skapa en viewer som är snabb, enkel och lätt att bädda in i WordPress.

Framtida utveckling

Förbereda för Git, GitHub, timelapse och eventuell kalendernavigering senare.

Status just nu Fungerar

Projektet är nu i ett mycket bra och användbart läge. Hela kedjan från Google Drive till publik WordPress-visning fungerar.

Bildkälla

Google Drive används som källsystem för bilderna.

Lokal kopia

Bilder synkas till VPS:en och lagras i data/images/.

Viewer

En snabb viewer med huvudbild, tidskontroller och miniraster finns på /viewer.html.

WordPress

WordPress bäddar in viewer-sidan via iframe i ett särskilt embed-läge.

Projektstruktur

/home/peter/docker/
├── portainer-caddy/
│   ├── Caddyfile
│   └── compose.yaml
└── simrishamn/
    ├── compose.yaml
    ├── .gitignore
    ├── README.md
    ├── app/
    │   ├── index.html
    │   ├── gallery.html
    │   ├── viewer.html
    │   ├── image.html
    │   ├── data/
    │   │   └── images.json
    │   └── docs/
    │       └── index.html
    ├── data/
    │   └── images/
    ├── nginx/
    │   └── default.conf
    └── scripts/
        ├── build_gallery.sh
        ├── build_images_json.sh
        └── update_all.sh

app/

Det som serveras på webben: startsida, viewer, helbild, galleri och dokumentation.

data/images/

Den lokala bildsamlingen som synkas från Google Drive.

app/data/images.json

Metadatafil som genereras från bildmappen och används av viewer-sidan.

scripts/

Projektets hjälpskript för galleri, metadata och samlad uppdatering.

Vad vi gjort hittills

1. Valde en tydlig toppstruktur

Alla Dockerprojekt placerades under ~/docker/ i stället för att spridas ut i hemkatalogen.

2. Skapade projektmappen simrishamn

Grundstruktur för app, data, scripts och dokumentation sattes upp.

3. Startade en enkel webbcontainer

En Nginx-container sattes upp för att servera innehåll från app/.

4. Kopplade domän och HTTPS via Caddy

Projektet blev tillgängligt på simrishamn.r8n.net via befintlig central Caddy-installation.

5. Konfigurerade rclone mot Google Drive

Efter autentisering sattes en fungerande koppling upp till Drive, där rätt bildmapp identifierades.

6. Synkade bilder lokalt

Bilderna kopierades från Google Drive till data/images/ på VPS:en.

7. Exponerade bildmappen i Nginx

Bildfilerna blev nåbara via /images/, vilket gav en första enkel filvy i webben.

8. Byggde ett första galleri

Först testades manuell HTML, sedan ersattes detta av automatisk generering av gallery.html.

9. Skapade metadatafilen images.json

Ett script skapades för att filtrera rätt filer, tolka datum ur filnamn och skapa snygga visningsnamn.

10. Byggde viewer.html

Viewer-sidan visar en huvudbild, snygg titel, bildnummer, nyare/äldre, hopp i tiden och ett miniraster för senaste perioden.

11. Lade till embed=1

Viewer-sidan fick ett särskilt inbäddningsläge för WordPress, med renare och mer kompakt presentation.

12. Byggde image.html

En separat helbildssida skapades för att ge bättre fullscreen-känsla när användaren klickar från iframe-läget.

13. Skapade samlat uppdateringsscript

update_all.sh byggdes för att synka från Drive och sedan generera om metadata och galleri.

14. Lade in daglig cron-körning

Automatisk uppdatering sattes upp så att nya bilder kan komma in dagligen utan manuell körning.

15. Ersatte den gamla WordPress-visningen

Den tidigare långsamma Google Apps Script-lösningen ersattes med den lokala och snabbare viewer-sidan via iframe.

Huvudkomponenter

gallery.html

Automatiskt genererad gallerisida som visar många bilder samtidigt.

viewer.html

Den huvudsakliga visningssidan för publik användning, med fokus på en bild i taget och tidsnavigation.

viewer.html?embed=1

En renare variant av viewer-sidan som är anpassad för inbäddning i WordPress via iframe.

image.html

Helbildssida som öppnas från embed-läget när användaren klickar på huvudbilden.

Visningsnamn

Bilderna visas inte med råa filnamn utan med ett mänskligt läsbart format, till exempel:

Simrishamn (Skansen) 2026-03-18 kl. 06:30

Detta skapas utifrån filnamnets datum- och tidsdelar.

Filtrering

Endast filer som matchar rätt kameramönster tas med i metadata och visning. Detta gör att andra filer i mappen ignoreras.

Simrishamn_YYYYMMDD_HHMMSS_Scheduled_Email_for_Simrishamn_*.jpg

Nuvarande konfiguration

Compose för webbcontainern

services:
  web:
    image: nginx:alpine
    container_name: simrishamn-web
    restart: unless-stopped
    ports:
      - "8081:80"
    volumes:
      - ./app:/usr/share/nginx/html:ro
      - ./data/images:/data/images:ro
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    networks:
      - frontend

networks:
  frontend:
    external: true
    name: portainer-caddy_frontend

Nginx-konfiguration

server {
    listen 80;
    server_name _;

    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location /images/ {
        alias /data/images/;
        autoindex on;
    }
}

Caddy-route

simrishamn.r8n.net {
    reverse_proxy simrishamn-web:80
}

WordPress-integrationen

WordPress-sidan ligger på en annan server, men den nya lösningen bäddas in där via iframe från VPS:en. På så sätt ligger all tung bildlogik kvar på den snabbare och lokalt kontrollerade sidan.

WordPress-kod

<iframe
  src="https://simrishamn.r8n.net/viewer.html?embed=1"
  style="width:110%;max-width:1200px;height:73vh;border:0;display:block;margin:20px auto"
  loading="lazy">
</iframe>

Beteende i WordPress

Embed-läge

Viewer-sidan visas utan extra toppmeny och med kompakt layout.

Huvudbild

Klick på huvudbilden öppnar en separat helbildssida i toppnivån.

Mobil

Helbildssidan fungerar även på mobil, inklusive liggande läge.

Prestanda

Lösningen är mycket snabbare än att läsa bilderna direkt från Google Apps Script/Drive vid varje laddning.

Automation

Samlat uppdateringsscript

#!/bin/sh

PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LOG_PREFIX="[simrishamn-update]"

echo "$LOG_PREFIX start $(date '+%Y-%m-%d %H:%M:%S')"

mkdir -p "$PROJECT_ROOT/data/images" || exit 1

echo "$LOG_PREFIX sync from Google Drive"
rclone copy "drive:Cam_Simrishamn" "$PROJECT_ROOT/data/images" || exit 1

echo "$LOG_PREFIX build images.json"
"$PROJECT_ROOT/scripts/build_images_json.sh" || exit 1

echo "$LOG_PREFIX build gallery.html"
"$PROJECT_ROOT/scripts/build_gallery.sh" || exit 1

echo "$LOG_PREFIX done $(date '+%Y-%m-%d %H:%M:%S')"

Cron

15 6 * * * /home/peter/docker/simrishamn/scripts/update_all.sh >> /home/peter/docker/simrishamn/update.log 2>&1

Detta gör att projektet automatiskt uppdateras dagligen med nya bilder, ny metadata och nytt galleri.

Varför lösningen ser ut så här

Lokal kopia är snabbare

Bilderna läses inte live från Google Drive vid varje sidvisning, vilket ger klart bättre prestanda.

WordPress hålls enkelt

WordPress behöver bara bädda in sidan. All logik ligger kvar på VPS:en där den är lättare att kontrollera.

Metadata separeras från filer

images.json gör att viewer-sidan kan bli snabb och senare byggas ut med fler funktioner som kalender.

Komponenter med tydliga roller

Galleri, viewer, helbild och automation hålls isär, vilket gör systemet enklare att förstå och vidareutveckla.

Viktiga kommandon

Starta om webbprojektet

cd ~/docker/simrishamn
docker compose down
docker compose up -d

Synka bilder manuellt

rclone copy "drive:Cam_Simrishamn" ~/docker/simrishamn/data/images

Bygg om metadata

cd ~/docker/simrishamn
./scripts/build_images_json.sh

Bygg om galleri

cd ~/docker/simrishamn
./scripts/build_gallery.sh

Kör hela uppdateringskedjan

cd ~/docker/simrishamn
./scripts/update_all.sh

Visa logg

tail -50 ~/docker/simrishamn/update.log

Nästa steg Senare

  1. Initiera Git lokalt i projektmappen
  2. Skapa GitHub-konto och lägga upp projektet
  3. Dokumentera Git-flödet lika tydligt som resten
  4. Överväga kalendernavigering i viewer-sidan
  5. Bygga timelapse som nästa större fas

Anteckningar

- Bilder ska inte lagras i Git.
- WordPress använder viewer-sidan via iframe, men bildlogiken ligger kvar på VPS:en.
- image.html används för bättre helbildskänsla än vad en iframe-lightbox kan ge.
- images.json är en viktig grund för framtida funktioner, t.ex. kalender och datumhopp.
- Projektet är nu i ett bra stoppställe innan nästa fas med Git och GitHub.