10 KiB
План реализации изменений для reverse proxy
Обзор проекта
Проект acme-reverseproxy — это reverse proxy с автоматическим получением TLS-сертификатов через ACME/LetsEncrypt (autocert). Текущая реализация:
- Проксирует HTTP-запросы на бэкенд-серверы
- Обрабатывает /.well-known/acme-challenge через локальную файловую систему
- Использует autocert для HTTPS на входящих запросах
Требования
- Поддержка HTTPS для бэкенд-серверов — прозрачная работа как с HTTP, так и с HTTPS бэкендами
- NFS для /.well-known — подключение к NFS-серверу для хранения ACME-файлов
- Конфигурация NFS — параметры NFS указываются в конфиге
- Авто-подключение 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
Структура конфигурации:
[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: добавить структуруNFSConfigmy-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: Конфигурация
-
Расширить структуру Config (
config/config.go)- Добавить поле
NFS NFSConfig - Создать структуру
NFSConfigс полями:Enabled boolServer stringExportPath stringMountPoint stringOptions string(опционально)
- Добавить поле
-
Обновить пример конфигурации (
GenConfigActionвmain.go)- Добавить секцию NFS в генерируемый конфиг
- По умолчанию
enabled = false
Этап 2: Поддержка HTTPS для бэкендов
-
Модифицировать
ToReverseProxyMap(proxymap/proxymap.go)- Проверить схему URL бэкенда
- Для HTTPS создать
http.TransportсTLSClientConfig - Для HTTP использовать стандартный транспорт
- Настроить
proxy.Transport
-
Добавить логирование
- Логировать тип подключения к бэкенду (HTTP/HTTPS)
- Логировать ошибки TLS-рукопожатия
Этап 3: NFS монтирование
-
Создать пакет для работы с NFS (
nfs/nfs.go)- Функция
Mount(server, export, mountpoint, options) error - Функция
Unmount(mountpoint) error - Функция
IsMounted(mountpoint) bool - Функция
CheckHealth(mountpoint) error - Использовать
exec.Commandдля системных вызовов mount/umount
- Функция
-
Добавить контроль прав
- Проверка, что процесс имеет права на монтирование
- Обработка ошибок без прав с понятным сообщением
Этап 4: Интеграция NFS в обработку /.well-known
-
Модифицировать
handleWellKnown(proxymap/proxymap.go)- Перед обработкой запроса проверять
nfs.IsMounted() - При размонтировании — попытка
nfs.Mount() - Добавить retry-логику с задержкой
- Перед обработкой запроса проверять
-
Добавить глобальный менеджер NFS
- Создать singleton для управления NFS
- Избегать множественных попыток монтирования
- Синхронизация через
sync.Mutexилиsync.Once
Этап 5: Тестирование и документация
-
Добавить тесты
- Тесты для HTTPS-бэкендов
- Тесты для NFS монтирования (mock)
- Тесты для обработки ошибок
-
Обновить документацию
- README.md: добавить секцию по NFS
- Пример конфигурации с NFS
- Требования к правам доступа
Файлы для изменения
Существующие файлы:
config/config.go— расширение структуры Configproxymap/proxymap.go— HTTPS бэкенды и NFS интеграцияmain.go— инициализация NFS при старте
Новые файлы:
nfs/nfs.go— работа с NFS монтированиемnfs/nfs_test.go— тесты для NFS
Риски и ограничения
Риски:
-
Права доступа — монтирование NFS требует root-прав
- Решение: Запускать как сервис с systemd или с sudo
- Альтернатива: Предварительное монтирование вручную
-
Сетевые проблемы — разрыв NFS может привести к зависанию
- Решение: Настройка
timeoиretransв опциях mount - Мониторинг доступности с автоматическим переподключением
- Решение: Настройка
-
Безопасность — NFS может быть уязвим
- Решение: Использовать NFSv4 с Kerberos аутентификацией
- Ограничить доступ по IP через firewall
Ограничения:
-
Платформа — монтирование NFS работает только на Unix-системах
- На Windows потребуется альтернативное решение
-
Производительность — проверка при каждом запросе может замедлить работу
- Кэширование результата проверки
- Асинхронная проверка в фоне
Рекомендуемый порядок реализации
- Сначала HTTPS для бэкендов — проще, меньше рисков
- Затем NFS конфигурация — подготовка структуры
- Потом NFS монтирование — ядро функциональности
- Наконец интеграция — объединение всего вместе
Следующие шаги
После утверждения плана:
- Делегировать реализацию HTTPS бэкендов агенту
golang - Делегировать реализацию NFS агенту
golang - Делегировать ревью изменений агенту
reviewer - Провести тестирование и валидацию
Примечания
- Все изменения должны быть обратно совместимы
- По умолчанию NFS отключен (
enabled = false) - По умолчанию бэкенды работают как раньше (HTTP)
- Логирование должно быть подробным в режиме debug