Попробуйте представить golos.io не как отдельный сайт, а как блоговую платформу. Причем не вида ЖЖ, Bloggera и tumblr, а масштабов и областей применения схожими с wordpress. Гибкая, универсальная и разворачиваемая за считанные минуты основа вашего сайта с готовым решением монетизации и поощрения ваших пользователей.
Если мы хотим сделать из Голоса действительно богатую экосистему, а не один сайт, который вряд ли прыгнет выше размеров Хабры, то единственная возможность для этого - привлечь разработчиков которые создадут на платформе тысячи сайтов и приложений в рунете.
@hipster в рамках поста Инициатива кибер•Фонда
Представьте "Голос" на вашем собственном домене, со своим дизайном и нишей контента.
БМ, @mapala, @siski не только представили, но уже успешно реализуют.
- Вы блоггер или медийная личность?
Создайте блог с собственным доменом, с собственным дизайном, но храните записи в блокчейн, получая за них награды. - У вас новостной или региональный портал?... Форум?
Собирайте тысячи голосов за каждый пост и приумножайте аудиторию. - Интернет магазин?
Интегрируйте отзывы о продукции с блокчейн голоса и предоставляйте клиентам скидки взамен голосов.
Придумывайте собственные решения, пока не поздно :)
Воссоздание и подключения клиента golos.io на собственном домене
Временный пример http://rubtc.info
Возможности по кастомизации и настройкам ограниченны только вашими навыками
Домен и хостинг
В качестве хостинга я выбрал bithost.io - это реселлер DigitalOcean, который принимает bitcoin в качестве оплаты. Домен покупать не пришлось, есть в запасе. Но последний раз брал на crowncloud - соответственно тоже можно за bitcoin.
На слабенький VPS с 2gb ОЗУ я установил Ubuntu 16.10. К выбору предлагалась уже с собранным nodejs, но я предпочел чистую, так как на предустановленной может быть что-то лишнее и несовместимое.
Через SSH подключаемся к терминалу под root и последовательно вводим команды:
Скачиваем последнюю версию клиента
git clone https://github.com/GolosChain/tolstoy
Переходим в папку проекта (можно переименовать. Я переименовал на короткое i)
cd tolstoy
ну и или в моем случае далее cd i
Создаем в папке еще одну с именем tmp
mkdir tmp
Скачиваем последний NVM. (В будущем проверяйте, какой номер версии последний)
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
Экспортируем и раскладываем скрипты nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
Ставим и начинаем использовать последний node js
nvm install node
nvm use node
Находясь в папке проекта i (tolstoy)
npm install
npm install -g babel-cli
npm i pm2 -g
Переходим в папку конфигов и создаем там скрипты
cd config
cp steem-example.json steem-dev.json
Выполняем команду в node
node
crypto.randomBytes(32).toString('base64')
Сохраняем ключ. Обычно он заканчивается символом =
Переходим в папку app/config и создаем там файлы
cd app/config
cp public-example.json public.json
Ставим mysql сервер БД
sudo apt-get update
sudo apt-get install mysql-server
Во время установки будет предложено создать пароль. Не забудьте его.
После установки вводим
sudo mysql -u root -p
Если у вас ubuntu от 16.10, последовательно вводим
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
И заходим далее
mysql -u root
Создаем БД
create database steemit_dev;
- команду нужно вводить если вы зашли в mysql и видите значок >
quit
выходим из mysql.
Устанавливаем sequelize-cli
npm install -g sequelize-cli pm2 mysql
Переходим в папку bd проекта и выполняем
sequelize db:migrate
Открываем или создаем если нет конфиг командой
nano /root/tolstoy/db/config/config.json
И пишем в нем
{
"development": {
"username": "root",
"password": null,
"database": "steemit_dev",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
Закрываем сохраняя (ctrl-X и y)
В папке config открываем файл steem-dev.json
и добавляем строку с вашим ключом.
"server_session_secret": "NzsAoTf===ВАШ==КЛЮЧ==H0d5EsgFsjQM0=",
Если есть параметр server_session_secret
напротив, если нет, создайте вместе с ним и поместите после session key
Переходим в папку проекта.
cd
cd tolstoy
или cd имя
если переименовали.
Вводим
npm start
Видим надпись webpack-dev-server listening on port 3001
И ждем компиляции ~ 2 - 5 минут
В случае успеха вы увидите уведомления
Возможно некоторые ошибки будут, это не критично. В финале вы увидите надпись
Application started on port 3002
Это значит, что вы можете ввести в браузере ip своего сервера и в конце указать порт ..*:3002 и если все установлено верно - попадете на клон голоса на вашем сервере.
Если вы хотите, что бы доступ был без порта, а из корня, вам будет необходимо открыть файл
/root/tolstoy/server/server.js
и поменять порт 3002 на 80 в конфиге
После чего запустить npm start
снова, в результате ответа вы должны увидеть
Application started on port 80
Теперь можете перейти по адресу своего сервера и увидеть работающий сайт.
Или прописать A - запись в DNS своего домена указывающую на ваш сервер.
Но если вы покинете процесс в консоли - сервер остановится! Что бы запустить его в постоянном режиме введите команду:
pm2 start npm -- start
- Для запуска
pm2 restart npm -- start
- Для рестарта
Теперь сайт постоянно онлайн.
Поздравляем! Все работает!
Вы можете полноценно использовать клиент голоса на своем сервере или локально на компьютере. Использовать, совершенствовать, стилизовать!
Собственный CSS cтиль в формате SCSS можно добавить в файл
/app/assets/stylesheets/foundation-overrides.scss
Все паблик шаблоны и стили клиента в папке
/app/components
Так же много настроек в /root/i/config/client_config.js
И хотя все работает полноценно, вы находитесь в режиме разработчика. Что бы переключится в финальный production режим - вам необходимо ввести
npm run build
npm run prod
Однако вы получите ошибки о незаполненном CSP файле.
https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Content-Security-Policy
Файл с шаблонами настроек хранится тут:
/root/i/node_modules/helmet-csp/lib/config.json
И выглядит вот так:
{
"directives": {
"base-uri": { "type": "sourceList" },
"child-src": { "type": "sourceList" },
"connect-src": { "type": "sourceList" },
"default-src": { "type": "sourceList" },
"font-src": { "type": "sourceList" },
"form-action": { "type": "sourceList" },
"frame-ancestors": { "type": "sourceList" },
"frame-src": { "type": "sourceList" },
"img-src": { "type": "sourceList" },
"manifest-src": { "type": "sourceList" },
"media-src": { "type": "sourceList" },
"object-src": { "type": "sourceList" },
"script-src": {
"type": "sourceList",
"hasUnsafes": true
},
"style-src": {
"type": "sourceList",
"hasUnsafes": true
},
"plugin-types": { "type": "pluginTypes" },
"sandbox": { "type": "sandbox" },
"report-uri": { "type": "reportUri" },
"upgrade-insecure-requests": { "type": "boolean" },
"block-all-mixed-content": { "type": "boolean" }
},
"allHeaders": [
"Content-Security-Policy",
"X-Content-Security-Policy",
"X-WebKit-CSP"
],
"mustQuote": ["none", "self", "unsafe-inline", "unsafe-eval"],
"unsafes": ["'unsafe-inline'", "unsafe-inline", "'unsafe-eval'", "unsafe-eval"],
"sandboxDirectives": [
"allow-forms",
"allow-modals",
"allow-orientation-lock",
"allow-pointer-lock",
"allow-popups",
"allow-popups-to-escape-sandbox",
"allow-presentation",
"allow-same-origin",
"allow-scripts",
"allow-top-navigation"
]
}
Вы должны составить его в зависимости от своих настроек в т.ч. адреса сервера и CDN. Например мне нужно прописать cloudflare, так как использую его.
CSP голоса выглядят так:
default-src 'self' golos.io www.youtube.com staticxx.facebook.com ;
child-src 'self' www.youtube.com staticxx.facebook.com w.soundcloud.com player.vimeo.com chat.golos.io livejournal.com ;
script-src 'self' cyber.fund www.google-analytics.com connect.facebook.net js-agent.newrelic.com bam.nr-data.net cdn.polyfill.io cdn.segment.com cdn.mxpnl.com mc.yandex.ru chat.golos.io media.reformal.ru ;
style-src 'self' 'unsafe-inline' cdnjs.cloudflare.com fonts.googleapis.com ;
img-src data: * ;
font-src data: fonts.gstatic.com ;
connect-src 'self' cyber.fund wss://ws.golos.io wss://ws.r1.golos.io wss://ws.r2.golos.io wss://ws.r3.golos.io wss://ws.r4.golos.io wss://ws.r5.golos.io api.segment.io api.blocktrades.us query.yahooapis.com api.blockcypher.com api.mixpanel.com mc.yandex.ru ;
report-uri https://golos.io/api/v1/csp_violation ;
object-src 'self' ;
plugin-types application/pdf ;
frame-ancestors 'none'
В заключение
В основе работы клиента будет его взаимодействие с основной нодой голоса wss://ws.golos.io
Я уже посвятил несколько постов взаимодействию с нодой Подключаемся к ноде wss://ws.golos.io через блокнот , но если ранее это были очень урезанные возможности - то в описываемом клиенте они полноценны. Кроме того, при наличии запаса мощности на сервере вы можете поднять собственную ноду!
По затратам это по-сути копейки:
Около 10$ в год стоит домен
И 15-20$ в месяц сервер. (в зависимости от мощности можно дешевле, можно дороже)
@vik Отличный гайд по разворачиванию клиента.
Хочу добавить два момента:
Мысль очень хорошая.Понял правда только большую часть)
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧
А теперь все сели и подняли по своему клиенту...
Так победимЪ
Возможности впечатляют)
Спасибо! Суть понял. Отлично!
Код - неееет)) Не мое)
Kilobucks.com не долго осталось простаивать ...
@vik Удалось ли разобраться с react-rangeslider?
@vik На этапе компиляции получаю ошибки, связанные с "Error: Cannot find module './rangeslider.less".
Куда бежать?
Нет файлов [/home/vadbars/tolstoy/node_modules/react-rangeslider/lib/rangeslider.less]
[/home/vadbars/tolstoy/node_modules/react-rangeslider/lib/rangeslider.less.js]
[/home/vadbars/tolstoy/node_modules/react-rangeslider/lib/rangeslider.less.json]
[/home/vadbars/tolstoy/node_modules/react-rangeslider/lib/rangeslider.less.jsx]
Подскажите нубу, откуда они берутся.
Less поставил.
react-rangeslider заново устанавливал (npm install react-rangeslider --save). Не помогло. Слабая у меня пока магия.
Закомментировал строку "require('./rangeslider.less');" в файле /home/vadbars/tolstoy/node_modules/react-rangeslider/lib/Rangeslider.js и клиент скомпилировался. ) Правда, сыплет ошибками, но уже доступен по localhost:3002 . Открывается на странице "Популярное посты", неграмотный. )
У меня такая же проблема... Кликабельно
@sxii Не мы одни с этой проблемой - https://github.com/whoisandie/react-rangeslider/pull/48
Пулл-реквесту 14 дней. Можно с этим что-то сделать?
@vadbars - я откомментировал. Думаю, это максимум =)
Ждем @vik из похода. Через пару дней вроде бы сможет ответить. )
Какой же я тупой, сколько еще учить и учить... надо будет все с самого начала прочесть. И предыдущие посты почитать.
По вступлению было воодушевился, но быстро сник...
Можно сделать клиент на php, в т.ч. плагин для WP. В этом большой потенциал, так как расширяет охват аудитории до многих миллионов вебмастеров. Именно в сторону таких простых решений "для каждого" я и смотрю. К сожалению последние несколько дней и предстоящие недели нахожусь в дороге и нет возможно заняться этим вплотную.
Я вам рекомендую все таки перейти на vps с root доступом. По цене они не особо отличаются от вашего виртуального хостинга, который по-просту продает вам воздух.
Возьмите VPS сервер на digital ocean, vultr, linode и т.п. Оплата почасовая, можно найти тариф за 3 - 5$ в месяц. Крупные провайдеры дадут вам возможность динамически менять конфигурацию сервера. Например добавить дополнительный объем памяти или ядер процессора на лету, или убавить, когда они вам не нужны. Самостоятельно и очень удобно.
Если вы не можете работать из консоли - можете поставить vesta cp - она не хуже cpanel и isp, но является бесплатной.
Кроме того, с наличием возможности настроить сервер, вы сможете ускорить свои wp блоги просто перейдя на правильное кеширование - nginx + php-fpm + xcache + memcached + cloudflare = за 5$ в месяц вы сможете выдерживать нагрузки в 1000 одновременных посетителей на сайте.
Можно и нужно :) Я верю, что работа уже начата и мы скоро увидим решения для популярных cms. А не увидим - будем делать.
@vik Хорошая идея, у Вас получилось реализовать ее? Есть уже плагин?
Актуальный вебклиент golos.io в репозитории goloschain/tolstoy
Придумал такую новую тему как " Кулинарный батл" При которой участники могли бы вызывать один другого на батл при определенной теме. Возможно будет интересно ....
"В основе работы клиента будет его взаимодействие с основной нодой голоса wss://ws.golos.io"
Блин! Ну что за бред! Один нормальный DDoS на ws.golos.io и лягут ВСЕ НОДЫ? И вы это называете распределенной системой? :((((((((
Ничто не мешает поднять собственную ноду и подключаться к ней локально в рамках сервера
Спасибо! Вы меня успокоили. А то я уж подумал что это единственный способ создания своей точки доступа для Голоса.
свой сайт на движке "голоса" - шикарно!
подписалась...
@vik, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующей категории:
Интересно конечно. Только непродуктивно. Тем не менее задумайтесь об уже существующих площадках со сложившейся аудиторией десятки тысяч. Что насчет подключить к этому уже действующие порталы наподобие 4pda и прочие развитые сообщества где есть аудитория?
Именно это и было толчком. Когда я в первые увидел голос подумал - черт, когда мое комьюнити, на моих сайтах узнает про голос - они же все уйдут на него и мне останется барабуба) Голос конкурент, алярма!
Но спустя время я стал понимать, что голос не конкурент, а неизбежное средство, которое нужно интегрировать как можно раньше в свой проект.
А что за коьюнити у вас? И расскажите нам, когда произойдет планируемая интеграция)
Интересно, спасибо! Но без пол-литра не разберешь. Я так понимаю фишка такого сайта - его можно настроить "под себя"? Например, выбрать нужные тэги, которые буду "всплывать" в новостной ленте. Сделать свой дизайн и что-то еще... Думаю после запуска МАПАЛЫ и СИСЕК станет более ясней как эту функцию применять для реализации своих идей.
Как минимум - да.
Вы можете полностью отойти от дизайна голоса, даже в деталях.
Оставить только концепцию регистрации (при чем ключи общие с голосом и не нужно регистрироваться заново) ну и апвотинг.
Так же я полагаю, что на стороне уже golosa нужно будет определиться с позиционированием ваших постов. Если это будет контент не в контексте, то ваши посты логично скрывать из основной ленты голоса. Или показывать только те, которые вы пометите специфическим тегом.
Благодарю за ответ!
@vik, отправил вопрос в Голос.Чат.
Создать, поднять, разработать собственный сайт на блокчейне - Медиаблокчейне ГОЛОС за 30 минут - очень круто! Независимое децентрализованное автономное приложение (DApp)!
Команда Голоса.
Это охрененно! Отличная инструкция!