Об этом проекте

Google Calendar Sync — это самодельный сервис, который поддерживает целевой календарь синхронизированным как проекцию исходного календаря. Каждое правило наблюдает ровно один исходный календарь и управляет ровно одним целевым календарем; исходный и целевой могут принадлежать разным учетным записям Google. Проект явно помечен как pre-alpha: архитектура, механизм синхронизации, аутентифицированный API, адаптер Google и веб-интерфейс образуют рабочий первый вертикальный срез, но тестирование на живой учетной записи и проверка готовности к продакшену не завершены, поэтому рекомендуются тестовые календари и резервные копии. Ключевые проектные решения, описанные в README: - Направленные правила: один источник, один целевой, с поведением, авторитетным для источника. Изменения в целевом, отсутствующие проекции и отмены в источнике исправляются во время синхронизации и сверки. - Конфиденциальность по умолчанию: новые правила по умолчанию используют проекцию «Занятость»; копирование деталей — по желанию и никогда не копирует участников, личность организатора, данные конференций, вложения или приглашения. - Безопасная активация: правило должно пройти предварительный просмотр без побочных эффектов, прежде чем его можно будет включить. - Самодостаточное развертывание: SQLite, планировщик, API и веб-интерфейс работают как один легковесный сервис, поставляемый как Docker-образ и Compose-сервис для linux/amd64 и linux/arm64. - Без телеметрии: функциональная установка взаимодействует только с Google API, необходимыми для синхронизации, и любым конечным точкой уведомлений, настроенной оператором. Перечисленные возможности включают события с временем и на весь день, повторяющиеся серии, изменения отдельных вхождений и отмены; политики «только занятость» или «копирование деталей» с включением на весь день по правилам; инкрементальный опрос каждые пять минут плюс ручная синхронизация; ежедневная полная сверка плюс «Сверка сейчас» с отчетом о расхождениях; предотвращение циклов через частные метаданные управляемого источника; стабильные ключи операций, сохранение последнего курсора, экспоненциальная задержка при повторах и изолированные сбои правил; аутентифицированное представление активности с дедупликацией и необязательной доставкой инцидентов по SMTP или webhook; один локальный пароль администратора с зашифрованными учетными данными Google OAuth; светлая и темная темы. Настройка требует проект Google Cloud с включенным Calendar API, клиент веб-приложения OAuth 2.0 и точный URI перенаправления http://localhost:8000/api/v1/oauth/google/callback. Локальные секреты настраиваются через файл .env, включая 256-битный мастер-ключ, который шифрует сохраненные учетные данные Google с помощью AES-256-GCM. В README отмечается, что потеря мастер-ключа делает учетные данные подключенной учетной записи нечитаемыми, и что развертывание на LAN-хосте требует особой обработки, поскольку Google отклоняет URI перенаправления с обычным HTTP, кроме localhost. Поведение синхронизации: первый запуск читает события источника, заканчивающиеся не ранее чем за 30 дней до запуска, наблюдает целевой календарь и записывает инкрементальные токены Google для обеих конечных точек. Последующие запуски потребляют оба потока изменений, поэтому правки или удаления только в целевом календаре исправляются без полных повторных сканирований. Для каждого релевантного события источника домен выбирает «Создать», «Обновить», «Удалить», «Игнорировать» или «Конфликт»; неоднозначная идентичность или владение не угадываются. Курсоры продвигаются только после полного успеха пакета, а записи провайдера несут стабильные ключи операций, чтобы повторы не дублировали проекции. Заметки о конфиденциальности и безопасности: названия событий, описания и места обрабатываются в памяти и не хранятся в SQLite или записях аудита; сопоставления сохраняют ID провайдера, ревизии и необратимый отпечаток; отключение учетной записи удаляет сохраненные учетные данные без удаления правил, сопоставлений или управляемых проекций; записи Google используют sendUpdates=none; веб-интерфейс и операционный API требуют локальной сессии администратора, тогда как /health остается публичным и минимальным. Архитектура — модульный монолит с границами портов и адаптеров; домен синхронизации не имеет зависимостей от FastAPI, SQLite, Google SDK, React, OAuth или Docker. Разработка бэкенда использует Python 3.12 и FastAPI, фронтенд — Node.js 22+, React, TypeScript, Vite и Tailwind CSS. Проверки качества включают ruff, mypy, pytest с минимальным покрытием 80%, проверки типов/линт/тесты/сборку фронтенда и многоплатформенные Docker-сборки. Google Calendar — единственный провайдер в первоначальном выпуске; Outlook и CalDAV описаны как архитектурные возможности, а не поддерживаемые функции. Проект нацелен на версию 0.1.0 под лицензией MIT.