name: Deploy Obsidian

# Деплой ТОЛЬКО obsidian-стека (CouchDB).
# Триггерится при изменениях:
#   - docker-compose.obsidian.yml (compose сервиса CouchDB)
#   - scripts/setup-couchdb.sh    (bootstrap)
#   - docs/obsidian-livesync.md   (документация — для history-watcher'а)
#   - этот workflow
#
# Не пересобирает никаких Docker-образов (CouchDB официальный с DockerHub).
# Не трогает main-стек (backend / frontend / postgres / worker / beat / caddy).
#
# ИСТОРИЯ (2026-07-05): жил в .github/workflows/ с момента миграции с GitHub
# (16.05.2026), помечен в README как «остался на GitHub» — но живого зеркала
# на github.com с настроенными секретами не оказалось: 0 запусков за всю
# историю Forgejo Actions (12000+ прогонов остальных workflow), контейнер
# не пересоздавался с 17.05 до ручного SSH-фикса 04.07. Перенесён сюда —
# единственная директория, которую реально исполняет этот инстанс.
# См. issue #2416.

on:
  push:
    branches: [main]
    paths:
      - "docker-compose.obsidian.yml"
      - "scripts/setup-couchdb.sh"
      - "docs/obsidian-livesync.md"
      - ".forgejo/workflows/deploy-obsidian.yml"
  workflow_dispatch:

concurrency:
  group: deploy-obsidian
  cancel-in-progress: false

jobs:
  deploy-obsidian:
    runs-on: ubuntu-latest
    if: github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4

      - name: Deploy obsidian stack via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          port: ${{ secrets.DEPLOY_PORT || 22 }}
          script: |
            set -euo pipefail
            cd /opt/gendesign

            # Свежие конфиги из репо
            git fetch origin main
            git reset --hard origin/main

            # Создать shared network если её ещё нет (idempotent).
            docker network inspect gendesign_shared >/dev/null 2>&1 \
                || docker network create gendesign_shared

            # Загрузить COUCHDB_USER/PASSWORD из .env.runtime до compose up
            # (compose также читает .env.runtime через env_file, но
            # `${COUCHDB_PASSWORD:?...}` валидация требует переменную в shell).
            if [ -f backend/.env.runtime ]; then
                set -a
                # shellcheck source=/dev/null
                source backend/.env.runtime
                set +a
            fi
            if [ -z "${COUCHDB_PASSWORD:-}" ]; then
                echo "ERROR: COUCHDB_PASSWORD не задан в backend/.env.runtime"
                exit 1
            fi

            # Стек CouchDB поднимается с собственным project-name.
            docker compose -p gendesign-obsidian \
                -f docker-compose.obsidian.yml pull
            docker compose -p gendesign-obsidian \
                -f docker-compose.obsidian.yml up -d

            # Bootstrap CouchDB (CORS, db, лимиты) — idempotent
            if [ -f scripts/setup-couchdb.sh ]; then
                # Загружаем COUCHDB_PASSWORD из backend/.env.runtime если есть
                if [ -f backend/.env.runtime ]; then
                    set -a; source backend/.env.runtime; set +a
                fi
                # Ждём CouchDB up, потом bootstrap
                for i in $(seq 1 30); do
                    if docker compose -p gendesign-obsidian \
                          -f docker-compose.obsidian.yml \
                          exec -T couchdb curl -fsS http://localhost:5984/_up >/dev/null 2>&1; then
                        break
                    fi
                    sleep 2
                done
                COUCHDB_HOST=http://localhost:5984 \
                COUCHDB_USER="${COUCHDB_USER:-obsidian}" \
                COUCHDB_PASSWORD="${COUCHDB_PASSWORD:?must be set in backend/.env.runtime}" \
                docker compose -p gendesign-obsidian \
                    -f docker-compose.obsidian.yml \
                    exec -T couchdb bash -c "$(cat scripts/setup-couchdb.sh)" \
                    || echo "(bootstrap warnings ignored — script is idempotent)"
            fi

            # Caddy в main-stack — НЕ перезапускаем тут (другой workflow),
            # но reload конфига полезен на случай если в Caddyfile добавили
            # новый obsidian-route только что (главное: image main caddy уже
            # запущен и подключён к gendesign_shared network).
            if docker compose -p gendesign -f docker-compose.prod.yml ps caddy --quiet \
                   | grep -q .; then
                docker compose -p gendesign -f docker-compose.prod.yml \
                    exec -T caddy caddy reload --config /etc/caddy/Caddyfile \
                    || echo "(caddy reload skipped — main stack not running)"
            fi

            sleep 3
            curl -fsS https://obsidian.gendsgn.ru/_up | head -c 200 || true
