Comunit::Base

Основной функционал для сайтов сети comunit.

Действия для создания нового сайта сети

Нужно заменить config/locales/en.yml на ru.yml и добавить туда ключи shared.meta_texts.site_name и copyright для вывода названия сайта в метаданных и копирайта соответственно.

Также нужно добавить в локаль ключ index.index.title с заголовком для главной страницы.

Добавления в .gitignore

Стоит убрать строки !log/.keep и !tmp/.keep, так как log и tmp создаются на сервере как ссылки в любом случае.

/public/uploads
/public/ckeditor
/public/post_illustrations

/spec/examples.txt
/spec/support/uploads/*

.env

Добавление JS

После установки (rails new .) нужно добавить в yarn пакеты из компонентов.

yarn add jquery
yarn add @biovision/biovision
yarn add @biovision/posts
yarn add @biovision/comments
yarn add @biovision/votes
yarn add @biovision/comunit

Добавить в config/webpack/environment.js со второй строки этот фрагмент:

const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)

Добавить в app/javascript/pack/application.js эти строки:

require("jquery")
require("@biovision/biovision")
require("@biovision/posts")
require("@biovision/comments")
require("@biovision/votes")
require("@biovision/comunit")

Дополнения в Gemfile

gem 'autoprefixer-rails', group: :production

gem 'biovision-base', git: 'https://github.com/Biovision/biovision-base'
# gem 'biovision-base', path: '/Users/maxim/Projects/Biovision/gems/biovision-base'
gem 'biovision-post', git: 'https://github.com/Biovision/biovision-post'
# gem 'biovision-post', path: '/Users/maxim/Projects/Biovision/gems/biovision-post'
gem 'biovision-comment', git: 'https://github.com/Biovision/biovision-comment'
# gem 'biovision-comment', path: '/Users/maxim/Projects/Biovision/gems/biovision-comment'
gem 'biovision-vote', git: 'https://github.com/Biovision/biovision-vote'
# gem 'biovision-vote', path: '/Users/maxim/Projects/Biovision/gems/biovision-vote'
gem 'biovision-poll', git: 'https://github.com/Biovision/biovision-poll'
# gem 'biovision-poll', path: '/Users/maxim/Projects/Biovision/gems/biovision-poll'
gem 'comunit-base', git: 'https://github.com/Biovision/comunit-base'
# gem 'comunit-base', path: '/Users/maxim/Projects/Biovision/Comunit/comunit-base'

group :development, :test do
  gem 'database_cleaner'
  gem 'factory_bot_rails'
  gem 'rspec-rails'
end

group :development do
  gem 'mina'
end

Пример .env

RAILS_MAX_THREADS=5
DATABASE_PASSWORD=
MAIL_PASSWORD=
SITE_ID=

DATABASE_PASSWORD создаётся через random.org, MAIL_PASSWORD — или через интерфейс внешнего почтовика, или через тот же random.org. SITE_ID берётся из админки comunit.

Добавления в app/assets/

Заменить app/assets/stylesheets/application.css на application.scss из sample/app/assets/stylesheets/.

Примеры для shared и layout можно найти там же (просто скопировать поверх текущих файлов).

Дополнения в config/*.yml

Для начала нужно убедиться в правильности содержимого database.yml

  • Названия баз
  • Наличие host: localhost в разделе production
  • Правильный ключ в ENV в production.password (DATABASE_PASSWORD), такой же, как в .env

Добавление жетона для работы с API

В версии рельсов с 5.2 вместо secrets.yml используется credentials.yml. Для работы с ним нужно запустить в консоли EDITOR=vim rails credentials:edit. В список необходимо добавить этот параметр:

  signature_token: ...

Значение для signature_token берётся из админки на центральном сайте. Структура — <site_id>:<token>.

Добавление в config/application.rb

Чтобы была нормальная временная зона, нужно её задать в application.rb в блоке конфигурации:

  config.time_zone = 'Moscow'

Дополнения в config/puma.rb

Нужно закомментировать строку с портом (port ENV.fetch('PORT') { 3000 }), это 12 строка на момент написания инструкций.

Нужно поменять example.com на актуальный домен.

if ENV['RAILS_ENV'] == 'production'
  shared_path = '/var/www/example.com/shared'
  logs_dir    = "#{shared_path}/log"

  state_path "#{shared_path}/tmp/puma/state"
  bind "unix://#{shared_path}/tmp/puma.sock"
  stdout_redirect "#{logs_dir}/stdout.log", "#{logs_dir}/stderr.log", true

  activate_control_app
end

Дополнения в spec/rails_helper.rb ($ rails generate rspec:install)

Раскомментировать строку 23 (включение содержимого spec/support)

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

Дополнения в spec/spec_helper.rb

RSpec.configure do |config|
  config.after(:all) do
    if Rails.env.test?
      FileUtils.rm_rf(Dir["#{Rails.root}/spec/support/uploads"])
    end
  end
end

Дополнения в config/environments/production.rb

Нужно раскомментировать строку config.require_master_key = true (19 на момент написания).

Нужно заменить уровень журналирования ошибок с :debug на :warn. Это в районе 51 строки (config.log_level).

Для настройки почты нужно поменять example.com на актуальный домен ниже.

Вариант для mail.ru

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      address: 'smtp.mail.ru',
      port: 465,
      tls: true,
      domain: 'example.com',
      user_name: '[email protected]',
      password: ENV['MAIL_PASSWORD'],
      authentication: :login,
      enable_starttls_auto: true
  }
  config.action_mailer.default_options = {
      from: 'example.com <[email protected]>',
      reply_to: '[email protected]'
  }
  config.action_mailer.default_url_options = { host: 'example.com' }

Дополнения в config/environments/test.rb

Нужно поменять example.com на актуальный домен

  config.action_mailer.default_options = {
      from: 'example.com <[email protected]>',
      reply_to: '[email protected]'
  }
  config.action_mailer.default_url_options = { host: '0.0.0.0:3000' }

Дополнения в config/environments/development.rb

Нужно поменять example.com на актуальный домен

  config.action_mailer.delivery_method = :test
  config.action_mailer.default_options = {
      from: 'example.com <[email protected]>',
      reply_to: '[email protected]'
  }
  config.action_mailer.default_url_options = { host: '0.0.0.0:3000' }

После настройки

bundle binstubs bundler --force
bundle binstub puma
rails db:create
rails railties:install:migrations

rails db:migrate
mina init

После этого нужно отредактировать config/deploy.rb.

# В самом начале, 3 строка
require 'mina/rbenv'

#...
set :shared_dirs, fetch(:shared_dirs, []).push('log', 'tmp', 'public/uploads', 'public/ckeditor', 'public/post_illustrations')
set :shared_files, fetch(:shared_files, []).push('.env', 'config/master.key')

# В том месте, где task :environment, сразу после
task :remote_environment do
  invoke :'rbenv:load'
end

На сервере в рабочей папке (var/www/example.com):

mkdir -p shared/tmp/puma
mkdir -p shared/tmp/pids
mkdir -p shared/tmp/import
mkdir -p shared/public/uploads/region
mkdir -p shared/config
cd shared/public
ln -s /var/www/shared/post_illustrations
cd uploads/region
ln -s /var/www/shared/uploads/region/image

После этого локально можно запустить mina setup и настроить остальное на стороне сервера.

В бою

Для начала нужно создать базу данных. Это делается руками через Postgres.

Через random.org (https://www.random.org/passwords/) сгенерировать один пароль длиной около 12 символов.

Этот пароль нужно прописать в файле .env в отвечающем за БД параметре (его можно посмотреть в config/database.yml в разделе production, он называется или DATABASE_PASSWORD, или с приставкой в начале).

В общем случае там должно быть примерно это:

RAILS_MAX_THREADS=5
DATABASE_PASSWORD=<сюда вписать пароль>
MAIL_PASSWORD=<сюда вписать пароль>

Далее манипуляции с базой данных.

sudo su postgres

Дальше нужно создать пользователя и БД для проекта. Данные берутся из config/database.yml из раздела production (пароль был сгенерирован и скопирован в .env, его стоит взять оттуда). Для примера указан пользователь example и база тоже example

createuser -d -P example

Далее заходим под этим пользователем в постгрес:

psql -h localhost -U example postgres

создаем базу с правильными параметрами (внимательно с кавычками):

create database example template template0 encoding='UTF8' LC_COLLATE='ru_RU.UTF-8' LC_CTYPE='ru_RU.UTF-8';

Выходим из базы (^D). Возвращаемся в предыдущего пользователя (^D).

В папке проекта разместить файл конфигурации nginx host.conf

Далее:

cd /etc/nginx/sites-enabled
sudo ln -s /var/www/example.com/host.conf example.com
cd /etc/logrotate.d

Нужно скопировать ротацию логов любого соседнего проекта на новый и внести соответствующие правки:

cp example.org example.com
vim example.com
:%s/example\.org/example.com/g
:wq

Проверяем конфиг nginx:

sudo /etc/init.d/nginx configtest

Если есть ошибки, они дописываются в /var/log/nginx/error.log Если всё хорошо, то:

sudo /etc/init.d/nginx reload

Дальше снова локально.

Нужно убедиться, что в репозитории всё актуально, и выполнить:

mina setup
mina deploy

Если всё прошло хорошо, то снова зайти по ssh как developer и запустить пуму.

Добавить параметры для запуска пумы при перезагрузке сервера (sudo /etc/puma.conf) по аналогии с тем, что там указано.

Нужно импортировать регионы

В папке tmp/import:

ln -s /var/www/shared/import/regions
ln -s /var/www/shared/import/regions.yml

В папке проекта (current):

bin/rails regions:import

Занесение сайта в сеть

В консоли comunit.online.

site = Site.find(site_id)
Site.where(active: true).each { |s| NetworkManager.new(s).push_site(site) }

m = NetworkManager.new(site)
Site.order('id asc').each { |s| m.push_site(s) }

h = NetworkManager::RegionHandler.new(site)
Region.order('id asc').each { |r| print "\r#{r.id}    "; h.create_remote(r) }; puts

h = NetworkManager::UserHandler.new(site)
User.order('id asc').each { |u| puts "#{u.id} #{u.slug}"; h.create_remote(u) }

License

The gem is available as open source under the terms of the MIT License.