Архив рубрики: rails

Подключение Active Storage к Yandex Object Storage

link

Для работы с Yandex Object Storage необходимо еще:

  1. прописать в Gemfile`gem “aws-sdk-s3”, require: false` и потом естественно bundle install
  2. прописать у сервиса yandex параметр `region: ‘ru-central3’`

PS если ранее не пользовались, то выполнить поддержку Active Storage:

3. `rails active_storage:install`

4. `rails db:migrate`

И вот только после этого будет все работать.

Пояснение относительно gem-а:

Active Storage http://rusrails.ru/active_storage_overview#servis-amazon-s3 требует указанный выше gem для работы с Amazon S3. Это нужно так как Yandex Object Storage поддерживает методы Amazon S3 https://cloud.yandex.ru/docs/storage/s3/, то и устанавливаем его https://github.com/aws/aws-sdk-ruby

Пояснение относительно ключа region:

Без него не работало, так как трубуется указание ключа региона https://cloud.yandex.ru/docs/storage/s3/signing-requests

 


Для начала, нам нужны ключи для доступа к API. Их можно создать во вкладке “Сервисные аккаунты”: Создать новый ключ > Создать ключ доступа. Идентификатор ключа будет выполнять роль YOUR_ACCESS_KEY_ID, а Секретный ключ, соответственно, YOUR_SECRET_ACCESS_KEY.

Точкой отсчёта мы возьмём стандартный конфиг от Амазона, который лежит в config/storage.yml:

amazon:
   service: S3
   access_key_id: 'YOUR_ACCESS_KEY_ID'
   secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
   region: eu-north-1
   bucket: bucketname

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

https://storage.yandexcloud.net

Также нам понадобится установить переменную force_path_style в true, чтобы AS использовал нужный нам тип URL. Итого получим такой конфиг:

yandex:
  service: S3
  access_key_id: 'YOUR_ACCESS_KEY_ID'
  secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
  bucket: bucketname
  endpoint: 'https://storage.yandexcloud.net'
  force_path_style: true

Останется в конфиге окружения указать Яндекс:

Rails.application.configure do
  ...
  config.active_storage.service = :yandex
  ...
end

После этого можно использовать апи Active Storage в своем приложении.

unicorn

unicorn_rails -c config/unicorn.rb -E production -D

Autorun many things

  • Use chkconfig — aboutlink
  • DaemonController library. It will enable you to auto-start services with your Rails app, starting them if they aren’t already started.
  •  Create an initializer containing (about):
Thread.new do
  system("rackup faye.ru -s thin -E production")
end
  • On Ubuntu, you should use the operating systems’s init system — Upstart.

    user@host:~$ cat /etc/init/faye.conf 
    description "Faye Upstart script"
    
    start on startup
    stop on shutdown
    
    respawn
    
    script
        env RAILS_ENV=production
    
        exec sudo -u deployuser -i /home/deployuser/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/bin/rackup /var/www/booko.com.au/booko/faye.ru -s thin -E production
    end script 

    I’m not happy with the method of calling Ruby since it will change. But the advantages are that it will start when the system starts and it will respawn if it dies or you KILL it.

    Let Upstart take care of demonising a process and making sure it keeps running

  • Shell script in config/thin_example.sh

    #!/bin/sh
    
    set -e
    
    # Feel free to change any of the following variables for your app:
    TIMEOUT=${TIMEOUT-60}
    APP_ROOT=/home/deployer/apps/example/current
    PID=$APP_ROOT/tmp/pids/thin.pid
    CMD="cd $APP_ROOT; bundle exec rackup -D -P $PID $APP_ROOT/config/faye.ru -s thin -E     production"
    AS_USER=deployer
    set -u
    
    startme(){
        run "$CMD"}
    
    stopme(){
        run "pkill -f $PID"}
    
    run (){if["$(id -un)"="$AS_USER"];then
        eval $1
      else
        su -c "$1"- $AS_USER
      fi
    }case"$1"in
        start)   startme ;;
        stop)    stopme ;;    
        restart) stopme; startme ;;*) echo "usage: $0 start|stop|restart">&2
           exit 1;;
    esac

    Loosely modified from the unicorn scripts that Ryan Bates used in his VPS deployment railscast (pro only).

    Make it executable

    chmod +x config/thin_example.sh

    You’ll need to symlink it to init.d (after chmod +x ‘ing to make it executable)

    sudo ln -nfs /home/deployer/apps/example/current/config/thin_example.sh /etc/init.d/thin_example

    Then if you want it to startup with the server

     sudo update-rc.d thin_example defaults

    Otherwise you should just be able to /etc/init.d/thin_example [start|stop|restart]. An important point to note is that I’m telling rackup to start in daemon mode (-D) and explicitly setting the PID so I can kill it late

Main commands and configs

Commands:

service redis-server start
service mongodb start
service ssh --full-restart
source /usr/local/rvm/scripts/rvm

Packages:

  • AngularJS
  • BracketHighlighter
  • LESS
  • Package Control
  • SFTP
  • ColorPicker

Config:

{
 "bold_folder_labels": true,
 "caret_style": "phase",
 "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
 "enable_tab_scrolling": false,
 "fade_fold_buttons": false,
 "fallback_encoding": "Cyrillic (Windows 1251)",
 "font_size": 13,
 "highlight_line": true,
 "highlight_modified_tabs": true,
 "ignored_packages":
 [
 "RubyTest",
 "SublimeREPL",
 "Vintage"
 ],
 "line_padding_bottom": 1,
 "line_padding_top": 1,
 "show_encoding": true,
 "tab_size": 2,
 "translate_tabs_to_spaces": true,
 "update_check": false,
 "word_wrap": true
}

gemset

link

Выбираем версию ruby

$ rvm use 2.2.0

Создаем гемсет

$ rvm gemset create my_app

переключаемся на новый гемсет

$ rvm gemset use my_app

Устанавливаем rails

$ gem install rails --no-ri --no-rdoc

Создаем новое приложение

$ rails new my_app -d postgresql

Переходим в каталог нового приложения

$ cd my_app

Закрепляем версию руби и гемсет за данным каталогом, т.е. проектом

$ rvm --ruby-version use rvm current@my_app

сохраняем исходный конфиг database.yml и редактируем database.yml

$ cp config/database.yml config/database.yml.sample

Создаем базы

$ rake db:create:all

Ну и git

git init
echo config/database.yml >> .gitignore
git add .
git ci -am "initial commit"

UPD: Скрипт я все таки сделал, но он дико заточен под меня, без параметров. Всегда создается проект с базой данных postgres и иницируется git, а также все проекты у меня лежат в каталоге ~/projects.

Сам скрипт:

#!/bin/bash

read -n 1 -p "Ты запустил скрипт с параметрами - x.x.x my_super_app (y/[a])?: " AMSURE
[ "$AMSURE" = "y" ] || exit
echo "" 1>&2

cd ~/projects

rubyVersion=$1
appName=$2
echo -e "\x1B[33m### Try ruby version: $rubyVersion ###\x1B[39m"
echo -e "\x1B[33m### Try application name: $appName ###\x1B[39m"

if which rvm 1>/dev/null; then
  echo -e "\x1B[32m### Using RVM ###\x1B[39m"
else
  echo -e "\x1B[31m### RVM not instaled ###\x1B[39m"
  exit
fi

rvm use $rubyVersion
rvm gemset create $appName
rvm gemset use $appName
gem install rails --no-ri --no-rdoc
echo -e "\x1B[32m### Rails done! ###\x1B[39m"
rails new $appName -d postgresql
cd $appName
rvm --ruby-version use rvm current@$appName
cp config/database.yml config/database.yml.sample

#git
git init
echo config/database.yml >> .gitignore
git add .
git ci -am "Initial commit for $appName"
echo -e "\x1B[32m### All done! ###\x1B[39m"
echo -e "\x1B[33m### Do not forget edit database.yml and create DBs with 'rak

printf

printf(«как форматировать», парметр1, параметр2, …) — выводит результат на экран

