Скилл Tech

Конфигурация файлового синка

Pre-flight чеклист и ignore-паттерны для file-sync (Syncthing/rclone/rsync/Dropbox/iCloud) — защита git working trees, venv и build-артефактов.

Обзор

Скилл фиксирует pre-flight правила, которые нужны любому двустороннему файловому синку до его первого включения. Загружается перед настройкой Syncthing, rclone bisync, общих папок Dropbox/iCloud/Google Drive, периодического rsync, Disk Arcana sync или любого custom sync-слоя. Не загружается для односторонних бэкапов и CI artifact transfer — там другая модель рисков.

Зачем это нужно (founding incident)

INFRA-0026 (2026-04-25): первая версия .stignore для Syncthing содержала 28 паттернов и не покрывала .venv, __pycache__, target/, *.db, плюс не исключала вложенные git-репо целиком. Итог: 1 материализованный sync-conflict в продакшене, 60+ .sync-conflict файлов за неделю, 14 git-репо с расходящимися рабочими копиями между хостами, реальный риск cross-platform breakage (macOS Mach-O vs Linux ELF). Расширение паттернов 28 → 66 уронило счёт файлов 40,361 → 2,206 (−95%).

Pre-Flight Inventory (обязательно)

Перед включением sync нужно прогнать find по source root для каждого класса проблемных файлов — всё, что найдётся, обязано попасть в ignore-список до первого синка:

  • Vendored / build-артефактыnode_modules, .venv/venv, __pycache__, target, .next/.turbo/.nuxt, .cache/.parcel-cache, coverage/.nyc_output, dist/build/.build, DerivedData, .pytest_cache/.mypy_cache/.ruff_cache
  • Вложенные .git директории (критично) — каждый .git/ внутри sync root
  • Локальные БД / state-файлы*.db, *.sqlite/*.sqlite3, *.duckdb, *.db-journal
  • Скомпилированные бинарники (cross-platform unsafe) — *.so, *.dylib, *.dll, *.exe
  • IDE / OS мусор.idea, .vscode, .DS_Store, Thumbs.db

Decision Tree: синкать working tree или git pull

Для каждой найденной .git/ папки задайте вопрос: есть ли на второй ноде live-правки, агенты или production runtime в этом репо?

  • Дане синкайте working tree. Исключите /path/to/repo целиком. Обновляйте через cron git pull на второй ноде (паттерн arcanada-pull.sh).
  • Нет → working tree можно синкать как read-only зеркало, но .git/ всё равно исключите — у каждой ноды своя commit history.

По умолчанию выбирайте "да" — почти любая вторая нода рано или поздно становится активной (новый агент, deploy-скрипт, ручная правка). Overprotection лучше восстановления.

Reusable .stignore шаблон (Syncthing, INFRA-0026 v2)

Закалённый шаблон закрывает восемь корзин:

  1. Исходный код проектов (отдельные git-репо) — /Projects/*/code, /Projects/Datarim/sources, /Projects/Rules of Robotics/Code
  2. AI-агенты с собственными git/venv/AI_agents/Email Agent, Screen reader, Remove-Watermark, Agent Dreamer
  3. Workflow / runtime state.git, .dreamer, .meta, .claude, .githooks
  4. Build / зависимостиnode_modules, dist, build, .next, .turbo, .nuxt, .cache, .parcel-cache, coverage, .nyc_output, target
  5. Python environments / кэши.venv, venv, __pycache__, *.pyc, .pytest_cache, .mypy_cache, .ruff_cache
  6. Swift build artifacts.build, DerivedData, *.xcuserstate
  7. Скомпилированные бинарники*.so, *.dylib, *.dll, *.exe, *.o, *.a
  8. БД / state-файлы*.db, *.sqlite, *.sqlite3, *.duckdb, *.db-journal, *.db-shm, *.db-wal

Плюс secrets/temp/OS-мусор: *.tmp, *.log, .env*, .DS_Store, Thumbs.db, .Spotlight-V100, .Trashes, .fseventsd.

Pattern Syntax Cheat-Sheet

Syncthing (.stignore): node_modules матчится на любом уровне, /Projects/*/code — path-anchored, (?d)pattern удаляет уже синкнутое, (?i) case-insensitive, !important.log — negation.

rclone: trailing / — только папки, ** рекурсирует через папки, /path/to/exclude/** — path-anchored.

rsync: не различает файл/папку, /relative/path — от start dir, **/*.tmp — recursive glob.

Workflow для git-managed репо (когда file-sync исключён)

  1. Cron git pull скрипт — рекомендуемый паттерн arcanada-pull.sh: fetch upstream, skip если local==remote, skip если ветка ≠ main/master, stash локальных правок, ff-only pull с fallback на merge, далее CLI Claude conflict-resolver, алерт через Ops Bot при unresolved, pop stash.
  2. CI/CD self-hosted runner — GitHub Actions runner на второй ноде делает pull при push в main (event-driven вместо polling).
  3. Ручной — оператор делает git pull сам по необходимости. Подходит для редко обновляемых репо.

Compliance Check

  • Pre-flight inventory выполнен для каждого класса проблемных файлов
  • Каждый обнаруженный класс присутствует в ignore-паттернах
  • Каждая вложенная .git/ либо исключена целиком, либо задокументирована как read-only mirror
  • Cross-platform binary классы (.venv, target, *.so/*.dylib/*.dll) исключены при синке между разными ОС
  • DB-файлы (*.db, *.sqlite) исключены как host-local state
  • Lockdown применён (globalAnnounce=false, нет публичного discovery, transport ограничен приватной сетью — например, Tailscale)
  • Бэкап pre-change конфига сохранён (config.xml.pre-{TASK-ID})
  • Runbook задокументирован (топология, ops, rollback)
  • Двусторонний smoke-тест прогнан