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:
1 parent
03e6d6b628
commit
e0f4e8ff0d
32 files changed
+4845
No files matched your search
@@ -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:
|
||||
Reference in new issue
Block a user