How to Wiki Database (change log)
http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
22 KiB
278 lines
22 KiB
====== Gemini (протокол) ====== |
|
|
|
Gemini - сетевой протокол прикладного уровня, являющийся наследником протокола Gopher. |
|
|
|
Ориентирован на минимализм и приватность, поскольку исключает использование таких технологий как сжатие, Cookies и JavaScript; |
|
формат передаваемых данных ограничен текстом или бинарными данными, обязательной является подпись TLS. |
|
|
|
Тем не менее, протокол вполне многофункционален и позволяет работать с различными типами ресурсов: как хостинг статических файлов так и системы с авторизацией и обработкой пользовательских запросов - форумы, поисковые системы, организация радио и видео вещания, обмен изображениями и другими мультимедийными данными. |
|
|
|
В виду своих характеристик, Gemini будет интересен тем, кого не устраивает "раздутость" современного протокола HTTP, а также подойдёт для пользователей командной строки, E-ink планшетов. |
|
===== Терминология ===== |
|
|
|
Как и во многих других экосистемах, для Gemini характерна своя терминология, знание которой поможет лучше понимать контекст и формировать поисковые запросы. |
|
|
|
* **Gemini space** - экосистема Gemini, подобно термину "Fediverse" для федеративной тематики |
|
* **Capsule** - капсула, веб-сайт - название протокола отсылается к тематике космической программы, поэтому в сети многие ресурсы наследуют концепцию в своих названиях |
|
* **Gemlog** - блог, персональная страница, фид профиля |
|
|
|
===== Разметка ===== |
|
|
|
==== Gemtext ==== |
|
|
|
Текстовые ресурсы gemtext - это обычный текст (MIME text/gemini) опционально содержащий мета-теги в начале каждой строки: |
|
|
|
<code> |
|
# h1 |
|
## h2 |
|
### h3 |
|
=> ссылка |
|
> цитата |
|
* элемент списка |
|
``` |
|
исходный код |
|
``` |
|
</code> |
|
|
|
Некоторые браузеры поддерживают разметку inline: |
|
|
|
<code> |
|
``` заголовок неформатируемого блока |
|
*bold* |
|
_underline_ |
|
</code> |
|
|
|
В разметке gemini не используются декоративные технологии вроде CSS, при этом задача отрисовки ресурса выполняется на стороне браузера и полностью делегирована клиенту. |
|
|
|
Различные браузеры по-разному отрисовывают содержимое, некоторые добавляют отступы.\\ |
|
Поэтому главный принцип создания "кроссбраузерных" страниц - разметка должна удобно читаться в исходном виде. |
|
|
|
==== Gemfeed ==== |
|
|
|
Поскольку текстовый регламент протокола не подразумевает использование тегов, такие стандарты оповещений как Atom и RSS, без [[https://tildegit.org/solderpunk/gemfeed|внешних средств интеграции]], в Gemini неприменимы. |
|
|
|
Несмотря на это, нативные подписки возможны - средствами [[https://geminiprotocol.net/docs/companion/subscription.gmi|стандарта]] для программной интерпретации изменений документа gemtext. |
|
|
|
Говоря проще, протокол сохраняет человеко-понятную структуру документа, при этом позволяет клиентским приложениям отслеживать его обновления. |
|
|
|
<WRAP round info 60%> |
|
В браузере Lagrange, подписаться на обновления страницы можно с помощью меню ''Bookmarks'' - ''Subscribe to page...'' и выбрать соответствующий странице способ (меню подписок: ''View'' - ''Show Feeds'') |
|
</WRAP> |
|
|
|
=== Отслеживание по дате === |
|
|
|
В данном подходе, осуществляется отслеживание по впереди идущей за ссылкой дате, в формате ISO 8601 (Y-m-d), например: |
|
|
|
<file - /index.gmi> |
|
# Заголовок страницы, выполняет роль заголовка фида |
|
|
|
Содержимое параграфа, игнорируется |
|
|
|
=> /index.gmi любая ссылка, игнорируется |
|
|
|
## Подраздел страницы, игнорируется |
|
|
|
Произвольное содержимое подраздела, игнорируется |
|
|
|
## Публикации |
|
|
|
=> /pub1.gmi 2024-01-28 Ссылка на первую публикацию, отслеживается |
|
=> /pub2.gmi 2024-01-29 Ссылка на вторую публикацию, отслеживается |
|
=> /pub3.gmi Ссылка публикацию, не отслеживается (так как не содержит даты) |
|
=> /pub4.gmi Ссылка публикацию, не отслеживается (так как дата является частью заголовка) 2024-01-30 |
|
</file> |
|
|
|
Таким образом, документ не теряет читаемость для человека и при этом содержит мета-информацию для интерпретатора обновлений. |
|
|
|
Единственный недостаток такого подхода заключается в том, что обновления нельзя получать чаще, чем раз в сутки. |
|
Как заявлено в документации, связано это с временной зоной. |
|
|
|
=== Отслеживание по заголовкам === |
|
|
|
Альтернативный подход, отслеживающий изменения в заголовках документа |
|
|
|
<file - blog.gmi> |
|
# Мой блог, заголовок фида |
|
|
|
Параграф описания |
|
|
|
## Первая публикация, отслеживается |
|
|
|
Описание первой публикации |
|
|
|
=> /pub1.gmi Читать |
|
|
|
## Вторая публикация, отслеживается |
|
|
|
Описание второй публикации |
|
|
|
=> /pub2.gmi Читать |
|
|
|
... |
|
|
|
</file> |
|
|
|
|
|
===== Коды статусов ===== |
|
|
|
* **10-19** - //input expected// - ожидается ввод - используется например для отправки и получения данных форм |
|
* **20-29** - //success// - код 20 аналогичен коду 200 в HTTP |
|
* **30-39** - //redirection// - диапазон переадресации, в отправляемом пакете, код обычно сопровождается мета-ссылкой: ''code + link + \n\r + text'' |
|
* **40-49** - //temporary failure// |
|
* **50-59** - //permanent failure// |
|
* **60-69** - //client certificates// - в Gemini сертификаты используются для идентификации и авторизации пользователей |
|
|
|
Клиент обязан отклонять любой код меньше 10 или больше 69, при этом уведомить пользователя. |
|
|
|
В неопределённых случаях, приоритет будет отдан коду с начальным значением диапазона, например, 10 для 11 или 20 для 27. |
|
|
|
===== Обработка запросов ===== |
|
|
|
Протокол предусматривает обмен пакетами с заголовками длиной максимум 1024 байт. |
|
В эту длину необходимо уместить мета информацию пакета - например строку URI и/или данные пользовательского ввода. |
|
|
|
Текстовые данные должны быть закодированы в стандарт RFC 3986 (известный такими функциями, как urlencode). |
|
В какой то степени, это сокращает полезный объём заголовка при использовании например кириллицы. |
|
|
|
Тело пакета состоит из "сырых" текстовых или бинарных данных без сжатия; сервер закрывает соединение после отправки последнего байта. |
|
|
|
С помощью отправляемых клиенту статусов группы "10", сервер способен запрашивать пользовательский ввод (вместо привычных форм, обычно в браузерах Gemini - это всплывающее текстовое окно) |
|
После получения и обработки данных, сервер обычно возвращает статус "20", статус "51" (не найдено) или редирект на целевую страницу с кодом "30". |
|
|
|
Пример типичного пакета с фразой "Hello world!": |
|
|
|
<code> |
|
20 text/gemini; charset=utf-8; lang=en\r\nHello%20world%21 |
|
</code> |
|
|
|
===== Клиент ===== |
|
|
|
Чтобы открыть ресурс с адресом %%gemini://%% необходим специальный браузер, стандартно работающий с портом 1965. |
|
|
|
Пользователи GUI, могут начать с популярных [[https://gmi.skyjake.fi/lagrange/|Lagrange]], [[https://codeberg.org/jeang3nie/eva|Eva]], [[https://kristall.random-projects.net/|Kristall]] и [[https://github.com/kr1sp1n/awesome-gemini#graphical|других]]. |
|
|
|
**Специфика** |
|
|
|
* так как большинство клиентов возвращают одно-текстовое строчное поле запроса, добавить новую строку можно комбинацией клавиш Shift+Enter |
|
* в протоколе Gemini нет webstorage и cookies, поэтому некоторые интерактивные сайты запрашивают для авторизации сертификат, который также используется для быстрой смены аккаунта |
|
* вместо фидов RSS есть встроенные в браузер инструменты отслеживания контента (см. [[gemini_protocol#gemfeed]]) |
|
|
|
===== Сервер ===== |
|
|
|
Понятие "сервер" в среде Gemini может быть непривычным для пользователей веб, поскольку вместо прокси Nginx или Apache, этот термин зачастую предусматривает полноценный сервис для конкретной задачи, резервирующий за собой отдельный хост и порт. |
|
|
|
В каталоге [[https://github.com/kr1sp1n/awesome-gemini#servers|awesome-gemini]] представлено большое количество таких решений. |
|
|
|
Например, для запуска простой статики, подойдёт сервер [[https://github.com/mbrubeck/agate|Agate]] (Rust). |
|
При этом, название привычного %%index.html%% будет зависеть от выбранного сервера, для Agate - это %%index.gmi%% |
|
|
|
Запуск динамических ресурсов часто предусматривает разработку собственного сокет-сервера для реализации специфики отдельно взятого приложения. |
|
|
|
Веб-разработчикам проще понять принцип работы "server-side" на примере нескольких файлов [[https://github.com/eapl-gemugami/gemini-php|gemini-php]]. |
|
В разработке новых проектов - лучше использовать более актуальне решения, например, из простых - форк библиотеки [[https://github.com/YGGverse/titan-II|titan-II]], примеры реализации на базе которой, можно посмотреть в исходном коде [[https://github.com/kevachat/geminiapp|geminiapp]] для [[social_media:kevachat|KevaChat]] или [[https://github.com/YGGverse/betahowto|проекте зеркала]] данного сайта. |
|
|
|
Одна из лучших универсальных библиотек для разработки асинхронных серверов - [[https://github.com/ratchetphp/Ratchet|Ratchet]]. |
|
|
|
==== Виртуальные хосты ==== |
|
|
|
Чтобы запускать различные сервисы на одном IP (не меняя стандартный порт) следует установить общий прокси-сервер, который будет осуществлять маршрутизацию запросов на соответствующий адрес/интерфейс. |
|
|
|
Если для HTTP - это Apache или Nginx, то для протокола Gemini используются следующие решения: |
|
|
|
* [[gemini_protocol:gmid]] (C) |
|
* [[gemini_protocol:twins]] (Go) |
|
|
|
|
|
|
|
===== Ресурсы ===== |
|
|
|
* %%gemini://geminiprotocol.net%% - домашняя страница проекта |
|
* %%gemini://geminiprotocol.net/docs/ru/%% - документация на русском |
|
* %%gemini://geminispace.info%% - внутрисетевой поиск |
|
* %%gemini://station.martinrue.com%% - социальная сеть по типу twitter |
|
* %%gemini://astrobotany.mozz.us%% - ASCII ботаника / тамагочи |
|
* %%gemini://cthulhu28.space%% - квест по мотивам Космических рейнджеров |
|
* %%gemini://pub.phreedom.club/crypto.gmi%% - курсы криптовалют |
|
* %%gemini://gemlog.blue%% - самый простой способ разместить страничку в сети Gemini ([[https://gemlog.blue|веб-прокси]]) |
|
* %%gemini://cities.yesterweb.org%% - хостинг с поддоменом, есть возможность загрузки файлов через Titan и WebDAV |
|
* %%gemini://flounder.online%% - хостинг с поддоменом и динамическим агрегатором активности на главной странице, есть SFTP |
|
===== Yggdrasil ===== |
|
|
|
==== TLS ==== |
|
|
|
Спорным моментом является обязательное шифрование TLS поверх уже имеющегося слоя. |
|
|
|
Также сертификат TLS предусматривает наличие CN записи, что может стать проблемой при выборе сервера с поддержкой CN/SNI в формате IPv6.\\ |
|
Разработчики серверов не ймут сути вопроса по части отсутствия домена и если есть задача работать с классической адресацией Yggdrasil, следует сразу обратить внимание на форк сервера [[https://github.com/YGGverse/titan-II|Titan-II]] (реализация хостинга статики на его основе - реализована в проектах β-Doku и Pulsar). |
|
|
|
В виду указанных особенностей, более целесообразным выбором для сети Yggdrasil может быть протокол [[:nex_protocol|Nex]]. |
|
==== DNS ==== |
|
|
|
Пользователи [[:yggdrasil:dns:internal_dns|DNS с подключением через Yggdrasil]] и в частности - [[:yggdrasil:dns:alfis#скорость_работы|Alfis DNS]], использующего стандартно AdGuard, могут столкнуться с задержками при открытии казалось-бы легковесных страниц Gemtext. |
|
Связано это с относительно простым устройством внутрисетевых браузеров, разработчики которых не особо стремятся вникать в особенности альтернативных подключений. В то время, как [[:yggdrasil:web-browsers|HTTP браузеры]] из коробки имеют встроенные инструменты кеширования, пользователи Gemini могут ускорить загрузку с помощью кеширующих DNS серверов. Также можно снизить задержки для резольва Clearnet, указав DNS CloudFlare (1.1.1.1) с обычно наиболее высокими показателями отклика. |
|
==== Внутрисетевые ресурсы ==== |
|
|
|
* %%gemini://[301:23b4:991a:634d::b]%% - зеркало сайта, в рамках проекта [[https://github.com/YGGverse/bdoku|β-Doku]] |
|
* %%gemini://betahowto.ygg%% - алиас |
|
* %%gemini://betahowto.duckdns.org%% - алиас в Интернет |
|
|
|
* %%gemini://[301:23b4:991a:634d::1965]%% - инстанс [[social_media:kevachat|KevaChat]] |
|
* %%gemini://kevachat.ygg%% - алиас |
|
|
|
* %%gemini://[301:23b4:991a:634d::db]%% - эксплорер блокчейна KevaCoin [[https://github.com/kvazar-network/geminiapp|KVAZAR]] |
|
* %%gemini://kvazar.ygg%% - алиас |
|
* %%gemini://kvazar.duckdns.org%% - алиас в Интернет |
|
===== Похожие протоколы ===== |
|
|
|
* Gopher |
|
* Guppy - %%gemini://guppy.000090000.xyz/guppy-spec.gmi%% |
|
* Spartan - %%gemini://spartan.mozz.us/specification.gmi%% |
|
* [[:nex_protocol|Nex]] - %%nex://nightfall.city/nex/info/specification.txt/%% |
|
* Scroll - %%gemini://scrollprotocol.us.to%% |
|
* Text - https://textprotocol.org |
|
|
|
==== Сравнение ==== |
|
|
|
<code> |
|
gemini spartan scroll nex |
|
------ ------- ------ --- |
|
naming scheme space sparta/greece scrolls & libraries cityscape & highways |
|
transport TCP + TLS TCP TCP + TLS TCP |
|
request structure full URL hostname & path full URL path |
|
request encoding utf-8 us-ascii utf-8 utf-8 |
|
status codes 18 4 18 0 |
|
document type text/gemini text/gemini text/scroll text/plain |
|
input prompt 1x status "=:" prompt line 1x status none |
|
|
|
data upload limited yes limited no |
|
mimetypes yes yes yes no |
|
virtual hosting yes yes yes no |
|
same-site redirects yes yes yes no |
|
cross-site redirects yes no yes no |
|
proxy requests yes no yes no |
|
"lang" response parameter yes no yes no |
|
lang request parameter no no yes no |
|
response metadata heuristic heuristic yes heuristic |
|
abstract/metadata requests no no yes no |
|
|
|
link relationships heuristic heuristic yes heuristic |
|
list nesting no no yes heuristic |
|
</code> |
|
|
|
Источник: %%gemini://scrollprotocol.us.to%% |
|
|
|
===== Статьи внутри раздела ===== |
|
|
|
{{indexmenu>:gemini_protocol}} |
|
|
|
===== Ссылки ===== |
|
|
|
* [[https://geminiprotocol.net|Официальный сайт]] |
|
* [[https://ru.wikipedia.org/wiki/Gemini_(протокол)|Страница на википедии]] |
|
* [[https://github.com/kr1sp1n/awesome-gemini|Каталог программного обеспечения на GitHub]] |
|
* [[https://www.dokuwiki.org/plugin:gemini|Плагин для DokuWiki]] | [[https://github.com/YGGverse/bdoku|Проект β-Doku]] |
|
* [[https://portal.mozz.us|Веб-прокси]] |
|
* [[https://gopher.emacs.ch|Поиск с функцией веб-прокси для протоколов Gemini, Gopher, Spartan]] |
|
* [[https://github.com/YGGverse/Yo/tree/gemini|Ветка]] поисковой системы [[:yggdrasil:sites_and_services:search_services:yo|Yo!]] для протокола Gemini |
|
* [[https://github.com/YGGverse/Yoda|Yoda]] - экспериментальный браузер на базе PHP-GTK от YGGverse (в разработке) |
|
* [[https://github.com/YGGverse/Pulsar|Pulsar]] - агрегатор фидов RSS в статические файлы Gemtext |