Три типичных отказа на общем узле
- Перезапись чужого конфига. Два пайплайна деплоят в один путь; после ночного прогона «пропадают» webhook или лимиты очереди соседнего проекта потому что последний render затёр общий файл.
- Невозможность аудита. Смешанные логи без префикса проекта усложняют расследование и повышают риск утечки полей между командами.
- Избыточные токены. Один API‑ключ на весь кластер даёт право трогать чужие очереди и реестры; компрометация одной job раздувает blast radius на всех арендаторов узла.
Цель — зафиксировать границы ответственности в файловой системе и в IAM до того как вы масштабируете число параллельных воркеров на Mac.
Матрица: отдельный том логов или подкаталог
Выбор влияет на квоты резервное копирование и поведение при переполнении диска.
| Критерий | Отдельный том APFS | Подкаталог на системном томе |
|---|---|---|
| Квоты и политика retention | Проще квоты и отдельные политики бэкапа | Нужны ротация логов и алерты по диску на корневом томе |
| Blast radius при runaway job | Реже задевает системные сервисы | Риск для системного тома при слабом мониторинге |
| Операционная сложность | Чуть больше работы при первичной настройке | Быстрее внедрить при дисциплине прав |
Шаг 1 — стабильный слаг и POSIX‑группы
Задайте PROJECT_SLUG как в CI группу ocproj-${SLUG} и пользователя openclaw-${SLUG}. В группу — только нужные учётные записи.
sudo dseditgroup -o create ocproj-myapp
sudo sysadminctl -addUser openclaw-myapp -UID 5501 -shell /usr/bin/false
sudo dseditgroup -o edit -a openclaw-myapp -t user ocproj-myapp
Контрольная точка: id openclaw-myapp показывает группу ocproj-myapp.
Шаг 2 — каталог конфигурации только для проекта
Корень /etc/openclaw/projects/myapp с 0750 root:ocproj-myapp. В Git — шаблоны и ссылки на секреты не inline.
sudo mkdir -p /etc/openclaw/projects/myapp
sudo chown root:ocproj-myapp /etc/openclaw/projects/myapp
sudo chmod 0750 /etc/openclaw/projects/myapp
sudo install -o root -g ocproj-myapp -m 0440 ./rendered/openclaw.yaml /etc/openclaw/projects/myapp/openclaw.yaml
Контрольная точка: от имени сервиса sudo -u openclaw-myapp test -r /etc/openclaw/projects/myapp/openclaw.yaml завершается нулём чужой пользователь получает отказ.
Шаг 3 — корень логов на томе или в подпути
Каталог /var/log/openclaw/myapp владелец openclaw-myapp:ocproj-myapp при необходимости 2770. Отдельный том — смонтировать сюда и повторить chown.
sudo mkdir -p /var/log/openclaw/myapp
sudo chown openclaw-myapp:ocproj-myapp /var/log/openclaw/myapp
sudo chmod 2770 /var/log/openclaw/myapp
Настройте ротацию логов отдельно по префиксу проекта.
Шаг 4 — токены автоматизации с минимальной областью
Отдельные ключи на очередь webhook и read‑only к реестру файлы 0440 в .../secrets.d/projects/myapp.
Контрольная точка: таблица IAM или портал облака показывает что ключ не имеет прав на ресурсы другого PROJECT_SLUG.
Шаг 5 — переменные окружения LaunchDaemon
В plist задайте OPENCLAW_CONFIG_ROOT OPENCLAW_LOG_DIR и PROJECT_SLUG затем bootout/bootstrap label из runbook.
sudo launchctl bootout system /Library/LaunchDaemons/org.openclaw.worker.myapp.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/org.openclaw.worker.myapp.plist
Контрольные точки и быстрые проверки
- Права по цепочке:
namei -l /etc/openclaw/projects/myapp/openclaw.yamlне должен показывать world‑readable на секреты. - Процесс видит те же пути:
sudo -u openclaw-myapp launchctl print system/org.openclaw.worker.myappили эквивалент для вашей обёртки. - Логи только своего префикса: выборочный
tailи отсутствие строк с чужим slug в файлах проекта после смоук‑задачи. - Версия шаблона: Git SHA в метаданных деплоя для симметричного отката.
Разбор сбоев: симптом и действие
| Симптом | Вероятная причина | Действие |
|---|---|---|
| Permission denied при старте воркера | Неверный UserName в plist или группа не совпадает с каталогом | Сверить chown chmod и членство dseditgroup |
| 401 от webhook после выката | Токен перепутан между проектами или путь к файлу секрета старый | Проверить symlink и отдельный секрет на slug переротировать ключ |
| Логи пишутся в корень соседа | Переиспользован общий plist или переменная окружения не обновилась | Полный bootout bootstrap и поиск дубликатов label в /Library/LaunchDaemons |
Краткий FAQ
Git и диск? На диске — render и ссылки секреты в vault с минимальными правами.
Несколько сред? Суффикс -staging на slug или overlay env без общих путей логов.