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