Недавно столкнулся с неприятным сюрпризом. Неочень приятно видеть непрошенных гостей из Китая у себя на сервере)) Решил что русскоязычному сообществу следует знать об этой уязвимости и перевёл статью для сообщества.
Ссылка на переведённую мною статью про уязвимость CVE-2017-17405
Recently wrote a gem. Check it out
Really good looking notifications + without any dependencies!
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!
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.
Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.
Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)
Создайте в корне приложения файл .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/.bashr
c
Сразу после строчек
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
Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!