Когда зарубежные сервисы начали падать в самый неподходящий момент, один разработчик не стал ждать - и за несколько вечеров собрал собственный инструмент, который решает проблему автоматически. Без лишних телодвижений и ежедневной ручной работы.
Проблема, которую многие уже знают по себе
Нестабильность доступа к зарубежным ресурсам и API давно перестала быть разовым сбоем - она превратилась в фоновый раздражитель рабочего дня. Узлы падают без предупреждения, скорость проседает, конфигурации протухают за ночь. Полагаться на один зарубежный сервер в таких условиях - затея ненадёжная.
Ситуацию усугубляет простой факт: когда включаются ограничения, зайти на GitHub или Google для поиска свежих конфигураций становится невозможным. Искать их в публичных сообществах - лотерея с низкими шансами на выигрыш.
От скрипта к полноценному агрегатору
Идея начиналась скромно: написать скрипт на Go, который каждый час скачивал бы актуальные open-source конфигурации из репозиториев GitHub и складывал их в текстовый файл. Никакой магии - просто своя локальная база для быстрого копирования на телефон.
Затем пришло улучшение. HTTP-сервер с раздачей конфигов по локальной сети позволил сделать процесс полностью автоматическим: телефон в той же сети - клиент сам обновляет подписку. Руки не нужны.
По ходу разработки пришлось разобраться с несколькими неприятными моментами:
- Утечка памяти из-за незакрытых Body при чтении данных
- Data Race между горутинами записи и чтения файла - решилась через атомарное переименование временного файла
- Перегрузка мобильного клиента тысячами конфигураций - закрыта пагинацией через параметры в URL
- Дублирование конфигов из разных репозиториев - отсев через map убрал около 50% повторов
Фильтрация, геолокация и веб-интерфейс
Финальная версия инструмента работает многоуровнево. Сначала отсеиваются дубликаты. Потом - ping-проверка TCP-соединения, которая отбраковывает ещё около 30% нерабочих адресов. Оставшиеся конфигурации получают стандартизированные названия с флагом страны и порядковым номером - никакой рекламы и мусора в именах.
Определение страны реализовано через базу GeoLite. Кеширование в оперативной памяти снимает лишнюю нагрузку при частых запросах клиента. Веб-интерфейс с QR-кодом, управлением фильтрами, просмотром логов и принудительным обновлением делает работу с инструментом удобной даже без технической подготовки.
Честные ограничения
Решение не претендует на универсальность. Компьютер должен быть включён - иначе раздача встаёт. Для работы нужен ПК, у которого есть доступ к GitHub. При слишком частом принудительном обновлении GitHub может ответить Rate Limit-ом. Часть клиентов семейства V2Ray иногда выдаёт ошибки парсинга.
Но для своей задачи - иметь актуальные рабочие конфигурации каждый день без ручного труда - инструмент справляется полностью. Иногда достаточно просто сделать что-то самому.