name: roster-formatter services: app: build: context: . args: APP_UID: "${ROSTER_UID:-1000}" APP_GID: "${ROSTER_GID:-1000}" image: roster-formatter:local container_name: roster-formatter restart: unless-stopped init: true ports: - "127.0.0.1:${ROSTER_PORT:-8787}:8787" environment: ROSTER_OUTPUT_DIR: /app/output ROSTER_RETENTION_MONTHS: "${ROSTER_RETENTION_MONTHS:-3}" ROSTER_MAX_UPLOAD_MB: "${ROSTER_MAX_UPLOAD_MB:-20}" ROSTER_ALLOWED_HOSTS: "${ROSTER_ALLOWED_HOSTS:-}" TZ: "${TZ:-America/Chicago}" volumes: - ./output:/app/output:rw read_only: true tmpfs: - /tmp:size=256m,mode=1777 cap_drop: - ALL security_opt: - no-new-privileges:true stop_grace_period: 10s healthcheck: test: - CMD - python - -c - "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8787/health', timeout=3).read()" interval: 30s timeout: 5s retries: 3 start_period: 10s networks: - tabernet networks: tabernet: external: true name: tabernet