# Розгортання панелі обведення областей на VPS.
#
#   cp .env.example .env && $EDITOR .env      ← задай EDITOR_TOKEN
#   docker compose up -d --build
#
# Типово порт відкрито ТІЛЬКИ на 127.0.0.1 самого VPS — назовні нічого не
# світиться. Дістатися з ноутбука:
#
#   ssh -N -L 8765:127.0.0.1:8765 user@vps
#   → http://127.0.0.1:8765/editor/regions.html?token=…
#
# Так і має бути за замовчуванням: це сервіс, який пише файли на диск і
# запускає підпроцеси, а захищений одним токеном по HTTP. Через тунель
# токен не їде відкритим текстом і порт не сканується ботами.
#
# Потрібен доступ із браузера без тунелю — піднімай профіль `public`
# (Caddy, TLS, справжній домен). Див. DEPLOY.md.

services:
  editor:
    build: .
    image: bibletime-editor
    container_name: bibletime-editor
    restart: unless-stopped
    environment:
      ART_SRC: /app/forms/Level2_UA_form_v06.pdf
    command:
      - python
      - editor/serve.py
      - --host=0.0.0.0
      - --port=8765
      - --python=/usr/local/bin/python
      - --token=${EDITOR_TOKEN:?задай EDITOR_TOKEN у .env — латиниця й цифри}
      # `serve.py` перевіряє заголовок Host (захист від DNS-rebinding) і
      # типово знає лише власні адреси контейнера. Через тунель приходить
      # `localhost` — він дозволений завжди. Домен треба назвати явно.
      - --allow-host=${PUBLIC_HOST:-localhost}
    ports:
      # Змінити на "0.0.0.0:8765:8765" — значить виставити панель у голий
      # інтернет без TLS. Не роби цього; використовуй профіль `public`.
      - "127.0.0.1:8765:8765"
    volumes:
      # Робочі дані, які мають пережити перезбірку образу.
      - editor-data:/app/editor      # набори областей + PNG сторінок
      - forms-out:/app/forms         # PDF, які збирає art_apply.py
    healthcheck:
      test: ["CMD", "python", "-c",
             "import urllib.request as u; u.urlopen('http://127.0.0.1:8765/editor/regions.html', timeout=5)"]
      interval: 30s
      timeout: 10s
      start_period: 20s
      retries: 3

  # Разові прогони конвеєра на VPS, без піднятого сервера:
  #   docker compose run --rm cli python ua_build/fields_detect.py …
  #   docker compose run --rm cli python ua_build/art_apply.py regions_p16_q2_full.json
  #
  # Два обмеження, про які варто знати заздалегідь:
  #  * оригінали уроків лежать ПОЗА репозиторієм (`../lessons/`), тож для
  #    повного циклу `extract` → `build` підмонтуй їх сам, напр.
  #    `-v /srv/lessons:/lessons`, і передай шляхи явно;
  #  * Arial Black у контейнері підмінений (див. Dockerfile) — фінальні
  #    PDF для друкарні збирай на маку.
  cli:
    build: .
    image: bibletime-editor
    profiles: ["cli"]
    entrypoint: ["/usr/bin/tini", "--"]
    command: ["python", "-c", "print('вкажи команду: docker compose run --rm cli python …')"]
    volumes:
      - editor-data:/app/editor
      - forms-out:/app/forms

  # Публічний доступ по HTTPS зі справжнім доменом. Вмикається явно:
  #   PUBLIC_HOST=editor.example.com docker compose --profile public up -d
  # Caddy сам візьме сертифікат Let's Encrypt; порт 8765 назовні не потрібен.
  caddy:
    image: caddy:2-alpine
    container_name: bibletime-caddy
    profiles: ["public"]
    restart: unless-stopped
    environment:
      # Порожній PUBLIC_HOST → Caddy не підніметься. Це навмисно:
      # профіль public без домену не має сенсу.
      PUBLIC_HOST: ${PUBLIC_HOST}
      ACME_EMAIL: ${ACME_EMAIL:-}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy-data:/data
      - caddy-config:/config
    depends_on:
      - editor

volumes:
  editor-data:
  forms-out:
  caddy-data:
  caddy-config:
