Недавно столкнулся с неприятным сюрпризом. Неочень приятно видеть непрошенных гостей из Китая у себя на сервере)) Решил что русскоязычному сообществу следует знать об этой уязвимости и перевёл статью для сообщества.
Ссылка на переведённую мною статью про уязвимость CVE-2017-17405
Recently wrote a gem. Check it out
Really good looking notifications + without any dependencies!
Если у вас возникли проблемы с гемом shoulda-matcher после установки и запуска гема Zeus, не надо сразу откатывать всю разработку назад и прощаться с зевсом.
Попробуйте сделать следующее:
В Gemfile:
gem 'shoulda-matchers', require: false
А в файл spec/rails_helper.rb если присутствует, или в spec/spec_helper.rb пропишите:
require 'rspec/rails' require 'shoulda/matchers'
Должно заработать. Удачи!
Признаюсь, я не хотел внедрять TDD потому что было ленно писать код "который ничего не создаёт и не делает". Но философия дяди Боб-а мне очень понравилась. Как говорилось у Карлоса Кастанеды :
"Вещи не меняются, меняется лишь наш взгляд на них."
С сегодняшнего дня я начну внедрять ТDD в свои проекты. Хоть дядя Боб и говорит что внедрение тестов в уже написанный код "безумие не стоящее и гроша" я сделаю это, скажем так - для общего развития. Начну с последнего проекта "Conversation App".
Рекомендую всем посмотреть видео ниже. Если вы сомневаетесь в пользе тестов и существующие аргументы вас не убеждают, Дядя Боб поможет вам взглянуть на это по другому, да так, что вам придётся уже искать причину не следовать TDD (сразу предупрежу, лень - это не причина). Ну и попутно вы узнаете интересное про архитектуры, и особенности архитектур приложений.
Смотрим видео.
Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.
Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)
Создайте в корне приложения файл .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
Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!