name: ntfy
services:
  permissions:
    image: alpine:3.22
    user: "0:0"
    command: ["sh", "-c", "mkdir -p /data/attachments && chown -R 1000:1000 /data"]
    volumes:
      - ntfy-data:/data
    restart: "no"

  ntfy:
    image: binwiederhier/ntfy:${NTFY_VERSION:-v2.34.0}
    command: ["serve"]
    user: "1000:1000"
    restart: unless-stopped
    ports:
      - "127.0.0.1:${NTFY_PORT:-8083}:8080"
    environment:
      NTFY_LISTEN_HTTP: ":8080"
      NTFY_BASE_URL: ${NTFY_URL:-http://localhost:8083}
      NTFY_CACHE_FILE: /var/cache/ntfy/cache.db
      NTFY_CACHE_DURATION: 168h
      NTFY_AUTH_FILE: /var/cache/ntfy/user.db
      NTFY_AUTH_DEFAULT_ACCESS: deny-all
      NTFY_AUTH_USERS: ${NTFY_AUTH_USERS:?Set a private bcrypt administrator entry}
      NTFY_ENABLE_LOGIN: "true"
      NTFY_REQUIRE_LOGIN: "true"
      NTFY_ENABLE_SIGNUP: "false"
      NTFY_ATTACHMENT_CACHE_DIR: /var/cache/ntfy/attachments
      NTFY_ATTACHMENT_TOTAL_SIZE_LIMIT: 1G
      NTFY_ATTACHMENT_FILE_SIZE_LIMIT: 15M
      NTFY_ATTACHMENT_EXPIRY_DURATION: 168h
      NTFY_BEHIND_PROXY: "false"
      TZ: ${TZ:-Etc/UTC}
    volumes:
      - ntfy-data:/var/cache/ntfy
    depends_on:
      permissions:
        condition: service_completed_successfully
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/v1/health | grep -q 'healthy.*true'"]
      interval: 15s
      timeout: 5s
      retries: 10
      start_period: 20s
    read_only: true
    tmpfs:
      - /tmp:rw,noexec,nosuid,size=64m,mode=1777
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    stop_grace_period: 30s

volumes:
  ntfy-data:
    name: ${NTFY_DATA_VOLUME:-ntfy-data}
