ALFIS - распределенная система доменных имен

:!: Важно!
У ALFIS обнаружены фундаментальные проблемы в дизайне https://github.com/Revertron/Alfis/issues/364

ALFIS (Alternative Free Identity System - альтернативная свободная система идентификации) - распределенная система доменных имен.

Преимущества ALFIS перед Wyrd и другими системами DNS:

  • Система распределенная, нет центрального сервера, при выходе из строя которого, вся система перестанет работать
  • Резолв внутрисетевых адресов происходит быстрее, т.к., обращение идет к локальному резолверу, встроенному в ALFIS
  • DNS запросы не подвержены перехвату
  • Предполагаются все возможности по работе с DNS, как в обычных (централизованных) системах
  • Относительно малый объем блокчейна, в сравнении с другими подобными системами
  • Открытый исходный код

К недостаткам можно отнести относительно долгий процесс «регистрации» доменного имени, передачи доменного имени другому пользователю, внесения изменений в записи доменных имен. Всё это связано с особенностями технологии блокчейн на принципе PoW и необходимостью майнинга для внесения изменений в блокчейн, который, собственно, содержит записи доменных имен. Кроме того, особенностью ALFIS является то, что, на данный момент, с одним персональным ключом блок с новым доменом можно майнить не чаще, чем раз в сутки.

С версии 0.4.34 в ALFIS добавлено ограничение на максимальное количество зон - 10 шт. (ввод ограничений связан с тем, что некоторые пользователи начали злоупотреблять возможностью майнить зоны и намайнили несколько бессмысленных зон).

Установка

DNS-сервис, без GUI (Debian / Ubuntu)

Эта версия подойдет тем, кто хочет установить ALFIS только в качестве DNS-резолвера.

Скачиваем ключ репозитория и добавляем его в APT:

wget -O - https://deb.revertron.com/key.txt | sudo apt-key add -

Добавляем репозиторий в список источников APT:

echo 'deb http://deb.revertron.com/ debian alfis' | sudo tee /etc/apt/sources.list.d/alfis.list

Обновляем информацию о доступных пакетах и устанавливаем ALFIS:

sudo apt update && sudo apt install alfis

Конфигурационный файл ALFIS будет располагаться в /etc/alfis.conf, блокчейн будет сохранен в директорию /var/lib/alfis.

Если у вас запущен другой DNS-сервер, работающий на TCP-порту 53, ALFIS не сможет корректно запуститься. Либо измените в конфигурационном файле порт ALFIS, либо измените порт ранее установленного DNS-cервера и укажите его в качестве upstream-сервера для ALFIS.

Пропишите ALFIS в качестве резолвера в /etc/resolv.conf или другим способом, используемым в вашей ОС.

Версия с GUI (Windows / Linux / MacOS)

Для регистрации новых и управления уже зарегистрированными доменными именами вам потребуется версия ALFIS с GUI.

Скачать готовые бинарные сборки под распространенные ОС и архитектуры можно со страницы релизов репозитория проекта на GitHub (нужна версия без nogui в наименовании архива).

Скачайте архив с нужной сборкой и распакуйте его в любую удобную вам директорию.

После распаковки в Linux сделайте файл исполняемым командой:

chmod +x alfis

В Windows для запуска ALFIS необходимо наличие установленного Microsoft VC Redistributable (набор динамических библиотек Microsoft Visual C++). Скачать установщик можно по этой ссылке: Microsoft Visual C++ 2015 Update 3 RC. Установка выполняется довольно просто, проблем вызвать не должно.

Для запуска ALFIS под Windows версии ниже 8.1 требуется наличие библиотеки api-ms-win-shcore-scaling-l1-1-1.dll. Скачать библиотеку можно по этой ссылке. Библиотеку необходимо разместить в том же каталоге, где находится alfis.exe.

Далее просто запустите исполняемый файл.

В Linux: ./alfis
В Windows: alfis.exe

По-умолчанию, ALFIS ищет конфигурационный файл в директории, где находится исполняемый файл, в этой же директории создаётся база данных с блокчейном blockchain.db.