$result=sprintf(«..», .., .., …) — тоже самое, только строка не выводиться, а помещается в $result

Цитата из перевода мануала (ПРИМЕРЫ ниже :-):

sprintf

sprintf — возвращает форматированную строку

Описание

sprintf(string format, mixed [args]…);

Возвращает строку, обрабатываемую в соответствии с форматирующей строкой format.

Форматирующая строка, содержащая ноль или более директив: обычные символы (кроме %) которые копируются прямо в результат, и that are copied directly to the result, и описания изменений, каждое из которых выполняет определенные действия. Это применительно и к sprintf() и к printf()

Каждое описание изменений состоит из следующих элементов, в порядке:

  1. Дополнительный описатель заполнения, который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой ('). См. примеры ниже.
  2. Дополнительный описатель выравнивания , который говорит, что результат должен быть выравнен по левому или по правому краю. По умолчанию выравнивание происходит по правому краю; символ - приведет к вырвниванию по левому краю.
  3. Дополнительный описатель ширины, который говорит, с каким количеством символов (минимум) пожет производится данная замена.
  4. Дополнительный описатель точности, который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format().)
  5. Описатель типа, который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:
    % - символ процента. Аргумент не требуется.
    b - аргумент трактуется как integer и представляется как двоичное число.
    c - аргумент трактуется как integer и представляется как символ с ascii значением.
    d - аргумент трактуется как integer и представляется как десятичное число.
    f - аргумент трактуется как double и представляется как число с плавающей точкой.
    o - аргумент трактуется как integer и представляется как восьмиричное число.
    s - аргумент трактуется и представляется как строка.
    x - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в нижнем регистре).
    x - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в верхнем регистре).

     

См. также: printf()number_format()

Примеры

Пример 1. sprintf: числа с нулями

$isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
Пример 2. sprintf: форматирование денежной еденицы

$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money will output "123.1";
$formatted = sprintf ("%01.2f", $money);
// echo $formatted will output "123.10"

 


Примеры

Все то, что записано >>> между таких скобок <<< является результатом работы фукнции (т.е. пример вывода на экран)

$s='mystring';  -> строка   %s
$f=12345.6789;  -> дробное  %f
$d=12345;       -> целое    %d  10-я система: 0123456789
                   16числа  %x  16-я система: 0123456789abcdef
                   16числа  %x  16-я система: 0123456789abcdef
                   8числа   %o  8-я система:  01234567
                   2числа   %b  2-я система:  01

просто выводим число:
printf("%d",$d);   >>> 12345 <<<

просто выводим 16число:
printf("%x",123456789);   >>> 75bcd15 <<<

просто выводим 2число:
printf("%b",$d);   >>> 11000000111001 <<<

просто выводим дробное число:
printf("%f",$f);   >>> 12345.6789 <<<

дополнение чисел нулями:
printf("%010d",$d); >>> 0000012345 <<<

округление до 3х знаков после запятой:
printf("%.3f",$f); >>> 12345.679 <<<

просто выводим число + посторонний текст:
printf("посторонний%dтекст",$d);   >>> посторонний12345текст <<<

вывод нескольких переменных - последовательное перечисление 
printf("%d-%f-%s",$d,$f,$s);   >>> 12345-12345.678900-mystring <<<

выравнивание (ширина 20 символов) по правому краю, пустоту заполняем '_':
printf("%'_20s",mystring);  >>> ____________mystring <<< 

выравнивание по левому краю, пустоту заполняем 'x':
printf("%-'x20s",mystring);  >>> mystringxxxxxxxxxxxx <<<

Источник:
http://myphp.net.ru/

Copied from: http://articles.org.ru/cfaq/index.php?qid=507

 

Sidekiq service

https://cdyer.co.uk/blog/init-script-for-sidekiq-with-rbenv/

Sidekiq is a great queuing system for any rails app, it is easy to setup and fast since it also uses Redis. The most difficult part of integrating with a recent app for me, was getting it to start when the VPS booted.

