All checks were successful
Deploy Obsidian / deploy-obsidian (push) Successful in 1m59s
117 lines
5.4 KiB
YAML
117 lines
5.4 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).
|
||
#
|
||
# ИСТОРИЯ (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
|