gendesign/.github/workflows/deploy-obsidian.yml
lekss361 b0f5c38894 feat(deploy): split obsidian stack from main + path-filtered GHA
Obsidian Self-hosted LiveSync (CouchDB) выведен в отдельный docker-compose
stack и GHA workflow. Любой стек теперь редеплоится независимо.

* docker-compose.obsidian.yml: только couchdb в shared external network
* docker-compose.prod.yml: убрана couchdb-секция; caddy подключён к
  shared network для маршрута obsidian.gendsgn.ru → couchdb:5984
* .github/workflows/deploy-obsidian.yml: новый workflow с path-filters
  (триггерится только при изменениях obsidian-related файлов)
* .github/workflows/deploy.yml: + path-filters (триггерится только при
  main-related файлах) + создание shared network в bootstrap
* docs/obsidian-livesync.md: обновлены инструкции под split-архитектуру

После push:
1. ssh gendesign 'docker network create gendesign_shared'  (один раз)
2. Прописать COUCHDB_USER/PASSWORD в backend/.env.runtime
3. Добавить DNS A-record obsidian.gendsgn.ru → IP VPS
4. git push → GHA задеплоит обе части независимо

Преимущества:
- Изменения main не разрывают LiveSync клиентов
- Изменения obsidian не рестартуют main
- Падение obsidian-стека не влияет на основное приложение
2026-05-11 09:51:31 +03:00

97 lines
4.3 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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).
on:
push:
branches: [main]
paths:
- "docker-compose.obsidian.yml"
- "scripts/setup-couchdb.sh"
- "docs/obsidian-livesync.md"
- ".github/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).
# Эта же сеть используется Caddy в main-stack.
docker network inspect gendesign_shared >/dev/null 2>&1 \
|| docker network create gendesign_shared
# Стек CouchDB поднимается с собственным project-name,
# чтобы main `docker compose ps` не показывал его как часть main.
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