name: hobbs-family-organizer services: organizer: image: hobbs-family-organizer:1.0.0 build: context: . dockerfile: Dockerfile restart: unless-stopped init: true environment: NODE_ENV: production HOSTNAME: 0.0.0.0 PORT: "3000" TZ: ${ORGANIZER_TIMEZONE:-America/Chicago} ORGANIZER_TIMEZONE: ${ORGANIZER_TIMEZONE:-America/Chicago} WEATHER_LOCATION: ${WEATHER_LOCATION:-Sapulpa, OK} WEATHER_LATITUDE: ${WEATHER_LATITUDE:-35.9987} WEATHER_LONGITUDE: ${WEATHER_LONGITUDE:--96.11417} NWS_FORECAST_URL: ${NWS_FORECAST_URL:-https://api.weather.gov/gridpoints/TSA/37,98/forecast} WEATHER_USER_AGENT: ${WEATHER_USER_AGENT:-Hobbs-Family-Organizer/1.0 (self-hosted)} CALENDAR_ICAL_URLS_FILE: /run/secrets/calendar_ical_urls ORGANIZER_ACCESS_TOKEN_FILE: /run/secrets/organizer_access_token secrets: - calendar_ical_urls - organizer_access_token ports: - "${HOBBS_BIND_ADDRESS:-0.0.0.0}:${HOBBS_HTTP_PORT:-8080}:3000" read_only: true tmpfs: - /tmp:size=64m,mode=1777 - /app/.next-build/cache:size=128m,uid=10001,gid=10001,mode=0750 cap_drop: - ALL cap_add: - SETGID - SETUID security_opt: - no-new-privileges:true pids_limit: 128 stop_grace_period: 20s healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 20s logging: driver: json-file options: max-size: 10m max-file: "3" secrets: calendar_ical_urls: file: ./secrets/calendar_ical_urls.json organizer_access_token: file: ./secrets/organizer_access_token.txt