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 собирает статический сайт из заметок.
Почему так разделено
Так проще развивать систему:
- UI можно менять без изменения движка сборки.
- Движок можно тестировать на feature branch, не выкатывая release tag.
- Каждый garden остаётся обычным GitHub repo.
- Серверные операции централизованы в
gardenctl. - Сотрудник работает только в Obsidian и не думает про nginx/systemd/docker.