Чтобы указать ALFIS другой путь к конфигурационному файлу, можно запустить его с параметром -с:

alfis -c /etc/alfis.conf

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

alfis -w /home/elf/alfis/

Как "зарегистрировать" доменное имя в ALFIS

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

Но перед майнингом самого блока с доменными именами необходимо, так сказать, «зарегистрироваться» в системе - намайнить персональный ключ, который будет использоваться для управления своими DNS-записями.

Генерирование персонального ключа

GUI ALFIS прост и интуитивно понятен.

Для майнинга ключа в разделе Credentials просто нажимаем Mine new key. Этот процесс может занять от нескольких часов до нескольких дней в зависимости от мощности процессора.

После того как ключ будет готов, рекомендую сохранить его в файл для дальнейшего использования (Save key).

Регистрация доменного имени

Для добавления DNS записей, в разделе Credentials выбираем свой ключ (Load key), в разделе Domains нажимаем «New Domain», далее вводим желаемое доменное имя, выбираем зону (например, .ygg (в зонах, помеченных звездочкой, возможен майнинг доменных имен, связанных только с адресами Yggdrasil)), жмем Add record.

В открывшейся формочке необходимо будет указать параметры DNS-записи. Для простоты можно указать имя @, тип AAAA (соответствует IPv6) и ваш IP-адрес. @ означает root (корень). Этого будет достаточно для того, чтобы поставить в соответствие IP-адрес и выбранное доменное имя. Если планируется использовать домены третьего уровня (например, www.dname.ygg), то нужно будет их сразу прописать, чтобы не майнить каждую запись отдельно. Чтобы не прописывать каждый домен третьего уровня отдельно, в поле name можно указать *.

Должно получиться так, как на картинке ниже.

По кнопке с подменю «Advanced» можно указать дополнительную информацию по домену: Set owner contacts - контактные данные владельца, Set domain info - дополнительная информация, связанная с доменом; Change domain owner - используется для передачи домена другому пользователю.

После того, как всё заполнено, нажимаем Mine domain и ждем, когда процесс майнинга завершится. Процесс может занять продолжительное время.

Если, вдруг, после нажатия Mine domain вы увидите сообщение «You have cooldown, just xxx more minutes!», это означает, что вы пытаетесь запустить майнинг блока чаще, чем раз в сутки. Придется подождать указанное количество минут.

Как остановить майнинг

Остановить майнинг можно нажав на красный мерцающий индикатор майнинга в левом нижнем углу окна ALFIS.

Где хранится блокчейн

Блокчейн локально хранится в базе SQLite (файл blockchain.db). Просмотреть содержимое базы можно, например, с помощью DB Browser for SQLite. Домены не содержатся в базе в открытом виде, только их хэши.

Кроме того, cofob разработал красивый web-blockchain-viewer: https://viewer.alfis.name/. Исходный код: https://git.sr.ht/~cofob/AlfisViewer

Как использовать ALFIS в качестве резолвера

Запущенный ALFIS с графическим интерфейсом может корректно резолвить доменные имена.

Для использования ALFIS исключительно, как резолвера, без отрисовки графического интерфейса, нужно запустить его с параметром -n.

Резолвер начнет работать на адресе и порте, указанными в конфигурационном файле alfis.toml.

Кроме того, можно скачать специальную версию ALFIS без графического интерфейса. На странице релизов такие версии имеют имена с добавлением nogui.

Адреса вышестоящих DNS-серверов указываются в конфигурационном файле - параметр forwarders.

Linux

Если вы запускаете ALFIS на Linux имейте ввиду: в большинстве современных дистрибутивов для того, чтобы использовать для прослушивания TCP-порты от 0 до 1024 необходимо обладать правами суперпользователя, т.к. эти номера портов зарезервированы для нужд системы и используются различными системными службами/демонами. DNS, по-умолчанию работающая на порту 53, относится к таким системным службам, поэтому, запуская ALFIS в качестве системного резолвера DNS на порту 53, вы должны запускать его с правами супервользователя (либо с соответствующими Capability в systemd-юните), иначе этот порт вами зарезервирован не будет. Так же, учитывайте то, что на этом же порту уже могут работать другие системные службы (systemd-resolved, dnsmasq, BIND, etc.). Убедитесь, что запускаете ALFIS, резервируя порт на таком IP-адресе, на котором он еще не занят. Скорее всего, ваш IPv6-адрес Yggdrasil будет не занят, и его можно указать в конфигурационном файле alfis.toml так:

