LINUX.ORG.RU

geoip 0.1.0

 , , ,


1

3

Тихо и незаметно вышла первая версия проекта geoip — self-hosted сервиса GeoIP REST API, написанного на Rust.

Функциональность:

  • Получение информации об IP-адресе (страна, город, почтовый индекс, координаты, оператор и т. п.) по REST API с использованием данных MaxMind GeoLite2 (бесплатно) и MaxMind GeoIP (платно)
  • Определение текущего IP-адреса (отдельный эндпойнт + параметр ip основного эндпойнта опционален)
  • Настраиваемые автоматические обновления баз данных (либо с официальных URL MaxMind с указанием Account ID и Licence Key, либо со своего кастомного URL без и с авторизацией, также можно задавать периодичность проверок обновлений)
  • Ко всем результатам содержащим поле timezone добавляется дополнительное поле posix_timezone (например, Europe/Paris превращается в «CET-1CEST,M3.5.0,M10.5.0/3»). Это позволяет реализовывать автоматическую настройку часового пояса на встраиваемых системах (например, ESP32 и другие newlib таргеты без tzdata). Уникальная функция недоступная в других проектах
  • База данных часовых поясов также автоматически обновляется (можно настраивать интервал, URL, авторизацию, по умолчанию используется официальный сайт IANA), при отключенных обновлениях используется системная
  • Архивы с актуальным базами данных могут быть загружены с самого сервиса по HTTP(S) (таким образом, один сервис может проксировать данные для других, чтобы уменьшать использование квоты MaxMind)
  • Можно защитить эндпоинты с данными опциональным API ключом
  • Имеется веб-интерфейс для ручных запросов с опциональной поддержкой OpenStreetMap
  • Имеется OpenAPI спецификация и Swagger UI в самом сервисе для удобной интеграции со своими проектами
  • Имеется готовый Docker образ для быстрого развёртывания
    docker run \
      -e MAXMIND_ACCOUNT_ID=XXXX \
      -e MAXMIND_LICENCE_KEY=YYYY \
      -e OSM_TILES_URL="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" \ # Необязательно
      -v geoip_data:/data \
      -p 8080:8080 \
      ghcr.io/quoi-dev/geoip:latest
    

Демо

Лицензия: MIT.

Проект нацелен на упрощение интеграции GeoIP в другие приложения, позволяя абстрагировать обновления баз данных и работу с форматом MMDB. Поддерживается работа на ОС Linux и Mac OS X, должен без проблем работать на других UNIX-совместимых системах, на Windows не поддерживается работа с таймзонами (но можно использовать WSL).

>>> GitHub

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от usi_svobodi

На Си неудобно писать асинхронный код (а это нынче стандарт для веб-приложений, чтобы держать нагрузку), плюс дефицит веб-фреймворков (роутинг, авторизация, внедрение зависимостей, вот это всё). Пришлось бы очень много велосипедить. А на Rust достаточно батареек

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Там что то сумбурное про способность софта на си протекать бесконтрольно.

Лучше помоги мне найти утечки памяти в луа, а? Я уже в панике. Казалось - нашел, а это промежуточная цепочка.

LightDiver ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Хотя бы предложи по каким параметрам можно ценивать автоматически. Я полез уже глобальную таблицу парсить. Пока по количествам ключей. По чему еще можно?

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Поменьше бы ллмками генерил, а побольше сам писал =) У тебя уже должно быть понимание как память выделяется и как освобождается, единственный способ «утечки» это когда ты сам явно препятствуешь ещё освобождению когда приходит GC, ну или интерпретатор с багом каким допустим, или дёргается что-то внешнее просто средствами lua.

Ну расставляй ручками collectgarbage("collect") из наружи в глубь, и замеряй паиять, увидишь долгожданный её дроп, вникай в ту область кода куда совал последний раз. В погоне за автоматизацией и автогенерированием, ты теряешь понимание того как у тебя твой язык и его реализация работают и превращаешь всё в тыкание палочкой. (я тоже такой же аболтус, но всё же)

