commit - fa4e39d630f0a9a5e7e2a1cd406ffceb5284cbfc
commit + 9c0941c58e671ee9a188a73146ad02a97529708b
blob - 2a3fbd863a7d5982e93e2a2b38002a70228fd5ee
blob + fa1ccc44f1bfd47e69c4924c8edd31e2cb658e59
--- README.gmi
+++ README.gmi
-# vostok: simple C++11 Gemini sever
+# vostok: simple C++11 Gemini server
A self-signed certificate is required:
```
blob - ad6017c986ebf6a7e6e38600a1f4bbc605dceb79
blob + 8750fabb0edd9ed2bb18cd373606cd821b950e4a
--- reports/0.0.1.gmi
+++ reports/0.0.1.gmi
# vostok: простой сервер Gemini на C++11
-Столкнувшись в очередной раз с протоколом Gemini я перед сном решил почитать его спецификацию:
+Столкнувшись в очередной раз с протоколом Gemini я перед сном решил почитать его спецификацию.
=> gemini://gemini.circumlunar.space/docs/specification.gmi Project Gemini (Speculative specification)
-В целом мне очень понравилось то, что автор называет протокол простым и на самом деле протокол оказался несложным. Хотя и тут стоит отметить, что использование прослойки TLS в качестве транспортного уровня делает эту самую простоту весьма условной. В противовес этому, например, протокол Spartan работает поверх обычного TCP. Наверное, если бы я сейчас сел писать реализацию заново, то выбрал бы spartan.
+В целом мне очень понравилось то, что автор называет протокол простым и на самом деле протокол оказался несложным. Хотя и тут стоит отметить, что использование прослойки TLS в качестве транспортного уровня делает эту самую простоту весьма условной. В противовес этому, например, протокол Spartan работает поверх обычного TCP. Наверное, если бы я сейчас сел писать реализацию заново, то выбрал бы spartan. А может быть и до него дойдут когда-нибудь руки.
=> spartan://spartan.mozz.us The Spartan Protocol Homepage
-Что-то в спецификации протокола меня зацепило и я написал свою реализацию сервера Gemini на C++11 - vostok (Восток). Название, очевидно, отсылает к названию советский космический корабль "Восток-1", на котором Юрий Алексеевич Гагарин совершил первый в мире пилотируемый полёт в космос.
+## Сборка проекта
-...work-in-progress...
+Что-то в спецификации протокола меня зацепило и я написал свою реализацию сервера Gemini на C++11 - vostok (Восток). Название отсылает к имени советского космического корабля "Восток-1", на котором Юрий Алексеевич Гагарин совершил первый полёт человека в космос.
-libtls
+Итак, собственная реализация сервера Gemini. Язык выбран C++, точнее С++11. Причина выбора языка и его редакции - моя личная "вкусовщина". Целевая платформа: Unix-like, без привязки к какой-то конкретной реализации. Сам собираю-запускаю-проверяю на двух платформах:
+* OpenBSD 7: сборка clang'ом с помощью BSD make
+* Alpine Linux: сборка g++ с помощью GNU make
+
+Кстати, g++ не входит в базовую систему Alpine Linux, поэтому нужно установить его из одноименного пакета.
+
+Единственная внешняя зависимость - libtls, так как я сторонник не городить свои "велосипеды" в области криптографии. libtls это библиотека из состава LibreSSL:
=> https://www.libressl.org/ LibreSSL
+На OpenBSD, соответственно, libtls есть "из коробки". А, например, в Alpine Linux требуется установить пакет libressl-dev.
+
+Перед запуском серверу нужен ключ и сертификат, который можно сгенерировать в под-директории cert/ командой openssl:
```
-cert$ openssl req -newkey rsa:4096 -nodes -keyout server.key -x509 -days 36500 -out server.crt
+$ mkdir cert
+$ openssl req -newkey rsa:4096 -nodes -keyout cert/server.key -x509 -days 36500 -out cert/server.crt
```
+После этого всё готово к тому, что бы собрать-запустить сервер командой "make run_server".
```
-openssl s_client -crlf -quiet -connect -no_ssl3 -no_tls1 -no_tls1_1 -connect localhost:1965 <<< "gemini://gemini.any-key.press/reports/0.0.1.gmi"
+$ make run_server
```
+Если при сборке-запуске не произойдёт ошибок, то на экране появится строка, обозначающая что сервер готов принимать входящие запросы:
+```
+$ make run_server
+make -C vostok
+c++ -Wall -Wextra -std=c++11 -I../shared transport.cc error.cc gemini.cc args.cc parse_url.cc vostok.cc -ltls -o vostok
+./vostok/vostok -c cert/server.crt -k cert/server.key -f ./
+🚀 Vostok server listening...
+```
-тесты
-(?) std::err заменить на syslog(3)
+## Возможности сервера
-/etc/mime.types
-задавать редиректы, что позволит открывать index.gmi при открытии корня
+Первая версия сервера vostok обладает весьма скромными возможностями. Это сервер, который который отдает содержимое статических файлов с файловой системы. Все файлы отдаются с пустой строкой META, что подразумевает содержимое в формате "text/gemini; charset=utf-8".
-вместо создания thread'ов на каждое соединение хорошо бы перейти на неблокирующий ввод-вывод и фиксированное количество воркеров (thread'ов)
+Запущенный исполняемый файл принимает следующие параметры командной строки:
+* -a ADDR: IPv4 адрес интерфейса, на котором сервер будет слушать входящие соединения. Значение по умолчанию - "127.0.0.1".
+* -p PORT: номер порта, на котором сервер будет слушать входящие соединения. Значение по умолчанию - "1965".
+* -c FILE: путь к файлу сертификата.
+* -k FILE: путь к ключу файла сертификата.
+* -f PATH: путь к директории на файловой системе, откуда будут отдаваться файлы.
+На моем OpenBSD сервере я оформил демон запуска следующим образом:
+```
+# cat /etc/rc.d/vostok
+#!/bin/ksh
+daemon_args="-a 5.23.49.151 -k /var/vostok/cert/server.key -c /var/vostok/cert/server.crt -f /var/vostok/static"
+daemon_user="_vostok"
+daemon="/home/_vostok/src/vostok/vostok ${daemon_args}"
+. /etc/rc.d/rc.subr
+pexp="${daemon}.*"
+rc_reload=NO
+rc_bg=YES
+
+rc_cmd $1
+```
+
+## Gemini клиент
+
+Изначально я планировал проект vostok, как пару: сервер статики и собственный клиент (простой браузер). Но потом я понял, что лично для меня утилиты openssl в паре с less вполне хватает, что бы смотреть Gemini страницы. Что бы отобразить Gemini содержимое пользуюсь примерно такой командной строкой:
+```
+openssl s_client -crlf -quiet -connect -no_ssl3 -no_tls1 -no_tls1_1 -connect localhost:1965 <<< "gemini://vostok.any-key.press/reports/0.0.1.gmi" | less
+```
+
+Если вам хочется более функциональный браузер, то я я рекомендую присмотреться к консольному amfora.
+=> https://github.com/makew0rld/amfora
+
+Браузеры для Gemini с графическим пользовательским интерфейсом я никогда не пробовал, поэтому посоветовать ничего не могу.
+
+## Планы на будущее
+
+Для начала я хочу немного привести код в порядок:
+* покрыть сервер тестами
+* заменить вывод логов в std::сerr на работу с syslog(3)
+
+Затем немного нарастить функционал самого сервера:
+* сделать поддержку MIME-типов при отдаче статики
+* сделать возможность задавать редиректы (что, например, позволит редиректить открытие корневой и не только директории на файл index.gmi)
+
+## Исходный код
+
+=> ssh://anonymous@got.any-key.press/vostok git репозиторий с исходным кодом
+=> https://got.any-key.press/?action=summary&path=vostok.git WEB интерфейс git репозитория с исходным кодом
+
+## Обратная связь
+
+Ваши патчи, вопросы и предложения присылайте на электронную почту vostok@to.any-key.press
+
+Если вы не знакомы с практикой отсылки git-патчей через элетронную почту, то рекомендую к ознакомлению ресурс:
+=> https://git-send-email.io/ Learn to use email with git