[dns]
# Your DNS resolver will be listening on this address and port (Usual port is 53)
listen = "[2xx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:53"

Также можно использовать для сервиса ALFIS адрес подсети
Ниже указан пример для запуска на 53 порту (по-умолчанию) где постфикс ::53 в адресе - выделенный для службы адрес из свободного диапазона.

  1. yggdrasilctl getself → 3xx:xxxx:xxxx:xxxx::/64
  2. ifconfig lo inet6 add 3xx:xxxx:xxxx:xxxx::53 (не сохраняется при рестарте системы)
  3. в listen /etc/alfis.conf указываем [3xx:xxxx:xxxx:xxxx::53]:53
  4. в /etc/systemd/resolved.conf DNS=3xx:xxxx:xxxx:xxxx::53
  5. systemctl restart alfis и systemctl restart systemd-resolved

Далее, ознакомьтесь с тем, как прописать этот адрес в качестве системного резолвера: Настройка DNS в различных операционных системах.

Как проверить работу резолвера ALFIS

Примеры:

dig AAAA @127.0.0.1 -p 5300 gostcoin.ygg
dig AAAA @127.0.0.1 -p 5300 nnmclub.ygg +short

Здесь 127.0.0.1 - адрес, на котором работает резолвер, 5300 - порт резолвера (см. alfis.toml).

Если резолвер ALFIS уже прописан в качестве системного резолвера и если он прослушивает порт 53 (DNS), то команда может быть такой:

dig AAAA rutor.ygg
dig AAAA nnmclub.ygg +short

В результате выполнения команд вы должны будете увидеть IP-адреса указанных доменов.

Описание конфигурационного файла ALFIS

# Хэш первого блока в цепи, чтобы знать с какими узлами работать
origin = "0000001D2A77D63477172678502E51DE7F346061FF7EB188A2445ECA3FC0780E"
# Пути к файлам ваших ключей для их автоматической загрузки
key_files = ["key1.toml", "key2.toml", "key3.toml", "key4.toml", "key5.toml"]
# Какое количество блоков проверять при старте
check_blocks = 8

# Сетевые настройки
[net]
# Бутстрап-узлы (узлы, к которым вы подключитесь в первую очередь, чтобы получить информацию о других узлах)
peers = ["peer-v4.alfis.name:4244", "peer-v6.alfis.name:4244", "peer-ygg.alfis.name:4244"]
# Адрес и порт, на которых ваш узел будет ожидать подключения от других узлов
listen = "[::]:4244"
# Если вы хотите участвовать в обмене пирами, установить здесь true, false - если не хотите
public = true
# Разрешить подключения только внутри сети Yggdrasil (входящие и исходящие) (https://yggdrasil-network.github.io)
yggdrasil_only = false

# Настройки DNS-резолвера
[dns]
# DNS-резолвер будет ожидать подключения на этом адресе и TCP-порте (обычно это порт 53)
listen = "127.0.0.1:53"
# Сколько потоков породит DNS-сервер
threads = 20
# DNS-серверы AdGuard (для фильтрации рекламы и отслеживающих трэкеров)
forwarders = ["https://dns.adguard.com/dns-query"]
#forwarders = ["94.140.14.14:53", "94.140.15.15:53"]
# Серверы Cloudflare 
#forwarders = ["https://cloudflare-dns.com/dns-query"]
#forwarders = ["1.1.1.1:53", "1.0.0.1:53"]

# DNS-серверы для резолва доменов провайдеров DoH
bootstraps = ["9.9.9.9:53", "94.140.14.140:53"]

# Поддержка файла hosts (/etc/hosts) (для разрешения локальных имен или блокировки рекламы)
#hosts = ["system", "adblock.txt"]

