ESP32-S3 firmware (PlatformIO) that fetches JPEGs from a photo server, decodes on-device with PSRAM, Floyd-Steinberg dithers to the Spectra 6 6-color palette, and displays on a 7.3" GDEP073E01 e-paper panel. Deep sleeps 1 hour between updates. Photo server (Python/Flask) with web UI for photo management, Traefik routing at photos.haunt.house with Google OAuth, and Home Assistant REST sensor integration. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1.5 KiB
YAML
41 lines
1.5 KiB
YAML
services:
|
|
photo-server:
|
|
build: .
|
|
container_name: eink-photo-server
|
|
restart: unless-stopped
|
|
networks:
|
|
- webgateway
|
|
volumes:
|
|
- photos:/photos
|
|
- state:/data
|
|
environment:
|
|
- TZ=America/Chicago
|
|
labels:
|
|
- "traefik.enable=true"
|
|
# HTTPS
|
|
- "traefik.http.routers.photos-websecure.rule=Host(`photos.haunt.house`)"
|
|
- "traefik.http.routers.photos-websecure.entryPoints=websecure"
|
|
- "traefik.http.routers.photos-websecure.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.photos-websecure.middlewares=hsts,google-auth@docker"
|
|
# HTTP redirect
|
|
- "traefik.http.routers.photos-http.rule=Host(`photos.haunt.house`)"
|
|
- "traefik.http.routers.photos-http.entryPoints=web"
|
|
- "traefik.http.routers.photos-http.middlewares=redirect-https"
|
|
# Internal port
|
|
- "traefik.http.services.photos.loadbalancer.server.port=8473"
|
|
# ESP32 endpoint — no auth (frame can't do OAuth)
|
|
- "traefik.http.routers.photos-frame.rule=Host(`photos.haunt.house`) && (Path(`/photo`) || Path(`/heartbeat`))"
|
|
- "traefik.http.routers.photos-frame.entryPoints=websecure"
|
|
- "traefik.http.routers.photos-frame.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.photos-frame.middlewares=hsts"
|
|
- "traefik.http.routers.photos-frame.priority=100"
|
|
- "traefik.http.routers.photos-frame.service=photos"
|
|
|
|
networks:
|
|
webgateway:
|
|
external: true
|
|
|
|
volumes:
|
|
photos:
|
|
state:
|