В одной из прошлых статей мы уже рассказывали про mesh-сеть Yggdrasil и про то, на что способна данная оверлейная сеть, однако в этот раз, мы хотим продолжить рассказ и хотим это сделать с несколько иной стороны. Как описывалось ранее, есть ряд идей, которые можно реализовать в Yggdrasil, поскольку он сильно отличается от классического Интернета и не накладывает ограничений последнего.
Это обстоятельство позволяет дать жизнь «новым» старым технологиям, одной из которых является протокол Gemini, и именно о создании своего gemini-сервера мы и расскажем в этой статье.
Внимание! В этой статье мы практически не затрагиваем основную тематику блога, а именно, язык программирования D, а хотим поделиться оригинальным материалом и своим личным видением ситуации. Поэтому просим вас спокойно отнестись к данному материалу и просим заинтересовавшихся поспособствовать развитию geminispace (геминисферы, пространства ресурсов на Gemini), в особенности, в Yggdrasil.
Введение
Gemini — это такое развитие некогда популярного в сети протокола Gopher, который позволял просматривать искать и просматривать документы и файлы в сети. Gemini чем-то похож на Gopher, но в отличие от последнего не имеет ряда проблем последнего, но имеет очень простое описание и является более безопасным, ориентируясь на более современные технологии. Также, как и в случае привычного Web, в Gemini также есть нечто похожее на сайты, называемое капсулами.
Капсулы, также как и сайты отдают некоторое содержимое, которое можно просматривать через специальные браузеры (например, красивый клиент под названием Lagrange), но в отличие от www-ресурсов, содержимое имеет более жесткую структуру. Это обстоятельство упрощает выдачу информации, но сам протокол Gemini (который кстати сказать имеет описание на две страницы и не подвержен изменениям) накладывает некоторые ограничения на содержимое: в частности, в Gemini не будут работать привычные скрипты и шикарное оформление, поскольку не поддерживается многое из того, что сделало современный Интернет таким, каким мы видим его сейчас.
Упрощенный вид ресурсов Gemini способен расстроить тех, кто имел опыт web-разработки или поддержки сайтов, однако, благодаря тому, что содержимое gemini-ресурсов или только текстовое, или только бинарное, сама геминисфера визуально более чистая и опрятная, чем большая часть современного Интернета.
Отсутствие рекламы, лишнего визуального наполнения на страницах капсул, а также трекинга пользователей, делает геминисферу отличным средством для публикации различного рода материалов, которые предполагают интенсивное чтение и ознакомление с предоставленной информацией; а применение Yggdrasil позволяет буквально каждому без каких-либо технических ограничений создать свой ресурс, который можно наполнить любой информацией.
Создание своей капсулы на базе Raspberry Pi
Для того, чтобы создать свою капсулу не требуется много ресурсов, поскольку протокол Gemini достаточно прост, а серверная и клиентская часть для него спроектированы так. чтобы можно было их запустить почти на любой платформе. И это действительно так, поскольку можно используя сравнительно дешевый одноплатный компьютер, можно буквально за 15 минут подготовить к работе свой, абсолютно уникальный ресурс.
Далее, мы опишем инструкцию, предполагая, что у вас имеется одноплатный компьютер Raspberry Pi (или похожий), и что у вас уже настроена работа с Yggdrasil (например так, как описывалось в нашей статье). При необходимости, подобные процедуры могут быть повторены практически на любом другом компьютере, единственное отличие в процессе установки, которое может вам встретится — это установка свежего компилятора языка программирования Go.
А мы начинаем и первый шаг, который мы делаем — установка компилятора Go в Raspberry Pi OS, которую можно выполнить командой:
sudo apt install golang
Далее, требуется узнать ваш сетевой адрес в сети Yggdrasil, что можно сделать командой:
sudo yggdracilctl getSelf
После этого необходимо создать папки для содержимого капсулы, сертификаты сервера (имена могут быть другими, необязательно, такими же как в этой статье):
mkdir -p content certs
После этого переходим в папку с сертификатами (в нашем случае, это папка с именем certs) и выполняем генерацию сертификатов на основании уже полученного адреса в Yggdrasil:
cd certs openssl req -newkey rsa:2048 -nodes -keyout server.key -nodes -x509 -out server.crt -subj "/CN=сетевой_адрес_в_Yggdrasil_без_квадратных_скобок"
Теперь требуется установить сервер, который будет обслуживать капсулу. Сам сервер называется Molly Brown и установить его можно с помощью команд (предварительно осуществляем выход из каталога certs):
cd .. go get tildegit.org/solderpunk/molly-brown
Установка в этом случае выполняется средствами компилятора Go, а он предполагает, что в папке текущего пользователя есть папка под названием go. Если это не так, предлагаем создать данную папку; но если вы не хотите этого делать, то требуется установить переменную GOPATH среды, указав нужную папку, в которую будет установлен сервер (требуется просто перед предыдущей командой прописать GOPATH="<путь_к_вашей_папке>"
). Дальнейшие инструкции предполагают, что выбрана папка по умолчанию (напоминаем, что называется она go).
Далее можно скопировать конфигурацию Molly Brown из примера в поставке сервера и внести в нее нужные изменения (опиываются далее):
cp ~/go/src/tildegit.org/solderpunk/molly-brown/example.conf molly.conf
Или просто создать конфигурацию с нуля:
touch molly.conf
Далее, добавляем следующее в конфигурацию, подставив нужные параметры:
Hostname = "сетевой_адрес_в_Yggdrasil_без_квадратных_скобок" CertPath = "путь_к_папке_certs/server.crt" KeyPath = "путь_к_папке_cert/server.key" DocBase = "путь_к_папке_content/"
И остается далее запустить Molly Brown командой:
~/go/bin/molly-brown -c molly.conf
Для упрощения дальнейшей работы, можно установить Molly Brown вручную выполнив следующую команду (опционально):
sudo cp ~/go/bin/molly-brown /usr/bin
Также, для того, чтобы не запускать Molly Brown вручную каждый раз, можно создать для сервера запись в systemd. Это позволит запускать сервер при старте системы и автоматически перезапускать его автоматически в случае, если сервер не активен по какой-либо причине.
Для начала отредактируем пример конфигурации, который идет в поставке Molly Brown. Этого можно достичь выполнив следующую команду:
nano ~/go/src/tildegit.org/solderpunk/molly-brown/contrib/init/molly-brown.service.example
Теперь вносим следующие изменения:
[Unit] Description=Molly Brown gemini server After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=10 User=root ExecStart=/usr/bin/molly-brown -c /etc/molly.conf [Install] WantedBy=multi-user.target
Копируем файл с последующим переименованием:
cp ~/go/src/tildegit.org/solderpunk/molly-brown/contrib/init/molly-brown.service.example /lib/systemd/system/molly-brown.service
Предполагается, что было выполнено копирование Molly Brown в /usr/bin, и тогда остается лишь скопировать ее конфигурацию в /etc/ и исправить права на папку с сертификатами:
sudo cp ~/molly.conf /etc/molly.conf sudo chmod -R 666 certs
После чего, перезагружаем демона systemd и включаем наш сервис:
sudo systemctl daemon-reload sudo systemctl enable molly-brown.service sudo systemctl start molly-brown.service
В принципе, капсула запущена и большую часть необходимых процедур вы проделали, но в папке с содержимым у вас ничего нет, поскольку здесь нет каких-либо значений по умолчанию и наполнять капсулу содержим предстоит вам самостоятельно.
Как наполнять капсулу содержимым
Здесь мы взяли на себя смелость несколько облегчить вам наполнение капсулы, для чего мы осветим ряд моментов, которые подготовят для вас почву и позволят практически сразу начать.
Внимание! Этот раздел следует воспринимать скорее, как небольшую шпаргалку для быстрого старта, а не как исчерпывающее пособие. Поэтому, для более глубокого понимания рекомендуем вам ознакомится со ссылками в конце этой статьи.
Если вы следовали нашим инструкциям, то у вас уже подготовлена папка для содержимого вашей капсулы, которая называется contents. Именно в этой папке будет храниться все содержимое капсулы, которое будет доступно через gemini-клиент. Сразу поясним тот момент, что в отличие от систем управления содержимым (они же CMS) и административных интерфейсов, здесь вам придется все делать или вручную, что означает ручное или автоматизирование создание некоторых файлов, которые обcлуживает сервер Molly Brown.
Что это за файлы ?
В Gemini-пространстве принятым способом раздачи текстового содержимого является не обычный текст (как это делал Gopher, к примеру), текст с определенной разметкой.
Данная разметка создается с использованием собственного легкового языка разметки под названием Gemtext (неофициальный тип MIME: text/gemini), который чем-то схож с разметкой Markdown. Файлы с данной разметкой являются обычными текстовыми файлами, содержащими разметку в формате Gemtext, с расширением *.gmi (наиболее распространено, и именно его рекомендуем для Molly Brown) или *.gemini.
Таким образом, в вашей папке content или аналогичной ей, должны будут содержаться gemtext-файлы (или gmi-файлы, в случае файлов с расширением *.gmi; или же gemini-файлы, если речь идет про файлы с расширением gemini), основным из которых служит файл index.gmi или index.gemini.
Далее, мы расскажем про базовые основы разметки Gemtext, остальное вы сможете освоить самостоятельно.
Основой Gemtext является обычный текст в формате UTF-8 и пишется он в gemini-документах с помощью так называемых «длинных строк».
«Длинные строки» в данном контексте означают то, что строки не имеют ограничений по длине и внутри документа не должны иметь переносов, поскольку не сервер определяет как рендерится содержимое, а сам клиент. На практике это значит, что для того, чтобы сделать новый параграф вам нужно сделать новую строку, а если вы вставляете в документ пустые строки между параграфами, то со стороны клиента они выведутся также пустыми строками и читатель увидит их именно так, как их ввели. С другой стороны, стоит помнить про то, что если вы сделали ряд «коротких» (т.е маленьких) строк, то они не будут объединены в одну длинную.
Также, помимо обычного текста в файлах могут присутствовать ссылки на другие ресурсы (не только, на gemini-ресурсы, а вообще на любые ресурсы, в формате URI). Однако, на ссылки действуют очень жесткие ограничения, в частности, ссылку вы можете создать только на отдельной строке. Ссылки в gemtext формируются очень просто: строка с ссылкой начинается с символов =>
, за которыми идет ряд пробелов или табуляций, после чего идет URL (на любой протокол). В принципе, этого достаточно для формирования ссылки, однако чаще всего после ссылки идет один пробел или табуляция, после которой следует человекопонятное описание ссылки.
В gemtext могут присутствовать заголовки, которые оформляются следующим образом:
# Заголовок ## Подзаголовок ### Подподзаголовок
Помимо заголовков, в тексте могут быть также списки (их элементы начинаются с символа *
), которые в отличие от остальных языков разметки здесь только одного вида и они не могут быть вложенными, вот примера синтаксиса для списков:
* Пункт 1 * Пункт 2 * Пункт 3
Для оформления некоторых особых блоков могут применятся цитаты, которые могут быть любой длины (как и ссылки, и элементы списка) и пишутся одной строкой, которая начинается с символа >
:
> И роза, как ее не назови ...
Последним элементом разметки является преформатированный текст, который служит для формирования блоков со строго определенным форматом, который клиент не должен изменять: блоки кода, куски отдельных документов, особое форматирование и т.п. Следует помнить, что внутри преформатированного текста, не действуют правила разметки Gemtext и строки, которые были отмечены как заранее форматированный текст будут выводится без всякого рендеринга со стороны клиента. Данный вид содержимого в gemtext заключается в три апострофа (вот в такие — ```
) с начала и с конца самого блока с заранее подготовленным текстом.
На этом основы gemtext заканчиваются и далее вы можете ознакомится с ними по этой ссылке (внимание ! ссылка ведет в геминисферу).
Для работы вашего ресурса в папке content должени быть как минимум один gmi-файл, и как правило, это файл index.gmi с основной страницей вашей капсулы, которую вы оформляете самостоятельно.
Вот к примеру, как выглядит в Lagrange экспериментальная капсула одного из авторов блога, которая хостится чисто в Yggdrasil:

А вот ее разметка:
# Личная капсула пользователя aquaratixc > Я мыслю, следовательно, я существую... День добрый ! Вы попали в мою первую капсулу и здесь вы можете найти самые разнообразные материалы из того, что интересно мне. => gemini://[200:c5dc:bf66:3941:22a8:9901:ac72:d1b]/glog/index.gmi Посты в гемлоге (в порядке их публикации)
Используемые материалы
Для интересующихся прилагаем небольшой набор ссылок на разные материалы (часть ресурсов находятся в gemini-пространстве):
- Официальный сайт протокола Gemini
- Часто задаваемые вопросы по проекту Gemini
- Список клиентов, серверов и прочего программного обеспечения для Gemini
- Поисковая система по gemini-ресурсам (если будете создавать свой ресурс, то рекомендуем сюда добавить на него ссылку)
- Шпаргалка по Gemini-text
- Советы для практической реализации Gemini
- Неплохая статья по настройке сервиса systemd
- Наша статья про настройку Yggdrasil и в общих чертах про Gemini
- Личная капсула aquaratixc в Yggdrasil: gemini://[200:c5dc:bf66:3941:22a8:9901:ac72:d1b]/glog/index.gmi
Особые благодарности
Авторы блога выражают огромную благодарность администратору проектов phreedom и одному из популяризаторов русскоязычного сегмента Fediverse — Толстоевскому, чьи статьи по Yggdrasil и настройке капсулы в нем послужили основанием для этой статьи.
Авторы блога крайне рекомендуют к прочтению глог (аналог блога в Gemini) Толстоевского, который доступен здесь.