#Настройки майнинга
[mining]
# Количество потоков CPU для майнинга, ноль = количество ядер CPU
threads = 0
# Установить низкий приоритет для потоков майнинга
lower = true

Параметры командной строки

Опции:
    -h, --help          Вывод этой подсказки
    -n, --nogui         Запуск без графического интерфейса (используется по-умолчанию для сборок без GUI)
    -v, --version       Вывод версии и выход
    -d, --debug         Выводить еще больше отладочной информации
    -b, --blocks        Показать содержимое блоков в базе данных и завершить работу
    -g, --generate      Генерировать новый конфигурационный файл (будет выведен в консоль)
    -k, --gen-key FILE  Генерирование (майнинг) новых ключей и сохранение их в файл
    -l, --log FILE      Записывать лог в файл
    -s, --status FILE   Записывать статус в файл (информация о количестве узлов, блоков, ключей, доменов)
    -c, --config FILE   Путь к конфигурационному файлу
    -w, --work-dir DIRECTORY
                        Путь к рабочей директории
    -u, --upgrade FILE  Путь к конфигурационному файлу, который вы хотите обновить. Обновлённый файл будет выведен в консоль.

Публичные серверы DNS ALFIS

ALFIS предназначен для локального разворачивания с использованием сервиса DNS на адресе 127.0.0.1:53. Однако существуют общедоступные серверы, использование которых избавляет от запуска ALFIS на своем устройстве. Такие серверы собраны на странице: Внутрисетевые DNS.

Дополнительно

Домен .at

Благодаря ufm все Yggdrasil-адреса, для которых есть доменное имя ALFIS (оканчивающееся на .ygg), доступны [без дополнительных настроек] через домен .at. Т.е., ресурс с доменным именем ALFIS, вида domain.ygg будет доступен и по доменному имени domain.ygg.at. При этом, нет необходимости менять свои настройки DNS, прописывать DNS-сервера ALFIS и т.п.

Для примера:

<domain>.ygg.at резолвится в Yggdrasil-IPv6-адрес.

Настройка браузеров

По-умолчанию, браузеры интерпретируют неизвестные доменные зоны как поисковую фразу.

Чтобы добавить поддержку новых доменных зон, необходимо добавить соответствующие настройки для Chrome и Firefox .

Скорость работы

Из коробки, Alfis использует в качестве forward сервера по-умолчанию AdGuard, пинг которого может достигать 200мс. Наиболее быстрые результаты обычно показывает CloudFlare (1.1.1.1 ~2мс) или Google (8.8.8.8 ~30мс)

Если используется подключение к DNS через Yggdrasil, задержка при первом «рукопожатии» достигает 250мс, что суммарно может вызывать дискомфорт при отсутствии дополнительного кеш-сервера.

Браузеры обычно кешируют результаты на час, поменять настройки в FF можно в about:config опция network.dnsCacheExpiration

Ссылки

Репозиторий ALFIS на Github: https://github.com/Revertron/alfis
Описание ALFIS от разработчика (RU): https://github.com/Revertron/Alfis/tree/master/docs
Канал поддержки пользователей ALFIS в telegram: https://t.me/ALFIS_RU
Сообщение ufm о домене .at: Сообщение в matrix

Обсуждение

d4708, 2023/11/29 15:49
На скриншоте есть майнинг зон а на последней версии нет, убрали?
Thunar, 2023/11/29 17:00
Майнинг зон в первой версии только был, потом убрали.
d4708, 2023/11/29 19:49, 2023/11/29 19:59
Хочу сделать прокси DNS, но если прописать в /etc/alfis.conf

listen = "0.0.0.0:53"
или
listen = "[::]:53"
или как в инструкции
listen = "[201:23b4:991a:634d:8359:4521:5576:15b7]:53"

то служба не появляется в списке после рестарта alfis
sudo netstat -tulpn | grep LISTEN

только так работает (локально)
listen = "127.0.0.1:53"

Thunar, 2023/11/29 20:37
Попробуйте спросить здесь: https://t.me/ALFIS_RU
d4708, 2023/11/29 20:41
Спасибо, телегу не юзаю, думал здесь информацию собрать / материал дополнить за одно

d4708, 2023/11/29 21:40
Вообще только сейчас понял что если указать
listen = "[201:23b4:991a:634d:8359:4521:5576:15b7]:53"

То сервису присваивается адрес (без ::)
201:23b4:991a:634d:8:53

Вот даже здесь формат адреса намекает на использование подсети, только там в диапазоне 300
http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:internal_dns#список_серверов

Короче сдаюсь, обойдусь пока /etc/hosts
Если кто знает как сделать из 24/7 ноды Alfis публичный DNS прокси - поделитесь пожалуйста.

d4708, 2023/11/29 22:27
Нет, не сдаюсь :)

Спасибо автору данной статьи:
http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:subnet_setting#практическая_часть

На моем примере, повесил на подсеть:

1. забираем адрес subnet из yggdrasilctl getself -> 301:23b4:991a:634d::/64
2. ifconfig lo inet6 add 301:23b4:991a:634d::53
3. затем в listen /etc/alfis.conf указываем 301:23b4:991a:634d::53
4. в /etc/systemd/resolved.conf DNS=301:23b4:991a:634d::53
5. systemctl restart alfis и systemctl restart systemd-resolved

Далее фаерволы и тд.

Если никто не возражает, думаю можно в материал добавить и заменить нерабочий пример
listen = "[2xx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:53"

d4708, 2023/11/29 20:10
Правильно ли понимаю, что Alfis может заменить собой системный резольвер, если указать только его в
/etc/systemd/resolved.conf

DNS=127.0.0.1

То есть, он будет адресовать DNS запросы клирнет сюда?
bootstraps = ["9.9.9.9:53", "94.140.14.14:53"]

d4708, 2023/11/30 17:40
У меня при импорте ключа репозитория почему-то крякозябры в консоли

wget -qO - https://deb.revertron.com/key.txt | gpg --dearmor - | sudo tee /usr/share/keyrings/alfis.gpg

Следую официальной инструкции:
https://github.com/Revertron/Alfis#debianubuntu-only-blockchain-dns-without-gui

Это нормально для этой команды? Инструкция в статье работает без ошибок:
wget -O - https://deb.revertron.com/key.txt | sudo apt-key add -

не пойму - возможно устаревшая версия

d4708, 2023/11/30 17:45, 2023/11/30 17:45
Скажите пожалуйста, как происходит обновление домена - нужно запустить майнер с отметкой "Renew domain by using higher difficulty while mining."?

Ниже еще одно сообщение, не понимаю, что оно значит:
Starting from block 5000 the change of DNS records is decoupled from domain renewal.

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

d4708, 2023/12/05 16:34, 2023/12/05 16:38
Не знаю с чем связано, может кто сталкивался - через несколько дней, резольвер начал нещадно поедать CPU вплоть до 80%.

На сервере нода работает только для шеринга пиров и блокчейна (с отрытым портом DHT) и как публичный DNS.
По идее все запросы должны идти в SQLite, не декодируя сами блоки каждый раз при запросе.

В общем не знаю, написал в issues, сервис временно выключил

d4708, 2023/12/05 16:54, 2023/12/05 17:11
На заметку - этими днями запустил еще один процесс, занимающий единственное ядро на переварку своих блоков, может просто процесс Alfis не успел обновить свои последние блоки и я просто поймал момент зависания очереди.

Но если кто в курсе технических требований для full-node Alfis'а - поделитесь опытом. Например, выключив сервис освободил порядка 500 Мб ОЗУ (может потому что режим паблик).

upd.

ребутнул сервис и теперь снова всё хорошо.
может действительно связано с сетевой активностью в режиме паблик пира. думаю это даже не DNS а участие в DHT

Fyodor Ustinov, 2023/12/05 21:11, 2023/12/05 22:19
alfis регулярно палится на том, что уходит в постоянное пожираение процессора. Вроде бы (!) проблему решает вариант пересборки его вручную. Но это не точно. А в целом - к сожалению автор немного приподзабил на своё детище, и не правит даже откровенные баги.
(поправил. Что это меня понесно про потерю пакетов наговарить - непонятно)

