уведомления MAX на iPhone через свой сервер

Это мой первый опыт в программировании. Делал его с помощью AI, поэтому буду рад замечаниям, проверкам и идеям, как улучшить схему.

Собрал рабочую схему для уведомлений из MAX в ntfy через Docker на Synology.

Оригинальный репозиторий

За основу взят проект:

Оригинальный проект - macOS-приложение, которое отслеживает сообщения в веб-версии MAX и пересылает их в iMessage. В этой версии логика адаптирована под Docker и отправку уведомлений в ntfy.

Что получилось

  • MAX открывается в Chromium внутри контейнера
  • сессия MAX сохраняется в volume
  • новые сообщения отправляются в локальный ntfy
  • ntfy доступен через reverse proxy
  • на iPhone приходят push-уведомления через приложение ntfy
  • доступ закрывается авторизацией и правами на topic

Схема:

MAX -> max2notify -> ntfy -> iPhone

Что нужно

  • Synology / Container Manager
  • Docker
  • домен или внешний HTTPS-доступ к ntfy
  • приложение ntfy на iPhone
  • исходники проекта в папке /volume1/docker/max2imessage

Порты

  • 8099 - локальный ntfy
  • 3010 - статус и скрин входа MAX

Структура папки

/volume1/docker/max2imessage
├── docker-compose.yml
├── bridge
│   ├── package.json
│   └── src
│       └── index.js
├── Max2iMessage
│   └── Max2iMessage
│       └── Resources
│           └── max-monitor.js
├── ntfy
│   └── cache
└── accounts
    └── user

docker-compose.yml

services:
  ntfy:
    image: binwiederhier/ntfy
    command:
      - serve
      - --cache-file
      - /var/cache/ntfy/cache.db
    environment:
      TZ: Asia/Yekaterinburg
      NTFY_BASE_URL: https://ntfy.example.com
      NTFY_BEHIND_PROXY: "true"
      NTFY_UPSTREAM_BASE_URL: https://ntfy.sh
      NTFY_AUTH_FILE: /var/cache/ntfy/auth.db
      NTFY_AUTH_DEFAULT_ACCESS: deny-all
      NTFY_ENABLE_LOGIN: "true"
    volumes:
      - /volume1/docker/max2imessage/ntfy/cache:/var/cache/ntfy:rw
    ports:
      - "8099:80"
    restart: unless-stopped
    init: true

  max2notify:
    image: mcr.microsoft.com/playwright:v1.54.0-jammy
    working_dir: /app/bridge
    command: bash -lc "npm install --omit=dev && npm start"
    depends_on:
      - ntfy
    environment:
      MAX_URL: https://web.max.ru
      TARGET_TYPE: ntfy
      TARGET_URL: http://ntfy/max_user
      TARGET_USERNAME: maxbridge
      TARGET_PASSWORD: CHANGE_ME_BRIDGE_PASSWORD
      NTFY_TITLE: MAX
      NTFY_PRIORITY: high
      NTFY_TAGS: speech_balloon
      ACCOUNT_NAME: user
      PROFILE_DIR: /data/profile
      STATE_DIR: /data/state
      DEDUP_FILE: /data/state/dedup.json
      LOGIN_SCREENSHOT_FILE: /data/state/login.png
      PORT: 3000
      HEADLESS: "true"
    volumes:
      - /volume1/docker/max2imessage:/app:rw
      - /volume1/docker/max2imessage/accounts/user:/data:rw
    ports:
      - "3010:3000"
    restart: unless-stopped

Замените:

  • https://ntfy.example.com на свой домен
  • CHANGE_ME_BRIDGE_PASSWORD на пароль пользователя maxbridge

Настройка пользователей ntfy

В контейнере ntfy создаем пользователя для iPhone и пользователя для моста:

docker exec -it max2ntfy-ntfy-1 ntfy user add user
docker exec -it max2ntfy-ntfy-1 ntfy user add maxbridge

Выдаем права:

docker exec -it max2ntfy-ntfy-1 ntfy access user max_user read-write
docker exec -it max2ntfy-ntfy-1 ntfy access maxbridge max_user write-only
docker exec -it max2ntfy-ntfy-1 ntfy access

Логика:

  • user может читать topic max_user на iPhone
  • maxbridge может только писать в max_user
  • anonymous-доступ закрыт через NTFY_AUTH_DEFAULT_ACCESS: deny-all

Первый вход в MAX

После запуска откройте:

http://NAS_IP:3010/login.png

Там будет экран входа MAX. После авторизации проверьте:

http://NAS_IP:3010/healthz

Нормальный статус:

{
  "running": true,
  "authState": "authenticated",
  "monitorReady": true
}

Настройка iPhone

В приложении ntfy:

  • server: https://ntfy.example.com
  • username: user
  • topic: max_user

Для мгновенных push на iPhone нужен параметр:

NTFY_UPSTREAM_BASE_URL: https://ntfy.sh

Он нужен из-за особенностей iOS push. Текст сообщений через ntfy.sh не уходит; iPhone забирает реальные уведомления с вашего сервера.

Несколько пользователей

Для нескольких аккаунтов лучше делать отдельный max2notify на каждого:

max_user -> user
max_mom  -> mom
max_wife -> wife

Каждому аккаунту нужен свой volume и свой порт входа:

/volume1/docker/max2imessage/accounts/user -> 3010
/volume1/docker/max2imessage/accounts/mom  -> 3011
/volume1/docker/max2imessage/accounts/wife -> 3012

Так сессии MAX не конфликтуют друг с другом.

Ссылка для скачивания
Как работает: