architecture

Карта архитектуры

Назначение системы

Duck Obsidian нужен, чтобы из Obsidian vault делать отдельные digital gardens и обслуживать их на одном сервере.

У каждого garden есть:

slug
домен
GitHub repo
Obsidian vault
systemd timer/service
Docker/Caddy container
nginx config

Пример production garden:

slug:   obsidian-duck-guide
domain: obsidian-duck-guide.obsidians.otc.guru
repo:   git@github.com:leo-mmmmmmm/obsidian-duck-guide.git
path:   /home/supervisor/leonid_projects/obsidians/obsidian-duck-guide

Поток публикации контента

1. Сотрудник пишет note в Obsidian.
2. Сотрудник запускает публикацию через Digital Garden plugin.
3. Plugin отправляет опубликованную заметку в GitHub garden repo.
4. На сервере systemd timer проверяет origin/main.
5. Если есть новый commit, запускается pull-and-rebuild.sh.
6. Скрипт делает pull/reset, npm install/build и перезапускает Caddy.
7. @duck/garden-engine собирает dist/.
8. Caddy отдаёт dist/ внутри контейнера.
9. Nginx проксирует публичный домен на локальный Caddy port.

Подробнее: редакторский workflow и production rebuild.

Поток админской панели

1. Админ открывает admin.obsidians.otc.guru.
2. Nginx защищает панель Basic Auth.
3. Static Next.js panel грузится из /var/www/duck-obsidian-panel.
4. UI отправляет запросы на /api/*.
5. Nginx проксирует /api/* на 127.0.0.1:3017.
6. Nginx добавляет Bearer token для backend API.
7. Backend API запускает gardenctl или systemctl/docker/nginx-команды.
8. Результат возвращается в UI.

Подробнее: админская панель и backend API панели.

Главные границы ответственности

duck-obsidian-panel не запускает shell-команды напрямую. Она только отправляет HTTP-запросы в API.

duck-obsidian управляет сервером: gardenctl, backend API, timers, docker, nginx, certbot.

duck-obsidian-template задаёт структуру нового garden repo.

duck-garden-engine собирает статический сайт из заметок.

Почему так разделено

Так проще развивать систему: