Попробуйте представить 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 не долго осталось простаивать ...
Это охрененно! Отличная инструкция!
Создать, поднять, разработать собственный сайт на блокчейне - Медиаблокчейне ГОЛОС за 30 минут - очень круто! Независимое децентрализованное автономное приложение (DApp)!
Команда Голоса.
@vik, отправил вопрос в Голос.Чат.
Интересно, спасибо! Но без пол-литра не разберешь. Я так понимаю фишка такого сайта - его можно настроить "под себя"? Например, выбрать нужные тэги, которые буду "всплывать" в новостной ленте. Сделать свой дизайн и что-то еще... Думаю после запуска МАПАЛЫ и СИСЕК станет более ясней как эту функцию применять для реализации своих идей.
Как минимум - да.
Вы можете полностью отойти от дизайна голоса, даже в деталях.
Оставить только концепцию регистрации (при чем ключи общие с голосом и не нужно регистрироваться заново) ну и апвотинг.
Так же я полагаю, что на стороне уже golosa нужно будет определиться с позиционированием ваших постов. Если это будет контент не в контексте, то ваши посты логично скрывать из основной ленты голоса. Или показывать только те, которые вы пометите специфическим тегом.
Благодарю за ответ!
Интересно конечно. Только непродуктивно. Тем не менее задумайтесь об уже существующих площадках со сложившейся аудиторией десятки тысяч. Что насчет подключить к этому уже действующие порталы наподобие 4pda и прочие развитые сообщества где есть аудитория?
Именно это и было толчком. Когда я в первые увидел голос подумал - черт, когда мое комьюнити, на моих сайтах узнает про голос - они же все уйдут на него и мне останется барабуба) Голос конкурент, алярма!
Но спустя время я стал понимать, что голос не конкурент, а неизбежное средство, которое нужно интегрировать как можно раньше в свой проект.
А что за коьюнити у вас? И расскажите нам, когда произойдет планируемая интеграция)
@vik, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующей категории:
подписалась...
свой сайт на движке "голоса" - шикарно!
"В основе работы клиента будет его взаимодействие с основной нодой голоса wss://ws.golos.io"
Блин! Ну что за бред! Один нормальный DDoS на ws.golos.io и лягут ВСЕ НОДЫ? И вы это называете распределенной системой? :((((((((
Ничто не мешает поднять собственную ноду и подключаться к ней локально в рамках сервера
Спасибо! Вы меня успокоили. А то я уж подумал что это единственный способ создания своей точки доступа для Голоса.
Придумал такую новую тему как " Кулинарный батл" При которой участники могли бы вызывать один другого на батл при определенной теме. Возможно будет интересно ....
По вступлению было воодушевился, но быстро сник...
Можно сделать клиент на 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
Какой же я тупой, сколько еще учить и учить... надо будет все с самого начала прочесть. И предыдущие посты почитать.
@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). Не помогло. Слабая у меня пока магия.
У меня такая же проблема... Кликабельно
Ждем @vik из похода. Через пару дней вроде бы сможет ответить. )
@sxii Не мы одни с этой проблемой - https://github.com/whoisandie/react-rangeslider/pull/48
Пулл-реквесту 14 дней. Можно с этим что-то сделать?
@vadbars - я откомментировал. Думаю, это максимум =)
Закомментировал строку "require('./rangeslider.less');" в файле /home/vadbars/tolstoy/node_modules/react-rangeslider/lib/Rangeslider.js и клиент скомпилировался. ) Правда, сыплет ошибками, но уже доступен по localhost:3002 . Открывается на странице "Популярное посты", неграмотный. )
@vik Удалось ли разобраться с react-rangeslider?