Ну и когда код превращается в один непрерывный конвеер из метатаблиц, так что самый первый край проброшен до самого последнего то получается что куча данных намертво связаны друг с другом, GC приходит, проходит по этой вермишели и видит что нет данных на которые никто не ссылается, всё либо таблица в таблице, либо таблица через метатаблицу в таблице переплетено, машет ручкой типа «ну ок, раз ты так решил» и уходит.

Ну, допустим, где проблемный код? И что ты подразумеваешь под словами «течёт»? Может у тебя происходит некое накопление данных просто.


Но это всё в рамках новости офтоп и нас забанят если будем продолжать.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

А зачем geoip в виде rest api? Для тех кто не смог найти либу для своего языка? Вспоминается статья на Хабре где описывается реализация фильтра Блума в виде веб сервиса

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)
Ответ на: комментарий от cobold

Настраиваемое автообновление баз. Библиотеки решают вопрос чтения MMDB формата, но откуда ты будешь получать эту БД - твои проблемы. А сервис решает именно этот вопрос. В принципе, ничто не мешает каталог с MMDB файлами зашарить со своим приложением и использовать сервис как просто автообновлятор.

Плюс embedded устройства, которым нужно куда-то постучаться и сконфигурироваться под часовой пояс, язык и т. п. локации. Таскать с собой GeoIP БД, да ещё и обновлять её слишком накладно, плюс в любом случае нужно дёрнуть сервис как минимум, чтобы узнать внешний IP. А тут к IP идёт сразу вся информация, плюс POSIX таймзона (то есть подходит даже в ситуации, когда на устройстве нет tzdata вообще - всякие ESP32 и прочие Arduino). И tzdata, используемый для вычислений сервисом, тоже автообновляется.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 5)
Ответ на: комментарий от mx__

Зато если сервис не открывается — никто никого не сможет вычислить по IP. Обещали безопасность — и не соврали!

Smacker ★★★★★
()
Ответ на: комментарий от mx__

У меня эта ссылка открывается, но я тоже не удивлен.

usermod
()
Ответ на: комментарий от Smacker

Зато если сервис не открывается — никто никого не сможет вычислить по IP.

Записывай: улица Пушкина, дом Колотушкина.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

«Мы уже поднимаемся» — «Я на первом этаже живу» — «Тогда спускаемся»

Smacker ★★★★★
()
Ответ на: комментарий от KivApple

На Си неудобно писать асинхронный код (а это нынче стандарт для веб-приложений, чтобы держать нагрузку)

сам-то понял, какую бессмысленную чушь написал?

Хотя чего еще ждать от очередного бездарного растомана, лол, там других просто нет

кстати говоря.

$ cat Cargo.lock | grep name | sort
name = "winapi-i686-pc-windows-gnu"
name = "winapi-util"
name = "winapi-x86_64-pc-windows-gnu"
name = "winapi"
name = "windows_aarch64_gnullvm"
name = "windows_aarch64_gnullvm"
name = "windows_aarch64_msvc"
name = "windows_aarch64_msvc"
name = "windows_i686_gnu"
name = "windows_i686_gnu"
name = "windows_i686_gnullvm"
name = "windows_i686_gnullvm"
name = "windows_i686_msvc"
name = "windows_i686_msvc"
name = "windows_x86_64_gnu"
name = "windows_x86_64_gnu"
name = "windows_x86_64_gnullvm"
name = "windows_x86_64_gnullvm"
name = "windows_x86_64_msvc"
name = "windows_x86_64_msvc"
name = "windows-core"
name = "windows-implement"
name = "windows-interface"
name = "windows-link"
name = "windows-result"
name = "windows-strings"
name = "windows-sys"
name = "windows-sys"
name = "windows-sys"
name = "windows-targets"
name = "windows-targets"
name = "winsafe"

хонк хонк

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от cobold

Например - если есть несколько сервисов, которые пользуются этими данными. И дабы не раскидывать файлы в кучу мест и организовывать синхронизацию - проще сделать один ВЭБ-сервис куда все будут лазить.

svk28
()

Только неделю назад сделал тоже самое на GO (правда без карты), в качестве тренировки общения с невросетью. Работает, пошло в пром. эксплуатацию =).