d4708, 2023/12/05 21:29
открыл тикет, попробуем отдебажить

https://github.com/Revertron/Alfis/issues/358

вообще не раз замечал такое на различных блокчейн платформах при небольшом количестве сервисных пиров, хотя здесь их вроде как 15 не мог же весь трафик на меня пойти, может еще пересылка peers.dat или еще что. если честно не вникал в архитектуру, но думаю она общая с bitcoin wallet

d4708, 2024/01/05 23:24
Третий день не могу обновить NS:
Waiting for last full block to be signed. Try again later.

Блок застыл на 11434, тоже самое здесь
https://viewer.alfis.name

Fyodor Ustinov, 2024/01/06 03:35
Похоже нужно опять трясти ревертрона. Очень жалко, что автор забил на alfis.

d4708, 2024/01/06 19:06
По-нормальному, оно должно работать и без Ревертрона, коннект к нодам есть, но я так понимаю что заложен какой то алгоритм от спама: нужно ждать пока кто-то смайнит блок,
но когда меняю приватный ключ - все равно не дает майнить даже новый домен.

Fyodor Ustinov, 2024/01/06 19:30
Должно, но не работает.
Время от времени вот так залипает и ревертрон что-то там у себя пинает.

d4708, 2024/01/06 19:44
Это типа участвует централизованый сервер авторизации?

Обычно нужен сид сервер (для новых подключений) и собственно пиры, у меня их 15.

Написал на мастодонт, но у него там вообще аккаунт отключен, ссылка ниже

d4708, 2024/01/07 17:29
Вчера обновил одну запись и снова та же ситуация, не могу обновить NS после смены сервера - отпал yggbo и прочие ушли в 404

Может пинганите в матрикс у кого есть контакты

Thunar, 2024/01/07 20:38

Revertron

Matrix: @revertron@zhub.link

d4708, 2024/01/07 20:45
я уже написал в матрикс, ответ:
We are waiting for signers to sign last block.

что это значит хз

Thunar, 2024/01/07 20:47, 2024/01/07 20:48
Каждый блок с записями DNS должны подписать несколько пользователей, cмайнив дополнительные блоки... Видимо, кто-то из тех, кого выбрал алгоритм, не хочет / не может подписать...

d4708, 2024/01/07 21:03
Спасибо, я уже понял что это погоня за преславутым мегабайтом.

Но в теории можно просто сменить ключ, но это не помогает, видимо оно делает привязку к IP
Блокчейн перезагружал, но предсказуемо что дело оказалось не в этом

d4708, 2024/01/22 20:00, 2024/01/22 20:04
Нашел примерное описание того что искал, может кому пригодится, чтобы не рыться в коде:
https://habr.com/ru/articles/597207/

Если коротко, то экосистема зависит от присутствия в сети случайно выбранных более активных узлов (PoS)

d4708, 2024/01/22 20:12, 2024/01/22 20:37
То есть, получается, если вы не занимаетесь постоянным майнингом, то будете ждать тех, кто как раз увлечен в сквоттинг.

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

И уже не будет того санты, который явится в онлайн после очередного кипеша.

d4708, 2024/01/22 21:05, 2024/01/22 21:05
В завершение, для предотвращения роста блокчейна, мне видится достаточным сделать очистку содержимого блоков по завершению срока действия их записей. Это не книга финансов, нет смысла хранить старые IP/ключи владельца или в крайнем случае, держать для этого отдельный блокчейн по типу testnet.

Есть также далеко не новый проект https://minaprotocol.com - это по теме как уместить блокчейн в 22кб

d4708, 2024/01/06 19:10
https://mastodon.social/@Revertron@zhub.link
d4708, 2024/02/05 23:05
Если указывать для домена два IP, то в приоритете будет тот у которого значение 1 или 2?

Только авторизованные участники могут оставлять комментарии.
yggdrasil/dns/alfis.txt · Последнее изменение: 2024/04/06 05:45 — d4708
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki