# Сервер A4 для WOPI-хозяев: Битрикс24 (модуль a4office.wopi), Nextcloud и другие.
#
# Три редактора — F1 (таблицы), A4 (документы), P2 (презентации) — и общий адрес
# discovery для таблиц и документов. Образы те же, что в docker-compose.yml, ставятся
# из архивов комплекта (`docker load -i …`); интернет при установке не нужен.
#
# ПЕРЕД ЗАПУСКОМ создайте рядом файл .env с двумя адресами (без косой черты в конце):
#
#   PORTAL_URL=https://portal.example.ru     # адрес портала Битрикс24, как его видит браузер
#   EDITORS_URL=https://office.example.ru    # адрес этого сервера за обратным прокси (nginx-wopi.conf)
#
# Оба адреса должны открываться и из браузера сотрудников, и с этой машины.
# Запуск: docker compose -f docker-compose-wopi.yml up -d
#
# Что где слушает (только 127.0.0.1, наружу выводит nginx из nginx-wopi.conf):
#   8092  F1   — /f1/
#   8090  A4   — /a4/
#   8094  P2   — /p2/
#   8096  общий discovery таблиц и документов — /hosting/discovery
#
# Адреса для настроек модуля Битрикс24:
#   discovery таблиц и документов   ${EDITORS_URL}/hosting/discovery
#   discovery презентаций P2        ${EDITORS_URL}/p2/hosting/discovery
#
# Форма флагов: значение отдельной строкой списка (`- --public-url` и ниже адрес).
# Форма `--флаг=значение` молча отбрасывается.
name: a4-server-wopi

x-proof: &proof
  # Один proof-ключ на F1 и A4: общий discovery публикует один ключ, и хозяин
  # проверяет им подписи обоих редакторов. Ключ создаётся при первом запуске.
  A4OFFICE_WOPI_PROOF_DIR: /proof

services:
  f1:
    image: f1-webhost:2026.4.0.20261017
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8092:8092"]
    volumes: ["f1-cabins:/data/cabins", "f1-wopi:/data/wopi", "proof:/proof"]
    environment:
      <<: *proof
      PORTAL_URL: ${PORTAL_URL:?укажите PORTAL_URL в .env}
      EDITORS_URL: ${EDITORS_URL:?укажите EDITORS_URL в .env}
      FASTSHEET_DESKTOP_SURFACE_LOCALE: ru
      FASTSHEET_DESKTOP_MENU_LOCALE: ru
      # Прячет служебную строку «Сборка …» в строке состояния.
      WEBHOST_NO_EXTRA_SURFACES: "1"
    # F1 в режиме WOPI: менеджер кабинок на внутреннем порту 8095 и перед ним
    # WOPI-фасад на 8092. Фасад ходит только к хосту портала (--wopi-allow).
    entrypoint:
      - sh
      - -c
      - |
        set -e
        mkdir -p /data/cabins /data/wopi
        portal_host=$$(printf '%s' "$$PORTAL_URL" | sed -E 's#^[a-zA-Z]+://##; s#[:/].*$$##')
        node apps/desktop-shell/webhost/cabin-manager.mjs \
          --docs-dir /data/cabins --template /app/blank.xlsx --port 8095 \
          --base-path /f1 --max-cabins 12 --idle-min 30 --ui-locale ru \
          --auth-url http://127.0.0.1:8092/v1/me \
          --attach-url 'http://127.0.0.1:8092/v1/attachments/{id}/content' &
        exec node apps/desktop-shell/webhost/wopi-facade.mjs \
          --port 8092 --manager http://127.0.0.1:8095 \
          --public-url "$$EDITORS_URL/f1" \
          --state-dir /data/wopi --idle-min 30 --wopi-allow "$$portal_host"

  a4:
    image: a4-webhost:2026.4.0.38487392181
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8090:8090"]
    volumes: ["a4-cabins:/data/cabins", "proof:/proof"]
    environment:
      <<: *proof
      # Серверу не нужно окно учётной записи настольной программы.
      A4_ACCOUNT_GATE: "off"
    command:
      - --base-path
      - /a4
      - --max-cabins
      - "12"
      - --idle-min
      - "30"
      - --ui-locale
      - ru
      # Кому A4 отдаёт и откуда принимает файлы по WOPI — адрес портала.
      - --wopi-hosts
      - ${PORTAL_URL:?укажите PORTAL_URL в .env}
      # Каким адресом A4 виден браузеру — попадает в discovery.
      - --public-url
      - ${EDITORS_URL:?укажите EDITORS_URL в .env}/a4

  p2:
    image: p2-server:2026.4.0.29
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8094:8090"]
    volumes: ["p2-data:/data"]
    healthcheck:
      test: ["CMD", "node", "-e", "fetch(process.argv[1]).then(r=>process.exit(r.ok?0:1),()=>process.exit(1))", "http://127.0.0.1:8090/p2/hosting/discovery"]
      interval: 30s
      timeout: 5s
    # Точка входа образа включает режим «папка»; для WOPI задаём её явно.
    # У P2 свой discovery и свой ключ — в модуле Битрикс24 это отдельное поле.
    entrypoint: ["node", "/app/slides-server.mjs"]
    command:
      - --wopi
      - --host
      - 0.0.0.0
      - --port
      - "8090"
      - --dist
      - /app/dist
      - --idle-min
      - "30"
      # Подпуть за прокси: P2 строит свои ссылки с ним (/p2/d/…, /p2/hosting/…).
      - --base-path
      - /p2
      - --public-url
      - ${EDITORS_URL:?укажите EDITORS_URL в .env}/p2
      - --proof-key-file
      - /data/wopi-proof-key.pem

  discovery:
    # Склейка discovery F1 + A4 в один ответ. Тот же образ F1 — в нём есть node.
    image: f1-webhost:2026.4.0.20261017
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8096:8096"]
    volumes: ["./discovery-merge.mjs:/kit/discovery-merge.mjs:ro"]
    environment:
      F1_DISCOVERY: http://f1:8092/hosting/discovery
      A4_DISCOVERY: http://a4:8090/a4/hosting/discovery
      PORT: "8096"
    entrypoint: ["node", "/kit/discovery-merge.mjs"]
    depends_on: [f1, a4]

volumes:
  f1-cabins:
  f1-wopi:
  a4-cabins:
  p2-data:
  proof:

# Проверка после запуска — на самой машине:
#   curl -s http://127.0.0.1:8096/hosting/discovery | grep -o 'ext="[a-z]*"' | sort -u
#     → ext="docx" ext="xlsb" ext="xlsm" ext="xlsx"
#   curl -s http://127.0.0.1:8094/p2/hosting/discovery | grep -o 'ext="pptx"' | head -1
# Ответ 502 у общего discovery с текстом «разные proof-ключи» — у F1 и A4 не общий
# том proof; поднимите оба заново этим файлом.
