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
- Initiera Git lokalt i projektmappen
- Skapa GitHub-konto och lägga upp projektet
- Dokumentera Git-flödet lika tydligt som resten
- Överväga kalendernavigering i viewer-sidan
- 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.