Srnd
|
srnd - свободное ПО, реализующее распределённую систему имиджборд, форумов и pastebin-ов на базе обмена по протоколу NNTP.
Печально известно тем, что именно на нём Скрытозой пробовал перепилить Хиддач и потерял всяческое желание тянуть это.
Установка на ubuntu
apt-get install python-pip python-cffi python-imaging python-pygments python-dev libffi-dev libsodium-dev sqlite3 pip install pynacl pip install pysodium rm -rf /usr/local/lib/python2.7/dist-packages/nacl/_lib/__pycache__
Исходный код модифицированного srnd (версия для hiddenchan): http://git.repo.i2p/w/srnd/srndh.git
Первоначальная настройка конфигов
Внимание, после установки и первоначальной настройке при отсутствии nntp-сообщений у вас будет полностью пустая борда без разделов и без возможности постинга. Чтобы что-либо начало появляться, необходимо либо настроить peering, либо вручную положить nntp-статью в incoming, либо сохранить к себе с другого фронтенда html-страницу с формой постинга, поправить её и отправить т.о. первое сообщение на свой /incoming.
Так же обратите внимание, что в конфигах srnd применяется нестандартная система комментариев. Если строка начинается со #start_param, то это не комментарий, а именно конфигурационная переменная, не закомментированная! Т.е. убирать "#" не нужно.
Настройка плагина overchan
Плагин overchan отвечает за обработку сообщений в группах overchan.* и генерацию html-страниц имиджборды. Т.е. по сути это парсер сообщений + генератор статики. Конфиг - install_files/config/hooks/plugins/overchan Для начальной конфигурации поправьте параметр
#start_param title=ИМЯ_БОРДЫ
Это название вашей борды, которое будет отображаться в Title и на других видных местах.
Настройка плагина postman
Плагин postman отвечает за приём сообщений от пользователей фронтенда по http. Разбор POST-параметров, капча, и т.п. Его конфиг install_files/config/hooks/plugins/postman особой настройки не требует. Однако помимо этого конфига у postman-а есть отдельные конфиги по работе с каждым фронтендом. Настройте конфиг install_files/plugins/postman/frontends/overchan. Здесь вам нужно поправить несколько параметров:
uid_host=web.overchan.ИМЯ_БОРДЫ (allowed_boards) overchan.имя_раздела_куда_доступен_постинг_1 overchan.имя_раздела_куда_доступен_постинг_2
Настройка плагина censor
Плагин censor отвечает за модерирование. install_files/config/hooks/plugins/censor:
#start_param uid_host=web.censor.ИМЯ_БОРДЫ #start_param add_admin=ПУБЛИЧНЫЙ_КЛЮЧ
ПУБЛИЧНЫЙ_КЛЮЧ - это публичный ключ админа, который может заходить в интерфейс модератора. Чтобы получить связку ключей, зайдите на /moderate?getkey, когда запустите srnd. Для захода в админку надо будет использовать приватный ключ. Он же используется для трипкода.
Настройка плагина paste
Данный плагин реализует функциональность распределённого pastebin. Для настройки достаточно поправить title (install_files/config/hooks/plugins/paste):
#start_param title=paste.ИМЯ_БОРДЫ
Так же в дефолтном конфиге имеется запись
ano.paste
это означает, что плагин обрабатывает именно сообщения из этой nntp-группы.
Первый запуск и настройка главного конфига демона
Запустите ./main.pyx, подождите некоторое время и нажмите Ctrl-C. После этого создастся директория data/. Учтите, что при каждом запуске srnd копирует конфиги и плагины из install_files в data/, поэтому в data/ править ничего не нужно (кроме outfeed-ов, об этом позже).
После первого запуска демон создаст конфиг data/config/SRNd.conf, там настраивается bind_ip и port для NNTP-демона, а так же выставляется уровень дебага. Обратите внимание, что уровни дебага сделаны слегка по-дурацки - с увеличением цифры уровень дебага МЕНЬШЕ, а не больше, как все мы привыкли. Это может быть запатчено в скором времени. 2 - info, 1 - debug, 0 - verbose (самый детальный вывод). Для начала рекомендуется использовать уровни дебага 2-1.
Настройка конфига nginx
Предполагается, что srnd установлен в /opt/srnd/.
# log desthashes log_format i2p '$remote_addr $http_x_i2p_desthash - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; # disable server id server_tokens off; # i2p does gzip itself gzip off; server { listen 80; server_name foo.i2p; root /opt/srnd/data/plugins/overchan/out/; client_max_body_size 10M; access_log /var/log/nginx/access.log i2p; if ( $http_x_forwarded_server ) { rewrite ^.*$ /inproxy.html break; } location /incoming { # proxy new messages to postman proxy_pass http://127.0.0.1:53751; } location /moderate { # proxy new messages to censor proxy_pass http://127.0.0.1:53753; } location ~* ^.+\.html$ { # force clients to always request the latest version try_files $uri =404; expires 1s; } location ~* ^.+\.css$ { # let clients cache css files for 6 hours try_files $uri =404; expires 6h; } location = / { # redirect / to index.html try_files /index.html =404; expires 1s; } location / { # allow clients to cache everything not .html try_files $uri =404; expires max; } location ^~ /paste/ { alias /opt/srnd/data/plugins/paste/out/; index /index.html; expires 1s; } }
Инит-скрипт для upstart
description "srnd service" start on runlevel [2345] stop on runlevel [06] chdir /opt/srnd exec /opt/srnd/main.pyx
Настройка туннелей i2p
Вам нужно настроить 3 туннеля:
- для http-сервера, тип туннеля - HTTP server
- для nntp-сервера (приём фидов с других серверов), тип туннеля - Standard server. Target туннеля - хост с srnd, порт 119
- socks-прокси (для отправки исходящих сообщений) - тип туннеля - SOCKS 4/4a/5 proxy (клиентский туннель)
Число туннелей для nntp-сервера и socks-прокси не имеет смысла выставлять больше количества nntp-пиров, т.к. одно соединение не может использовать более одного туннеля.
Настройка пиринга
Для связи с другими фронтендами вам нужно настроить пиринг. Настройка заключается в том, что вы у себя настраиваете outfeed для отправки сообщений на другой сервер, и админ другого сервера делает то же самое для отправки сообщений к вам.
Настоятельно рекомендуется использовать whitelisting на уровне i2p для контроля доступа к NNTP. А именно, в конфиге серврного туннеля nntp нужно включить "Restricted Access List(s):", а в список "Access List:" добавить xxxx.b32.i2p адрес того socks-прокси туннеля, который использует другая сторона для связи с вашим сервером. Аналогично, админ другого сервера делает то же самое у себя, т.е. вайтлистит адрес вашего socks-прокси туннеля. Чтобы этот адрес всегда был постоянным, при создании socks-прокси туннеля необходимо поставить radiobutton "Persistent private key(k):" в Enable. Потом запустить туннель и зайти в его конфиг опять, там появится строка "Local Base 32:", который вы и сообщите удалённой стороне.
Настройка outfeed-а
Для настройки outfeed-а нужно создать файл в data/config/hooks/outfeeds/. Имя файла должно быть строго такого формата: "xxxxx.b32.i2p:119", т.е. hostname:port. Без двоеточия и порта работать не будет! Внутрь конфига пишется что-то вроде:
#start_param sync_on_startup=True #start_param proxy_type=socks5 #start_param proxy_ip=127.0.0.1 #start_param proxy_port=10020 #start_param debug=1 ctl overchan.* !ano.paste
Незакомментированные строки указывают, какие группы нужно синхронизировать на удалённый сервер. Восклицательный знак означает "blacklist rule", т.е. исключение. такое правило всегда имеет приоритет перед разрешающими правилами.
FAQ
Как писать новости на главной?
Для этого в конфиге overchan имеется параметр #start_param news_uid= В него надо записать message-id (без кавычек!) поста, в котором написана новость. Чтобы узнать message-id, нужно сперва запостить сообщение, а потом открыть в просмотрщике текстовых файлов это сообщение, оно будет располагаться в `ls -1t data/groups/groupname/ |head -1`
Как переименовать группу?
sqlite3 dropper.db3 sqlite> update groups set group_name='overchan.hiddenchan' where group_id='12'; sqlite3 ./plugins/overchan/overchan.db3 sqlite> update groups set group_name='overchan.hiddenchan' where group_id='11'; groups# mv overchan.hiddenchan.random overchan.hiddenchan find . -type l -print0 |xargs -0 sed -i --follow-symlinks -e "s,Newsgroups: overchan.hiddenchan.random,Newsgroups: overchan.hiddenchan,g" --
Как заставить overchan заново распарсить все сообщения?
sqlite3 ./plugins/overchan/overchan.db3 sqlite> drop table articles; restart
Как всё удалить?
find data/articles/ -type f -delete find data/ -type f -name "*.db3" -delete rm -rf data/groups/*
Как вручную заблокировать группу?
sqlite3 plugins/overchan/overchan.db3 sqlite> update groups set blocked='1' where group_id='23';
Известные баги
- После запуска первая статья в data/incoming/ может не обработаться сразу после появления там. Чтобы "пнуть" dropper, можно сделать touch data/incoming/f.
- При обработке большого кол-ва сообщений (импорт, синхронизация с другим фронтендом) тред overchan может застрять и не генерировать html-ки. Лечится перезапуском демона.
Ссылки и контакты
- Исходный код: http://git.repo.i2p/w/srnd/srndh.git
- Оригинальный англоязычный мануал: http://nz6kngonjz6u5n44pe3vjkyiwetlt3sc3e6nbb57ugim6cny3cfq.b32.i2p/thread-01b987b318.html
- irc: #srnd - канал для разработчиков и операторов. Вопросы по установке, поиск пиров. Англоязычный.
- irc: #ru - общий канал для русскоязычных, так же можно поговорить про srnd на русском.