svk28
()
Последнее исправление: svk28 (всего исправлений: 1)
Ответ на: комментарий от Lrrr

сам-то понял, какую бессмысленную чушь написал?

Не, ну вдруг у него есть какие-нибудь веские аргументы? Давай поинтересуемся у него ;)

@KivApple, расскажи, в чём именно заключается неудобство написания асинхронного кода на си? Вроде как там все механизмы в нём есть для этого: и потоки, и семафоры/мьютексы, и различные механизмы IPC. И даже fork() есть, который тебе сразу копию процесса делает. Что ещё надо?

u5er ★★★
()

на Windows не поддерживается работа с таймзонами (но можно использовать WSL).

не, ну за кого вы меня принимаете?! Давайте сначала нативную поддержку, без вот этих нищебродских WSL… Тогда поговорим.

seiken ★★★★★
()
Ответ на: комментарий от KivApple

асинхронный код (а это нынче стандарт для веб-приложений, чтобы держать нагрузку),

Это кому-то кроме говно-сетей типа твиттера и фейсбука нужно? такая нагрузка? Вот в джаве я раскидываю всё по виртуальным тредам, и нахрена мне эта асинхронщина?

seiken ★★★★★
()

Тихо и незаметно

написанного на Rust

Это несовместимые понятиня. Должно быть оглушительное ко-ко-ко про безопасность памяти.

ox55ff ★★★★★
()
Ответ на: комментарий от cobold

А зачем geoip в виде rest api? Для тех кто не смог найти либу для своего языка? Вспоминается статья на Хабре где описывается реализация фильтра Блума в виде веб сервиса

Автор просто тренируется с растишкой. Кроме самого запроса карты показывает, качает их откуда-то, сохраняет. В будущем для тайлов, возможно, хранилище организует. Чисто академический проект. Можно над ним помедитировать, как над ещё одним примером.

her_s_gory ★★
()
Ответ на: комментарий от AndrK189100

Чем, интересно на Rust отличается от не на Rust? Тем, что на Rust, видимо… И зачем это сообщать)

Кому инересно -изучает и другим показывает. Для простых пользователей, конечно, без разницы.

her_s_gory ★★
()
Ответ на: комментарий от u5er

Ты точно знаешь, что такое асинхронный код?

IPC, fork и семафоры необходимы для многопоточности. Для асинхронности нужны корутины в языке. Иначе получается callback hell и/или ручная реализация state machine. Что может быть увлекательно в паре мест, но когда корутин разных видов в проекте десятки, async/await рулит.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от AndrK189100

С одной стороны, я тоже не сильно уважаю людей, которые выносят язык программирования в название программы, хотя и там бывают разные мотивы и не все эти мотивы одинаково убоги.

С этой точки зрения название этого проекта даже слишком безлико. Как его найти через месяц? Название geoip относится к другому проекту, поэтому найти этот будет очень сложно. Могли бы назвать web-geoip или geoip-rest, например.

С другой стороны упоминание ЯП rust позволяет уже многое сказать об этой программе даже не заглядывая в гитхаб.

Кстати, если бы автор упомянул еще и nodejs было бы еще определенней.

usermod
()
Ответ на: комментарий от seiken

Виртуальные треды в Java по сути та же асинхронщина.

А нужна она не только фейсбукам, потому что главная экономия асинхронщины не по CPU, а по памяти (потому что гораздо меньше тредов ОС => меньше стеков). А это значит, что можно напихать больше микросервисов на дешевую VPS (CPU можно считать резиновым, просто будет дольше отвечать, а память вот не резиновая, потому что придёт OOM и отвечать вообще перестанет).

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Ты точно знаешь, что такое асинхронный код?

А хрен его знает. Простыми словами я могу обозвать это так: когда вызываешь функцию и она возвращается сразу, а о выполнении работы она сообщает через событие, обратный вызов или ещё как-нибудь. В моём понимании это мало чем отличается от многопоточности. В итоге, вся задача сводится в оргинизации общения между потоками. Или я ошибаюсь?

u5er ★★★
()
Ответ на: комментарий от u5er

