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-стека не влияет на основное приложение
107 lines
4.3 KiB
Bash
107 lines
4.3 KiB
Bash
#!/usr/bin/env bash
|
||
# Bootstrap CouchDB для Obsidian Self-hosted LiveSync.
|
||
#
|
||
# Запускается ОДИН РАЗ после первого `docker compose up -d couchdb`.
|
||
# Идемпотентен — повторный запуск безопасен.
|
||
#
|
||
# Что делает:
|
||
# 1. Конвертирует single-node setup в "single-node configured" (требование CouchDB 3.x)
|
||
# 2. Включает CORS (нужно для Obsidian мобильного / browser-client)
|
||
# 3. Увеличивает max_http_request_size до 4 GiB (для крупных attachments)
|
||
# 4. Создаёт database `gendesign-vault` для самого vault
|
||
# 5. Создаёт database `_users` (системная, для multi-user в будущем)
|
||
#
|
||
# Использование:
|
||
# COUCHDB_PASSWORD=xxx ./scripts/setup-couchdb.sh
|
||
# # или на VPS:
|
||
# docker compose exec couchdb bash -c 'curl ...' # ручной путь
|
||
#
|
||
# Требует: curl. Запускать с хоста VPS (couchdb должен быть на 127.0.0.1:5984).
|
||
|
||
set -euo pipefail
|
||
|
||
COUCHDB_HOST="${COUCHDB_HOST:-http://localhost:5984}"
|
||
COUCHDB_USER="${COUCHDB_USER:-obsidian}"
|
||
COUCHDB_PASSWORD="${COUCHDB_PASSWORD:?COUCHDB_PASSWORD env var is required}"
|
||
VAULT_DB="${VAULT_DB:-gendesign-vault}"
|
||
|
||
AUTH="-u ${COUCHDB_USER}:${COUCHDB_PASSWORD}"
|
||
|
||
echo "=== 0. Wait for CouchDB ready ==="
|
||
for i in $(seq 1 30); do
|
||
if curl -fsS "${COUCHDB_HOST}/_up" >/dev/null 2>&1; then
|
||
echo " CouchDB up after ${i}s"
|
||
break
|
||
fi
|
||
sleep 1
|
||
done
|
||
|
||
echo "=== 1. Convert to 'configured single-node' (idempotent) ==="
|
||
curl -fsS ${AUTH} -X POST "${COUCHDB_HOST}/_cluster_setup" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"action":"enable_single_node","bind_address":"0.0.0.0","username":"'"${COUCHDB_USER}"'","password":"'"${COUCHDB_PASSWORD}"'"}' \
|
||
|| echo " (уже configured, OK)"
|
||
|
||
echo "=== 2. Системные базы ==="
|
||
for db in _users _replicator _global_changes; do
|
||
curl -fsS ${AUTH} -X PUT "${COUCHDB_HOST}/${db}" 2>&1 \
|
||
| grep -q '"ok":true\|"file_exists"' && echo " ${db}: OK"
|
||
done
|
||
|
||
echo "=== 3. Vault database '${VAULT_DB}' ==="
|
||
curl -fsS ${AUTH} -X PUT "${COUCHDB_HOST}/${VAULT_DB}" 2>&1 \
|
||
| grep -q '"ok":true\|"file_exists"' && echo " ${VAULT_DB}: OK"
|
||
|
||
echo "=== 4. CORS (для мобильных клиентов) ==="
|
||
cors_settings=(
|
||
"httpd/enable_cors true"
|
||
"cors/origins app://obsidian.md,capacitor://localhost,http://localhost"
|
||
"cors/credentials true"
|
||
"cors/methods GET,PUT,POST,HEAD,DELETE"
|
||
"cors/headers accept,authorization,content-type,origin,referer,x-csrf-token"
|
||
)
|
||
for kv in "${cors_settings[@]}"; do
|
||
key="${kv%% *}"
|
||
value="${kv#* }"
|
||
curl -fsS ${AUTH} -X PUT \
|
||
"${COUCHDB_HOST}/_node/_local/_config/${key}" \
|
||
-H "Content-Type: application/json" \
|
||
-d "\"${value}\"" >/dev/null
|
||
echo " ${key} = ${value}"
|
||
done
|
||
|
||
echo "=== 5. Размер запросов / chunks (для больших документов LiveSync) ==="
|
||
curl -fsS ${AUTH} -X PUT \
|
||
"${COUCHDB_HOST}/_node/_local/_config/chttpd/max_http_request_size" \
|
||
-H "Content-Type: application/json" \
|
||
-d '"4294967296"' >/dev/null
|
||
echo " chttpd/max_http_request_size = 4 GiB"
|
||
|
||
curl -fsS ${AUTH} -X PUT \
|
||
"${COUCHDB_HOST}/_node/_local/_config/couchdb/max_document_size" \
|
||
-H "Content-Type: application/json" \
|
||
-d '"50000000"' >/dev/null
|
||
echo " couchdb/max_document_size = 50 MB"
|
||
|
||
echo "=== 6. Auth settings (CouchDB 3.x требует session timeout для LiveSync) ==="
|
||
curl -fsS ${AUTH} -X PUT \
|
||
"${COUCHDB_HOST}/_node/_local/_config/chttpd_auth/require_valid_user" \
|
||
-H "Content-Type: application/json" \
|
||
-d '"true"' >/dev/null
|
||
curl -fsS ${AUTH} -X PUT \
|
||
"${COUCHDB_HOST}/_node/_local/_config/chttpd_auth/timeout" \
|
||
-H "Content-Type: application/json" \
|
||
-d '"7200"' >/dev/null
|
||
echo " chttpd_auth: require_valid_user=true, timeout=7200s"
|
||
|
||
echo ""
|
||
echo "=== DONE ==="
|
||
echo "CouchDB готова к Self-hosted LiveSync."
|
||
echo ""
|
||
echo "Клиенту Obsidian → Settings → Self-hosted LiveSync → Remote DB:"
|
||
echo " URL: https://obsidian.gendsgn.ru"
|
||
echo " Database: ${VAULT_DB}"
|
||
echo " User: ${COUCHDB_USER}"
|
||
echo " Password: <COUCHDB_PASSWORD>"
|
||
echo ""
|
||
echo "Дальше: 'Test Database Connection' → 'Apply Settings' → 'Replicate Now'."
|