Первая часть про настройки сервера. Перейдём ко второй части.
Установим нужные пакеты
sudo apt-get install -y git-core curl build-essential zlib1g-dev libssl-dev libreadline-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs libpq-dev postgresql postgresql-server-dev-9.3 python-software-properties libsqlite3-dev libgmp-dev
Добавим репозиторий nginx и установим его
sudo add-apt-repository ppa:nginx/stable
Жмём ENTER
sudo apt-get update && sudo apt-get -y install nginx
ПРИМЕЧАНИЕ
Скорее всего ваш сайт будет обрабатывать изображения (те же аватарки, фото), использовать такие гемы как Paperclip или carrierwave. Для обработки изображения они используют библиотеку rmagic. Предвидя это:
Fetching: rmagick-2.13.2.gem (100%) # Building native extensions. This could take a while... # ERROR: Error installing rmagick: # ERROR: Failed to build gem native extension.сразу же рекомендую установить ещё один пакет чтоб вы потом не гадали почему “фотки не грузятся”
sudo apt-get install libmagick++-dev
Теперь создадим пользователя от имени которого мы будем запускать наше rails приложение.
sudo adduser deploy --disabled-password
Теперь надо дать юзеру deploy публичный ключь ssh который у username-а, да бы иметь возможность и права на изменение файлов и прочее + удалённый доступ .
Создадим директорию .ssh для установки публичного ключа, изменим владельца директории на deploy, изменим разрешение на запись (только владелец)
sudo mkdir /home/deploy/.ssh sudo chown -R deploy /home/deploy/.ssh sudo chgrp -R deploy /home/deploy/.ssh sudo chmod -R 700 /home/deploy/.ssh
Опционально: можете добавить вашему пользователю username группу deploy
sudo usermod -a -G deploy username
это позволит легко менять файлы пользователя deploy.
Скопируем публичный ssh от username(от имени которого мы всё ещё в системе) к пользователю deploy
sudo cp ~/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys sudo chown deploy /home/deploy/.ssh/authorized_keys sudo chgrp deploy /home/deploy/.ssh/authorized_keys
Создадим директории для развёртывания нашего приложения.
Вместо myrailsapp — можете вставить ваше название
sudo mkdir -p /opt/www/myrailsapp sudo chown -R deploy /opt/www/myrailsapp sudo chgrp -R deploy /opt/www/myrailsapp sudo chmod -R 775 /opt/www/myrailsapp
Перейдём к пользователю deploy
sudo su - deploy
Для контроля версий руби и гемов будем использовать rbenv.
Не заморачиваясь на rvm и rbenv могу сказать что разницы в производительности вы не почувствуете. Разве что с rvm придётся немного дольше настраивать Capistrano. А если нет разницы, вам это надо?
Установим rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
сконфигурируем файл .bashrc
nano ~/.bashrc
добавьте В САМОЕ НАЧАЛО ФАЙЛА (это имеет значение) следующий код
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
Сохраним файл уже известным нам способом
CTRL+X, Y, ENTER
Перезапустим shell
exec $SHELL
Установим ruby-build и не будем марать ручки))
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Выберем версию руби для установки.
ОЧЕНЬ рекомендую устанавливать версию последнюю стабильную.
К примеру в версии 2.2.1 был найден неприятный баг с TCL, не «секюрно» короче.
Я установлю версию 2.2.2, вы выбирайте ту на которой велась разработка вашего продукта ну или последнюю стабильную на свой страх и риск.
Следующая команда покажет все доступные к установке версии
rbenv install -l
Установим. Это может занять некоторое время поэтому пойдите пока и заварите себе чайку или кофе. Дождитесь окончания установки. Может занять >10 минут
rbenv install 2.2.2
Установим эту версию как глобальную
rbenv global 2.2.2 rbenv rehash
Проверим версию руби
ruby -v
Установим гем bundler (без документации, это долго и к тому же зачем она на сервере?)
gem install bundler --no-ri --no-rdoc rbenv rehash
Выходим с пользователя deploy
exit
Настроим базу данных PostgreSQL
Мы её уже устанавливали, во время установки был создан специальный пользователь, перейдём на него
sudo su - postgres
подключаемся к postgres
psql
В PostgreSQL нет “пользователей”, в ней существуют “роли”. Создадим новую роль, укажем имя так что бы оно совпадало с именем пользователя, от имени которого будет запускаться приложение (простите за каламбур)) . В нашем случае это deploy.
НЕЗАБЫВАЙТЕ точку с запятой в конце.
create user deploy;
Создадим новую базу данных и дадим роли deploy права на неё. Таким образом deploy будет иметь все права НО только на эту базу данных (если вдруг вы решите создать параллельно другую базу данных). Другие ДБ он затронуть не сможет.
create database myrailsapp_production owner deploy;
Выходим из консоли psql и от пользователя Postgres
\q exit
Проверим работает ли бд
sudo su deploy
psql -d myrailsapp_production
Если подключилось, всё ок, выходим.
\q exit
Мы используем Рейлс приложение всего одно на этом сервере поэтому нам больше не нужны остальные конфигурации.
Удалите страницу по умолчанию и создайте новую
sudo rm /etc/nginx/sites-enabled/default && sudo nano /etc/nginx/sites-available/myrailsapp
Записываем следующее в файл для myrailsapp , не забываем ввести соответствующие изменения в него
upstream unicorn_myrailsapp { server unix:/tmp/unicorn.myrailsapp.sock fail_timeout=0; # сокет для запросов } server { listen 80 default deferred; server_name mydomain.com; # имя сервера root /opt/www/myrailsapp/current/public; location ~ ^/assets/ { # для asset pipline настройки gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_pass http://unicorn_myrailsapp; # прокси на сокет выше } error_page 500 502 503 504 /500.html; client_max_body_size 4G; keepalive_timeout 10; }
создадим симлинк на место расположение сайта
sudo ln -s /etc/nginx/sites-available/myrailsapp /etc/nginx/sites-enabled/myrailsapp
Перезапустим nginx
sudo service nginx restart
Настройки Unicorn.
Настроим инициализационный скрипт для unicorn
sudo nano /etc/init.d/unicorn_myrailsapp
Скопируйте в него следующее:
#!/bin/sh ### BEGIN INIT INFO # Provides: unicorn # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Manage unicorn server # Description: Start, stop, restart unicorn server for a specific application. ### END INIT INFO set -e # Feel free to change any of the following variables for your app: TIMEOUT=${TIMEOUT-60} APP_ROOT=/opt/www/myrailsapp/current # настройка расположения приложения current это от capistrano PID=$APP_ROOT/tmp/pids/unicorn.pid # определение процесса Юникорна CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" # команды для запуска в корне проекта сервера юникорна AS_USER=deploy # от имени какого пользователя будет запушен сервер set -u OLD_PIN="$PID.oldbin" sig () { test -s "$PID" && kill -$1 `cat $PID` } oldsig () { test -s $OLD_PIN && kill -$1 `cat $OLD_PIN` } run () { if [ "$(id -un)" = "$AS_USER" ]; then eval $1 else su -c "$1" - $AS_USER fi } case "$1" in start) sig 0 && echo >&2 "Already running" && exit 0 run "$CMD" ;; stop) sig QUIT && exit 0 echo >&2 "Not running" ;; force-stop) sig TERM && exit 0 echo >&2 "Not running" ;; restart|reload) sig HUP && echo reloaded OK && exit 0 echo >&2 "Couldn't reload, starting '$CMD' instead" run "$CMD" ;; upgrade) if sig USR2 && sleep 2 && sig 0 && oldsig QUIT then n=$TIMEOUT while test -s $OLD_PIN && test $n -ge 0 do printf '.' && sleep 1 && n=$(( $n - 1 )) done echo if test $n -lt 0 && test -s $OLD_PIN then echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds" exit 1 fi exit 0 fi echo >&2 "Couldn't upgrade, starting '$CMD' instead" run "$CMD" ;; reopen-logs) sig USR1 ;; *) echo >&2 "Usage: $0 " exit 1 ;; esac
Установите разрешение для init.d скрипта
sudo chmod 755 /etc/init.d/unicorn_myrailsapp
Назначить старт скрипту init.d при каждом запуске сервера
sudo update-rc.d unicorn_myrailsapp defaults
Перезапустите сервер
sudo reboot