когда вызываешь функцию и она возвращается сразу, а о выполнении работы она сообщает через событие, обратный вызов или ещё как-нибудь

Ну да.

мало чем отличается от многопоточности

Ну нет. Представь, у тебя не один вызов асинхронной функции, а цепочка. Например, «сходить в базу данных, потом сходить в другой REST API, потом сходить в файл, потом отправить результат пользователю». В этом примере 4 обработчика завершения асинхронной операции, имеющее общее состояние (ведь результаты того же похода в БД могут быть нужны всем последующим обработчикам). Нужно это состояние где-то хранить и как-то передавать, нужно аккуратно распилить алгоритм по callback-ам. Если в алгоритме есть нелинейность (например, «если в БД нет строчки, то сходить во внешний микросервис, если есть, то выполнить дополнительный запрос»), то машина состояний в обработчиках может выйти достаточно сложной.

Языки с async/await позволяют писать как бы синхронный код (со всеми его преимуществами вроде понятности и простоты поддержки), а управление состоянием происходит под капотом.

задача сводится в оргинизации общения между потоками

Асинхронность и многопоточность в целом параллельные понятия. Внешние события можно получать и от select/poll/epoll (либо через обработчики прерываний на embedded) и крутить всего один поток приложения на всё. Более того, есть Node, где многопоточности на уровне языка нет вообще (нативные модули могут крутить потоки в фоне, но они прозрачны для пользователя рантайма), а асинхронность есть (более того, она как раз больше всего нужна именно если потоков нет или мы экономим на них, потому что без неё не получится запускать несколько IO bounded задач одновременно).

KivApple ★★★★★
() автор топика
Ответ на: комментарий от Pierre_Dolle

В C++ недавно завезли async/await, так что почему бы и нет (тут уже будет срач о той самой безопасности Rust, а не об асинхронном коде), но оригинальный комментарий был про C :-)

KivApple ★★★★★
() автор топика
Ответ на: комментарий от usi_svobodi

Так это ты порвался, что на rust написано. Я тебе и предложил написать на сишечке, если rust не нравится.

WatchCat ★★★★★
()
Ответ на: комментарий от Lrrr

Это называется кроссплатформенное ПО (в данном случае кроссплатформенны либы типа Tokio рантайма, которые используются под капотом)

KivApple ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

Откуда хейтеры узнали о существовании раста? Не из оглушительного ли ко-ко-ко по всему интернету от самих растаманей?

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Интересно, понимает ли кто-то из прицепившихся к Расту, что в веб-разработке (а новость именно про веб-сервис) Rust конкурирует с Go (если брать узкую нишу «запилить REST API в виде одного нативного бинарника») или с Java/Node/Python/etc (если брать широкую нишу веб-приложений вообще, без учёта потребления ими ресурсов), но никак не с C/C++. «Конкурирует» значит есть зрелые фреймворки и батарейки для разработки веб-приложений, есть больше одной компании использующей тот или иной стек (тот же C++ я видел в вебе только в рамках ультралегаси, где у компании есть свой плюсовой фреймворк котому несколько десятков лет, который используется только внутри компании и с него мечтают уйти на Java, но не могут).

Но почему-то ни одного комментария «почему не на Go?» или «почему не на Python?» нет))

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 5)
Ответ на: комментарий от KivApple

Но почему-то ни одного комментария «почему не на Go?» или «почему не на Python?» нет))

Зачем задавать много вопросов, если можно задать один: «Нафига на расте?» ))

u-235
()
Ответ на: комментарий от KivApple

Rust конкурирует с Go

Это не конкуренция, потому что rust продвигается политотой и обслуживается армией трансов-ноулайферов, которые сидят за компом по 14 часов в сутки и переписывают уже работающие приложения. Другие языки такое не смогут перекрыть.

ox55ff ★★★★★
()
Ответ на: комментарий от KivApple

асинхронный код (а это нынче стандарт для веб-приложений, чтобы держать нагрузку)

Смотря что ты под этим понимаешь. h2o и nginx в твоем понимании синхронные или асинхронные?

BruteForce ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.