feat: initial Luma implementation

Full self-hosted photo manager with:
- Ingestion worker (chokidar + sharp + exifr, dHash perceptual hashing)
- SQLite schema with WAL mode (photos, tags, collections, duplicate_pairs)
- Express API with keyset pagination, tag/collection/search/date filters
- React + Vite UI: timeline, lightbox, detail panel, tag/collection editors
- Duplicate detection (Union-Find grouping) with review + dismiss UI
- Map view (Leaflet + OpenStreetMap, marker clustering)
- Docker multi-stage build + Compose with inline env config
- GitHub Actions: CI build check + ghcr.io image publish on main/tags

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 4.6 committed 2026-08-17 16:33:55 -04:00
1 parent 03e6d6b628
commit e0f4e8ff0d
32 files changed
+4845

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
services:
server:
build: .
restart: unless-stopped
ports:
- "3000:3000"
environment:
PORT: "3000"
DB_PATH: /data/library.db
POSTER_DIR: /data/posters
NODE_ENV: production
volumes:
- luma_data:/data
- /your/photo/directory:/photos:ro # ← change this path
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
worker:
build: .
restart: unless-stopped
command: ["node", "worker/index.js"]
environment:
DB_PATH: /data/library.db
POSTER_DIR: /data/posters
PHOTO_DIR: /photos
volumes:
- luma_data:/data
- /your/photo/directory:/photos:ro # ← same path as server
depends_on:
server:
condition: service_healthy
volumes:
luma_data: