Articles



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}

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

development:

  <<: *default

  database: myrailsapp_development

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

test:

  <<: *default

  database: myrailsapp_test

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

production:

  <<: *default

  database: myrailsapp_production

  # username: myrailsapp

  # password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

Если на сервере, возникнут проблемы с подключением к БД постгресу, Следует изменить настройки для БД. Надо позволить БД давать доступ от локальных пользователей. Тут на наглийском, но вы поймете)

Configuration

  1. Edit postgre configuration file:

    sudo nano /etc/postgresql/POSTGRE_VERSION/main/pg_hba.conf
    
  2. Change all configuration access to:

    # Database administrative login by Unix domain socket
    local   all             all                                     trust
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    
  3. Restart postgre server

    sudo /etc/init.d/postgresql restart
    
  4. Enjoy :)

 

Но конечно ничто вам не мешает создать в 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=ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ

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

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

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

config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']

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

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

Из за того как Capistrano подключается к вашему серверу, с переменными окружения тоже могут быть проблемы. Поэтому рекомендую хранить переменные окружения вместо .bashrc .bash_profile .profile вот здесь:

sudo -H nano /etc/environment

А вот отличный ответ почему всё так происходит (рекомендую ознакомиться, сэкономите кучу нервов при деплое непонимая почему капистрано не видит переменные)

Capistrano makes its connection as a non-login, non-interactive shell. It will not automatically evaluate the various home scripts.

How Capistrano makes its connection is described here:http://capistranorb.com/documentation/advanced-features/ptys/

What files are evaluated on the various shell modes is described here:https://github.com/rbenv/rbenv/wiki/Unix-shell-initialization#bash

A number of other ways to set environment variables is shown here: Capistrano: Can I set an environment variable for the whole cap session?

A duplicate question is here: https://superuser.com/questions/564926/profile-is-not-loaded-when-using-ssh-ubuntu

The FAQ section for this question is here: http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/

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

. ~/.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




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}

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

development:

  <<: *default

  database: myrailsapp_development

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

test:

  <<: *default

  database: myrailsapp_test

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

production:

  <<: *default

  database: myrailsapp_production

  # username: myrailsapp

  # password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

Если на сервере, возникнут проблемы с подключением к БД постгресу, Следует изменить настройки для БД. Надо позволить БД давать доступ от локальных пользователей. Тут на наглийском, но вы поймете)

Configuration

  1. Edit postgre configuration file:

    sudo nano /etc/postgresql/POSTGRE_VERSION/main/pg_hba.conf
    
  2. Change all configuration access to:

    # Database administrative login by Unix domain socket
    local   all             all                                     trust
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    
  3. Restart postgre server

    sudo /etc/init.d/postgresql restart
    
  4. Enjoy :)

 

Но конечно ничто вам не мешает создать в 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=ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ

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

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

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

config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']

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

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

Из за того как Capistrano подключается к вашему серверу, с переменными окружения тоже могут быть проблемы. Поэтому рекомендую хранить переменные окружения вместо .bashrc .bash_profile .profile вот здесь:

sudo -H nano /etc/environment

А вот отличный ответ почему всё так происходит (рекомендую ознакомиться, сэкономите кучу нервов при деплое непонимая почему капистрано не видит переменные)

Capistrano makes its connection as a non-login, non-interactive shell. It will not automatically evaluate the various home scripts.

How Capistrano makes its connection is described here:http://capistranorb.com/documentation/advanced-features/ptys/

What files are evaluated on the various shell modes is described here:https://github.com/rbenv/rbenv/wiki/Unix-shell-initialization#bash

A number of other ways to set environment variables is shown here: Capistrano: Can I set an environment variable for the whole cap session?

A duplicate question is here: https://superuser.com/questions/564926/profile-is-not-loaded-when-using-ssh-ubuntu

The FAQ section for this question is here: http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/

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

. ~/.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