Articles



Another modest(but useful) contribution to Open Source, about vulnerability CVE-2017-17405

Another modest(but useful) contribution to Open Source, about vulnerability CVE-2017-17405
Недавно столкнулся с неприятным сюрпризом. Неочень приятно видеть непрошенных гостей из Китая у себя на сервере)) Решил что русскоязычному сообществу следует знать об...
Show full article

Недавно столкнулся с неприятным сюрпризом. Неочень приятно видеть непрошенных гостей из Китая у себя на сервере)) Решил что русскоязычному сообществу следует знать об этой уязвимости и перевёл статью для сообщества.

Ссылка на переведённую мною статью про уязвимость CVE-2017-17405

Show preview
Leave a comment




iziToast-rails gem - integrate whithout pain.

iziToast-rails gem - integrate whithout pain.
Recently wrote a gem. Check it out Really good looking notifications + without any dependencies!
Show full article

Recently wrote a gem. Check it out

Really good looking notifications + without any dependencies!

Show preview
Leave a comment




Zeus and shoulda-matcher

Zeus and shoulda-matcher
If you have any problem with gem shoulda-matcher after installation and start of gem Zeus, do not just roll back the entire development and say goodbye to Zeus. Try...
Show full article

If you have any problem with gem shoulda-matcher after installation and start of gem Zeus, do not just roll back the entire development and say goodbye to Zeus.
Try the following:

In Gemfile:

gem 'shoulda-matchers', require: false

In file spec/rails_helper.rb if presents, or in spec/spec_helper.rb:

require 'rspec/rails'
require 'shoulda/matchers'

It should work. Good luck!

Show preview
Leave a comment




TDD and why it's so important! Uncle Bob (Robert C. Martin)

TDD and why it's so important! Uncle Bob (Robert C. Martin)
I must confess, i didn't wanted to implement TDD because i was confused (and maybe a little bit lazy) to write the code that "didn't produce anything". But Uncle Bob's...
Show full article

I must confess, i didn't wanted to implement TDD because i was confused (and maybe a little bit lazy) to write the code that "didn't produce anything". But Uncle Bob's philosophy, wich i liked btw, reminded me expression from Carlos Castaneda's book. Here it is :

"Things doesn't change, changes only our view on them."

From this day, i'm starting to implement TDD to my projects. Uncle Bob sad that, implementing TDD in to the already written applications it's "insane, not worth it". But i will do it, let's say - for self-improvement. I'll start with my latest project "Conversation App".

I recommend to all, watch the video below. If you doubt the usefulness of tests and existing arguments don't convince you, Uncle Bob will help you to look at it in another way, so much so that you'll have to search for a reasons to not follow TDD (in advance shall warn you, laziness - it's not a reason). And along the way you will learn many interesting stuff about architecture and features of architecture of app.

Watch the video below.

Show preview
Leave a comment




Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 3\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 3\3
Эта учебная статья, из нескольких частей (часть 3\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на...
Show full article

Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.

Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)

Создайте в корне приложения файл .ruby-version (с точкой в начале) и впишите в неё версию руби

2.2.2

Внесите изменения в Gemfile

ruby '2.2.2'

gem 'unicorn'

gem 'capistrano-rails', group: :development

Запустите bundler и установите гемы

bundle install

Установите заглушки (binstubs) для Capistrano

bundle binstubs capistrano

Инициализируем capistrano

bin/cap install

В файл Capfile, в корне вашего приложения, сразу после require 'capistrano/deploy' добавьте следующую строчку

require 'capistrano/rails'

Добавьте / Замените конфигурации в config/deploy.rb

set :application, 'myrailsapp'
set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git'
set :deploy_to, '/opt/www/myrailsapp'
set :user, 'deploy'
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets}

#файлы ниже надо будет создать на сервере
append :linked_files, 'config/master.key', 'config/database.yml'

namespace :deploy do
 %w[start stop restart].each do |command|
   desc 'Manage Unicorn'
   task command do
     on roles(:app), in: :sequence, wait: 1 do
       execute "/etc/init.d/unicorn_#{fetch(:application)} #{command}"
     end
   end
 end

 after :publishing, :restart
end

У меня бывал глюк с подключением по SSH, решилось заменой на HTTPS адрес

set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git'

Если же надо подключиться к приватному репозиторию, можно сделать следующим образом:

set :repo_url, "https://#{ENV['GITHUB_USERNAME']}:#{ENV['GITHUB_PASSWORD']}@github.com/BadAllOff/myrailsapp.git"

ENV['GITHUB_USERNAME'] и ENV['GITHUB_PASSWORD'] можно указать в переменных окружения, Capistrano это обычный руби код и все правила руби в нём работают. Переменные окружения можно глянутьв консоли рельсов 'rails c'


 

Изменим конфигурацию в /config/deploy/production.rb на ip вашего сервера или доменное имя. Тут мы как бы ролям app web и db дали полномочия пользователя deploy на сервере

role :app, %w{deploy@0.0.0.0}

role :web, %w{deploy@0.0.0.0} # Управляет asset pipeline

role :db, %w{deploy@0.0.0.0} # Работает с БД

Создадим config/unicorn.rb файл с таким контентом (незабываем изменять myrailsapp если у вас свои названия для папок и прочее):

root = "/opt/www/myrailsapp/current"

working_directory root

pid "#{root}/tmp/pids/unicorn.pid"

stderr_path "#{root}/log/unicorn.log" # логи ошибок

stdout_path "#{root}/log/unicorn.log" # логи сервака

listen "/tmp/unicorn.myrailsapp.sock"

worker_processes 1

timeout 30

Закомментируем username и password в config/database.yml. На сервере наше приложение будет использовать имя пользователя под которым запущенно приложение (т.е. deploy) как название РОЛИ для базы данных. А мы помним что специально для этого мы ранее и создали роль deploy в posтgres-е. Поэтому переопределение имени пользователя нам только помешает подключиться.

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

production:

  <<: *default
  database: myrailsapp_production
  host: '' 
  username: deploy

Но конечно ничто вам не мешает создать в postgres ещё одну роль под именем “myrailsapp”, дать ей права на определённую бд, и записать её пароль в переменную окружения на сервере. Это уже на ваше усмотрение, как вам удобно. Внизу я покажу куда можно записать пароль если вы решите следовать таким путём.

Внесём изменения в наш репозиторий на git

git add .

git commit -m 'Added settings to deploy app'

git push

Создадим секретный ключ для использования на сервере

bin/rake secret

НА СЕРВЕРЕ! Заходим на сервер под пользователем username.

Установим переменные окружения:

sudo
nano /home/deploy/.bashrc

Сразу после строчек

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"

впишите следующее:

export SECRET_KEY_BASE=ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ

В Rails 5.2 еще используеться файл secrets.yml но он обявлен устаревшим. Теперь всё данны храняться в защифрованном виде в файле credentials.yml.enc (редактировать который можно командой: EDITOR=nano bin/rails secrets:edit). Нужно также ввести новую переменную окружения для расшифровки файла. Там же, в файле .bashrc, вводим новую переменную (название рекомендовано самими рельсами), значение для переменной берем из файла /config/master.key:

export RAILS_MASTER_KEY=STRINGFROMMASTERKEYFILE

Если вы решили всё таки использовать другу роль для подключения к бд, cюда же вы можете вписать и пароль от вашего БД

export MYRAILSAPP_DATABASE_PASSWORD=ВАШПАРОЛЬОТДБ

ПРИМЕЧАНИЕ! Если вы УЖЕ используете гем Devise в вашем приложении, то добавьте строку в /config/initializers/devise.rb

config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']

и добавить в окружение переменную

export DEVICE_CONFIG_SECRET_KEY='секретныйключьможетесгенерироватьегосами'

Сохраним, дадим башу перегрузить переменные

. ~/.bashrc

и перезапускаем nginx

sudo service nginx restart

НА ВАШЕМ КОМПЮТЕРЕ запустим некоторую предварительную проверку

bin/cap production git:check

если появится ошибка:

DEBUG [4618dd23] Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.

DEBUG [4618dd23] Permission denied (publickey).

DEBUG [4618dd23] fatal: Could not read from remote repository.

DEBUG [4618dd23]

DEBUG [4618dd23] Please make sure you have the correct access rights

DEBUG [4618dd23] and the repository exists.

Попробуйте изменить строку set :repo_url в config/deploy.rb на https :

set :repo_url, 'https://github.com/RebelioUS/myrailsapp.git'

ещё одна проверка (должна пройти без запинки):

bin/cap production deploy:check

И вот! Торжественный момент развёртывания Вашего приложения!

bin/cap production deploy

Зайдём на наш домен и ...

ВУАЛЯ! Работает!

Теперь после каждого коммита на гитхаб Вы можете перезапустить сервер с обновлённым приложением одной командой

bin/cap production deploy

Для полной уверенности перегрузите сервер

sudo reboot

Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!

Show preview
Leave a comment