The people behind sidekiq thankfully provide a nice init script, although my particular setup caused a few problems for it.

  • The script should run as root, however I use a ‘deployer’ user, under which runs rbenv. Root had no access to bundle exec
  • Since I don’t write init scripts often, it took me a while to get it to startafter Redis

My workaround to the rbenv problem was to modify the providied Sidekiq init script, to run the actual bundle exec sidekiq command as my deployment user:

START_CMD="$BUNDLE exec $SIDEKIQ -e $APP_ENV -P $PID_FILE"  
CMD="cd ${APP_DIR}; ${START_CMD}"

# Replaced this:
$START_CMD >> $LOG_FILE 2>&1 &

# With this:
su -c "$CMD" - $AS_USER  

I created the file /etc/init.d/sidekiq with the contents of the sidekiq init script, and my code above. This didn’t work. Examining the log file, sidekiq was being started before redis could finish initializing. To stop this happening I needed to run:

sudo update-rc.d sidekiq defaults 99  

This sets the index of the sidekiq script to be 99. For me Redis was initing at 20, since 99 is greater than 20, Sidekiq will start after.

You can now manage the sidekiq process with the usual:

service sidekiq start  
service sidekiq status  
service sidekiq stop  

Full modified init script below. I have only tried it on Ubuntu 12.10 although it should also work on other Ubuntus and probably Debian.

#!/bin/bash
# sidekiq Init script for Sidekiq
# chkconfig: 345 100 75
#
# Description: Starts and Stops Sidekiq message processor for Stratus application.
#
# User-specified exit parameters used in this script:
#
# Exit Code 5 — Incorrect User ID
# Exit Code 6 — Directory not found
# You will need to modify these
APP=«myapp«
AS_USER=«myuser«
APP_DIR=«/var/www/${APP}/current«
APP_CONFIG=«${APP_DIR}/config«
LOG_FILE=«$APP_DIR/log/sidekiq.log«
LOCK_FILE=«$APP_DIR/${APP}-lock«
PID_FILE=«$APP_DIR/${APP}.pid«
GEMFILE=«$APP_DIR/Gemfile«
SIDEKIQ=«sidekiq«
APP_ENV=«production«
BUNDLE=«bundle«
START_CMD=«$BUNDLE exec $SIDEKIQ -e $APP_ENV -P $PID_FILE«
CMD=«cd ${APP_DIR}; ${START_CMD} >> ${LOG_FILE} 2>&1 &«
RETVAL=0
start() {
status
if [ $? -eq 1 ]; then
[ `id -u` == '0' ] || (echo «$SIDEKIQ runs as root only ..«; exit 5)
[ -d $APP_DIR ] || (echo «$APP_DIR not found!.. Exiting«; exit 6)
cd $APP_DIR
echo «Starting $SIDEKIQ message processor .. «
su -c «$CMD«$AS_USER
RETVAL=$?
#Sleeping for 8 seconds for process to be precisely visible in process table — See status ()
sleep 8
[ $RETVAL -eq 0 ] && touch $LOCK_FILE
return $RETVAL
else
echo «$SIDEKIQ message processor is already running .. «
fi
}
stop() {
echo «Stopping $SIDEKIQ message processor ..«
SIG=«INT«
kill -$SIG `cat $PID_FILE`
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $LOCK_FILE
return $RETVAL
}
status() {
ps -ef | grep sidekiq [0-9].[0-9].[0-9] | grep -v grep
return $?
}
case «$1« in
start)
start
;;
stop)
stop
;;
status)
status
if [ $? -eq 0 ]; then
echo «$SIDEKIQ message processor is running ..«
RETVAL=0
else
echo «$SIDEKIQ message processor is stopped ..«
RETVAL=1
fi
;;
*)
echo «Usage: $0 {start|stop|status}«
exit 0
;;
esac
exit $RETVAL

apache passenger

First install packages:

- for Ubuntu:

sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install apache2-dev

- for CentOS (good tutorial):

yum install curl-devel httpd-devel 

or

yum install curl-devel apache2-devel 

After install gem:

gem install passenger

And then successfully configurate it:

sudo passenger-install-apache2-module