7550aff102
- mail_archive.py: фикс вложений himalaya --dir → --downloads-dir; attachments/ только при has_attachment; идемпотентно - email_classifier.py: Qwen3:8b (Ollama) → теги info/urgent/task/meeting в frontmatter email.md - email_handlers.py: urgent→Telegram (Bot API+SOCKS5), task→Radicale VTODO, meeting→Radicale VEVENT; handled_* идемпотентность; --dry-run - .gitignore: игнор *.env.bak* - openspec: чейндж email-classification-handlers (в работе) - STATUS/TODO/WALKTHROUGH: прогресс сессии, подводные камни Radicale (http.client, Depth:1, формат дат)
75 lines
4.4 KiB
Markdown
75 lines
4.4 KiB
Markdown
# Proposal: Локальные сервисы календаря (Radicale) и задач (Vikunja)
|
||
|
||
> ⚠️ **SUPERSEDED (2026-09-13):** Часть про **Vikunja** заменена чейнджем
|
||
> `remove-vikunja-use-radicale-tasks` — Vikunja выведена из проекта (лишняя
|
||
> сущность), задачи ведутся через **Radicale VTODO** (календарь «Задачи»).
|
||
> Radicale-часть актуальна.
|
||
|
||
## Why
|
||
|
||
Для синхронизации календаря и задач с Android-телефоном нужны локальные
|
||
сервисы (без облака). Пользователь хочет:
|
||
- **Календарь** — нативная синхронизация с Android
|
||
- **Трекер задач** — с веб-UI и API, чтобы веб-интерфейс почты мог
|
||
создавать задачи кнопкой
|
||
- Всё **локально** (bigbox), без облачных зависимостей
|
||
|
||
Сейчас календаря и трекера задач **нет** (проверено: порт 5232 свободен,
|
||
образы radicale/vikunja не установлены). Порт 8080 занят NetBox.
|
||
|
||
## What Changes
|
||
|
||
Два новых сервиса в `/opt/hermes/email-assistant/`:
|
||
|
||
### 1. Radicale (CalDAV) — календарь + задачи VTODO
|
||
- **Порт:** 5232 (свободен)
|
||
- **Путь:** `/opt/hermes/email-assistant/radicale/`
|
||
- **Способ:** Python pip (лёгкий, systemd) ИЛИ docker
|
||
- **Назначение:** CalDAV-сервер для:
|
||
- Календаря «Личный» + «Рабочий» (синхронизация с Android через DAVx5)
|
||
- Задач (VTODO) — тоже через CalDAV
|
||
- **Конфиг:** лёгкий, single-user (правки через UI/файл)
|
||
|
||
### 2. Vikunja (трекер задач) — веб-UI + REST API + Android app
|
||
- **Порт:** 3456 (дефолт Vikunja, свободен)
|
||
- **Путь:** `/opt/hermes/email-assistant/vikunja/`
|
||
- **Способ:** docker compose (postgres + vikunja)
|
||
- **Назначение:**
|
||
- Трекер задач с веб-интерфейсом (kanban/список)
|
||
- **REST API** — для кнопки «Создать задачу» из веб-интерфейса почты
|
||
- Android-приложение (нативный клиент Vikunja)
|
||
- **БД:** PostgreSQL (docker), данные в volume
|
||
|
||
### Общие решения
|
||
- **Доступ:** 127.0.0.1 (локально) + опционально через Caddy reverse proxy
|
||
на поддомене (Caddy — контейнер на vps02, см. STATUS.md «Ресурсы проекта»)
|
||
- **Порты:** 5232 (radicale), 3456 (vikunja) — не конфликтуют с 8080 (NetBox)
|
||
- **Авторизация:** Radicale — HTTP Basic (логин/пароль в конфиге);
|
||
Vikunja — своя (регистрация/логин, API-токены)
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
- `calendar-caldav`: Локальный CalDAV-сервер (Radicale) для календаря и
|
||
задач, синхронизация с Android через DAVx5
|
||
- `task-tracker-vikunja`: Локальный трекер задач Vikunja с веб-UI и REST API,
|
||
интеграция с веб-интерфейсом почты через API-токен
|
||
|
||
### Modified Capabilities
|
||
<!-- нет -->
|
||
|
||
## Impact
|
||
|
||
- **Новые сервисы:** `/opt/hermes/email-assistant/radicale/`, `/opt/hermes/email-assistant/vikunja/`
|
||
- **Порты:** 5232 (radicale), 3456 (vikunja) — новые
|
||
- **Данные:** календари/задачи будут храниться локально
|
||
- **Документация:** обновить README/STATUS (порты, логины, как синхронизировать)
|
||
- **Риск:** Vikunja тянет Postgres (память/диск); Radicale — минимален
|
||
|
||
## Rollback
|
||
|
||
1. **Radicale:** `systemctl stop radicale` + удалить `/opt/hermes/email-assistant/radicale/`
|
||
2. **Vikunja:** `docker compose -f /opt/hermes/email-assistant/vikunja/docker-compose.yml down -v`
|
||
(удалить контейнеры и volume с данными) + убрать `/opt/hermes/email-assistant/vikunja/`
|
||
3. Убрать упоминания из README/STATUS
|
||
4. Вернуть порты в исходное состояние (оба сейчас свободны, конфликтов нет) |