Архив рубрики: rails
Подключение Active Storage к Yandex Object Storage
Для работы с Yandex Object Storage необходимо еще:
- прописать в Gemfile`gem “aws-sdk-s3”, require: false` и потом естественно bundle install
- прописать у сервиса 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 в своем приложении.
error tmp passenger nginx
export TEMP=/home/tmp/ export PASSENGER_TMPDIR=/home/tmp/
unicorn
unicorn_rails -c config/unicorn.rb -E production -D
Autorun many things
- Use chkconfig — about, link
- 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
Выбираем версию 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()
Каждое описание изменений состоит из следующих элементов, в порядке:
- Дополнительный описатель заполнения, который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой ('). См. примеры ниже.
- Дополнительный описатель выравнивания , который говорит, что результат должен быть выравнен по левому или по правому краю. По умолчанию выравнивание происходит по правому краю; символ - приведет к вырвниванию по левому краю.
- Дополнительный описатель ширины, который говорит, с каким количеством символов (минимум) пожет производится данная замена.
- Дополнительный описатель точности, который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format().)
- Описатель типа, который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:
% - символ процента. Аргумент не требуется. 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