# План реализации изменений для reverse proxy

## Обзор проекта

Проект `acme-reverseproxy` — это reverse proxy с автоматическим получением TLS-сертификатов через ACME/LetsEncrypt (autocert). Текущая реализация:
- Проксирует HTTP-запросы на бэкенд-серверы
- Обрабатывает /.well-known/acme-challenge через локальную файловую систему
- Использует autocert для HTTPS на входящих запросах

## Требования

1. **Поддержка HTTPS для бэкенд-серверов** — прозрачная работа как с HTTP, так и с HTTPS бэкендами
2. **NFS для /.well-known** — подключение к NFS-серверу для хранения ACME-файлов
3. **Конфигурация NFS** — параметры NFS указываются в конфиге
4. **Авто-подключение NFS** — автоматическое монтирование и контроль с переподключением

## Архитектурные решения

### 1. HTTPS для бэкендов (выбран вариант A)

**Решение:** Автоматическое определение по схеме в конфиге (http:// vs https://)

**Реализация:**
- `httputil.NewSingleHostReverseProxy` уже поддерживает HTTPS через `url.Parse`
- Необходимо добавить настройку `Transport` с поддержкой TLS для HTTPS-бэкендов
- Для HTTP-бэкендов использовать стандартный транспорт
- Для HTTPS-бэкендов создать `http.Transport` с `TLSClientConfig`

**Изменения в коде:**
- `proxymap/proxymap.go`: модифицировать `ToReverseProxyMap` для настройки транспорта
- Добавить проверку схемы URL и соответствующую настройку транспорта

### 2. NFS конфигурация (выбран вариант B)

**Решение:** Отдельные поля в конфиге: server, export_path, mount_point

**Структура конфигурации:**
```toml
[nfs]
enabled = true
server = "192.168.1.100"
export_path = "/export/acme"
mount_point = "/mnt/acme-wellknown"
options = "rw,vers=4.1,timeo=50,retrans=2"
```

**Изменения в коде:**
- `config/config.go`: добавить структуру `NFSConfig`
- `my-config.yaml` (или .toml): добавить секцию `[nfs]`

### 3. Монтирование NFS (выбран вариант B)

**Решение:** Использовать FUSE без root-прав

**Библиотеки:**
- `github.com/willscott/go-nfs-client` или
- `github.com/anacrolix/fuse` с NFS-поддержкой

**Альтернатива:** Если FUSE не подходит, рассмотреть:
- Системное монтирование через `exec.Command("mount", ...)` с проверкой прав
- Или предположить, что NFS уже смонтирован, но делать контроль

**Рекомендация:** Использовать системное монтирование с проверкой прав, так как:
- FUSE для NFS сложен в реализации
- Reverse proxy обычно запускается с привилегиями
- Системное монтирование надежнее

**Изменения:**
- Создать новый пакет `nfs` или добавить в существующий
- Реализовать функции: `Mount()`, `Unmount()`, `IsMounted()`, `CheckHealth()`

### 4. Контроль доступности NFS (выбран вариант A)

**Решение:** Проверка при каждом запросе к /.well-known

**Реализация:**
- Перед обработкой запроса к /.well-known проверять доступность mount point
- При недоступности — попытка перемонтировать
- Логирование всех событий монтирования/размонтирования

**Изменения:**
- `proxymap/proxymap.go`: модифицировать `handleWellKnown` для проверки NFS
- Добавить механизм retry с экспоненциальной задержкой

## План работ

### Этап 1: Конфигурация

1. **Расширить структуру Config** (`config/config.go`)
   - Добавить поле `NFS NFSConfig`
   - Создать структуру `NFSConfig` с полями:
     - `Enabled bool`
     - `Server string`
     - `ExportPath string`
     - `MountPoint string`
     - `Options string` (опционально)

2. **Обновить пример конфигурации** (`GenConfigAction` в `main.go`)
   - Добавить секцию NFS в генерируемый конфиг
   - По умолчанию `enabled = false`

### Этап 2: Поддержка HTTPS для бэкендов

3. **Модифицировать `ToReverseProxyMap`** (`proxymap/proxymap.go`)
   - Проверить схему URL бэкенда
   - Для HTTPS создать `http.Transport` с `TLSClientConfig`
   - Для HTTP использовать стандартный транспорт
   - Настроить `proxy.Transport`

4. **Добавить логирование**
   - Логировать тип подключения к бэкенду (HTTP/HTTPS)
   - Логировать ошибки TLS-рукопожатия

### Этап 3: NFS монтирование

5. **Создать пакет для работы с NFS** (`nfs/nfs.go`)
   - Функция `Mount(server, export, mountpoint, options) error`
   - Функция `Unmount(mountpoint) error`
   - Функция `IsMounted(mountpoint) bool`
   - Функция `CheckHealth(mountpoint) error`
   - Использовать `exec.Command` для системных вызовов mount/umount

6. **Добавить контроль прав**
   - Проверка, что процесс имеет права на монтирование
   - Обработка ошибок без прав с понятным сообщением

### Этап 4: Интеграция NFS в обработку /.well-known

7. **Модифицировать `handleWellKnown`** (`proxymap/proxymap.go`)
   - Перед обработкой запроса проверять `nfs.IsMounted()`
   - При размонтировании — попытка `nfs.Mount()`
   - Добавить retry-логику с задержкой

8. **Добавить глобальный менеджер NFS**
   - Создать singleton для управления NFS
   - Избегать множественных попыток монтирования
   - Синхронизация через `sync.Mutex` или `sync.Once`

### Этап 5: Тестирование и документация

9. **Добавить тесты**
   - Тесты для HTTPS-бэкендов
   - Тесты для NFS монтирования (mock)
   - Тесты для обработки ошибок

10. **Обновить документацию**
    - README.md: добавить секцию по NFS
    - Пример конфигурации с NFS
    - Требования к правам доступа

## Файлы для изменения

### Существующие файлы:
- `config/config.go` — расширение структуры Config
- `proxymap/proxymap.go` — HTTPS бэкенды и NFS интеграция
- `main.go` — инициализация NFS при старте

### Новые файлы:
- `nfs/nfs.go` — работа с NFS монтированием
- `nfs/nfs_test.go` — тесты для NFS

## Риски и ограничения

### Риски:
1. **Права доступа** — монтирование NFS требует root-прав
   - Решение: Запускать как сервис с systemd или с sudo
   - Альтернатива: Предварительное монтирование вручную

2. **Сетевые проблемы** — разрыв NFS может привести к зависанию
   - Решение: Настройка `timeo` и `retrans` в опциях mount
   - Мониторинг доступности с автоматическим переподключением

3. **Безопасность** — NFS может быть уязвим
   - Решение: Использовать NFSv4 с Kerberos аутентификацией
   - Ограничить доступ по IP через firewall

### Ограничения:
1. **Платформа** — монтирование NFS работает только на Unix-системах
   - На Windows потребуется альтернативное решение

2. **Производительность** — проверка при каждом запросе может замедлить работу
   - Кэширование результата проверки
   - Асинхронная проверка в фоне

## Рекомендуемый порядок реализации

1. **Сначала HTTPS для бэкендов** — проще, меньше рисков
2. **Затем NFS конфигурация** — подготовка структуры
3. **Потом NFS монтирование** — ядро функциональности
4. **Наконец интеграция** — объединение всего вместе

## Следующие шаги

После утверждения плана:
1. Делегировать реализацию HTTPS бэкендов агенту `golang`
2. Делегировать реализацию NFS агенту `golang`
3. Делегировать ревью изменений агенту `reviewer`
4. Провести тестирование и валидацию

## Примечания

- Все изменения должны быть обратно совместимы
- По умолчанию NFS отключен (`enabled = false`)
- По умолчанию бэкенды работают как раньше (HTTP)
- Логирование должно быть подробным в режиме debug
