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-стека не влияет на основное приложение
97 lines
4.3 KiB
YAML
97 lines
4.3 KiB
YAML
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
|