gardenctl

Серверные операции через gardenctl

Все команды выполняются на сервере из папки:

cd /home/supervisor/leonid_projects/duck-obsidian/.deploy

Главный entrypoint:

./gardenctl

Help

./gardenctl

Проверить сервер

./gardenctl doctor

Проверяет:

git
docker
docker compose
nginx
systemctl
journalctl
sudo
ss
sed

Создать garden

./gardenctl create \
  --slug obsidian-duck-guide \
  --domain obsidian-duck-guide.obsidians.otc.guru \
  --repo git@github.com:leo-mmmmmmm/obsidian-duck-guide.git \
  --port 8089 \
  --engine-version 1.0.18

Если --domain не указан:

<slug>.obsidians.otc.guru

Если --repo не указан:

git@github.com:leo-mmmmmmm/<slug>.git

Что делает create

1. Проверяет slug/domain/port.
2. Создаёт /home/supervisor/leonid_projects/obsidians/<slug>.
3. Клонирует repo в site/.
4. Если repo пустой, инициализирует его из duck-obsidian-template.
5. Создаёт/обновляет <slug>-vault/.
6. Пишет garden.config.json.
7. Пишет package.json dependency на @duck/garden-engine.
8. Пишет базовый config Digital Garden plugin.
9. Рендерит docker-compose.yml, Caddyfile, pull-and-rebuild.sh.
10. Рендерит nginx config.
11. Создаёт systemd service и timer.
12. Включает timer.
13. Запускает первый build.
14. Проверяет site/dist/index.html.
15. Включает HTTPS через certbot, если auto HTTPS разрешён.

Статус garden

./gardenctl status obsidian-duck-guide

Показывает:

systemd timer
systemd service
Docker container
listening ports
Obsidian vault path

Timer/service status

./gardenctl timer-status obsidian-duck-guide

Ручной эквивалент:

sudo systemctl status obsidian-duck-guide-pull.timer
sudo systemctl status obsidian-duck-guide-pull.service
systemctl list-timers --all obsidian-duck-guide-pull.timer --no-pager

Логи

./gardenctl logs obsidian-duck-guide

Ручной эквивалент:

journalctl -u obsidian-duck-guide-pull.service -f

Deploy log:

tail -n 120 /home/supervisor/leonid_projects/obsidians/obsidian-duck-guide/logs/deploy.log

Rebuild

./gardenctl rebuild obsidian-duck-guide

Внутри запускается:

FORCE_REBUILD=1 HARD_CLEAN=1 ./pull-and-rebuild.sh

Ручной эквивалент:

cd /home/supervisor/leonid_projects/obsidians/obsidian-duck-guide
FORCE_REBUILD=1 HARD_CLEAN=1 ./pull-and-rebuild.sh

Pause / resume

Остановить auto-update:

./gardenctl pause obsidian-duck-guide

Вернуть auto-update:

./gardenctl resume obsidian-duck-guide

Остановить только текущий rebuild:

./gardenctl stop-service obsidian-duck-guide

Подробнее: timers.

Все timers

./gardenctl timers

Список gardens

./gardenctl list

Upgrade одного garden

./gardenctl upgrade obsidian-duck-guide --to 1.0.18

Команда меняет в garden repo:

package.json
garden.config.json
package-lock.json

Потом коммитит:

Upgrade garden engine to v1.0.18

и запускает:

obsidian-duck-guide-pull.service

Upgrade всех gardens

./gardenctl upgrade-all --to 1.0.18

В production безопаснее сначала обновить один garden, проверить его, и только потом делать upgrade-all.

Подробнее: release и upgrade engine.

Destroy deployment

./gardenctl destroy obsidian-duck-guide \
  --domain obsidian-duck-guide.obsidians.otc.guru

Удаляет с сервера:

systemd timer/service
Docker containers
nginx config
local project directory

Не удаляет GitHub repo.

Без подтверждения:

./gardenctl destroy obsidian-duck-guide \
  --domain obsidian-duck-guide.obsidians.otc.guru \
  --yes

Безопасный порядок ручных production-правок

cd /home/supervisor/leonid_projects/duck-obsidian/.deploy
./gardenctl pause <slug>

cd /home/supervisor/leonid_projects/obsidians/<slug>/site
git status
# edit files
git add .
git commit -m "Your change"
git push origin main

cd /home/supervisor/leonid_projects/duck-obsidian/.deploy
./gardenctl rebuild <slug>
./gardenctl timer-status <slug>
./gardenctl resume <slug>