Pull to refresh

Разворачиваем приложение на чистой Убунте: от A до Z

Reading time5 min
Views3.6K
Итак, у вас есть чистая Ubuntu, в консоли открыто ssh-соединение с сервером и консоль вас заманчиво приглашает — «root@my-awesome-host:~#» — и больше ничего нет. А хочется запустить и показать всему миру какое-то рельсовое приложение. Поехали от супа до орехов.


Строим дом


В вашей системе пока даже нет пользователей. Да даже название хоста, скорее всего, не как в приведённом примере, а что-нибудь вроде «56-78-vps-small». Не порядок.

Меняем:

#> nano /etc/hostname
#> nano /etc/hosts

Перезагружаемся:

shutdown -r now

Ждём когда система загрузится. Сразу добавим правила фаерволла:

#> nano /etc/rc.local

# Drop all incoming traffic<br>
/sbin/iptables -P INPUT DROP<br>
# Drop all forwarded traffic<br>
/sbin/iptables -P FORWARD DROP<br>
# Allow all outgoing traffic<br>
/sbin/iptables -P OUTPUT ACCEPT<br>
# Allow returning packets<br>
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br>
# Allow incoming traffic on port 80 for web server<br>
/sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT<br>
# Allow local traffic<br>
/sbin/iptables -A INPUT -i lo -j ACCEPT<br>
# Allow incoming SSH on port 22<br>
/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT<br>
# Allow ping<br>
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT<br><br>

exit 0


По фэн-шую можно сохранить конфигурацию в отдельный файл и восстанавливать её отдельной командой. Но можно и так :) Вдыхаем:

#> /etc/rc.local

Пробуем:

#> asdlkjflaskdjf

Если буковки отображаются — выдыхаем, значит не срубили сук на котором сидели (не закрыли правилами ssh-соединение). Идём дальше.

#> adduser deployer<br>
#> adduser eugzol<br>
#> adduser eugzol sudo


Запоминаем пароли.

Под deployer'ом будет работать всё www. Под eugzol будем сидеть через ssh (выберите своё любимое имя пользователя). Выходим, заходим…

root@my-awesome-host#> exit<br>
eugzol@home$> ssh my-awesome-host<br>
eugzol@my-awesome-host$> sudo echo test


Всё работает — хорошо. Добавляем свой ключ:

$> mkdir .ssh<br>
$> echo "ssh-rsa ........... == eugzol@home" > .ssh/authorized_keys<br>
$> chmod 700 .ssh<br>
$> cd .ssh<br>
$> chmod 600 *


Отключаемся, подключаемся, пароль спрашивать не должен. Аналогично добавляем свой ключ пользователю deployer.

Если вам нравится цветная консоль, уберите знак комментария у соответствующей строки в .bashrc:

$> nano ~/.bashrc<br>
# ...<br>
force_color_prompt=yes<br>
...


Пакеты, пакеты, пакеты


Ставим заранее всё что пригодится. Ну, может чего-то и забыли, не страшно, добавим потом по обстоятельствам.

Для сборки Ruby:
$> sudo apt-get -y install build-essential zlib1g zlib1g-dev libxml2 libxml2-dev libxslt-dev sqlite3 libsqlite3-dev locate git-core

MySQL (запоминаем рут пароль):
$> sudo apt-get -y install mysql-server libmysqlclient-dev

Для сборки Passenger:
$> sudo apt-get -y install libcurl4-openssl-dev

Выкатываем приложение


$> sudo su deployer

Дальше создаём структуру каталогов:
/home/deployer/repos — гит-репозитории
/home/deployer/projects — рабочие копии проектов

$> mkdir repos<br>
$> mkdir projects


Поставим руби:

$> bash < <(curl -s rvm.beginrescueend.com/install/rvm)

Смотрим, чего пишет в конце. А важно там две вещи:
— возможно, надо добавить в .bashrc указанную строку, если её там ещё нет
— возможно, не все пакеты раньше поставили из указанных. надо вернуться на шаг назад и доставить

Идём дальше.

$> rvm install 1.8.7

Мне нужна была эта версия Руби. Если у вас основная другая версия — ставьте другую.

Посмотрим теперь, как будем ставить приложение, например, rolling-on-rails. По науке надо это оборачивать в Capistrano или подобное средство. Но для начала можно и обойтись простыми методами.

И напоследок:

$> echo "gem: --no-rdoc --no-ri" > ~/.gemrc"

Чтобы rubygems не тормозили на установке документации, которую всё равно с локального компьютера никто не смотрит.

$> rvm use 1.8.7<br>
$> rvm gemset use global<br>
$> gem install bundler


Репозиторий и рабочий каталог

cd ~/repos<br>
git init --bare rolling-on-rails.git


Дальше на своей локальной машине в каталоге проекта:

eugzol@home$> git remote add my-awesome-host ssh://deployer@my-awesome-host.ru/home/deployer/repos/rolling-on-rails.git<br>
eugzol@home$> git push my-awesome-host master


Возвращаемся на удалённую:

cd ~/projects<br>
mkdir rolling-on-rails<br>
cd rolling-on-rails<br>
git init<br>
git remote add local /home/deployer/repos/rolling-on-rails.git<br>
git fetch local<br>
git checkout master


В каталоге должны появиться файлы нашего проекта.

Настраиваем базу

mysql -u root -p

Вводим пароль.

mysql> create user 'rolling-on-rails'@'localhost' identified by 'sakdl5&%1';<br>
mysql> create database rolling-on-rails charset utf8 collate utf8_bin;<br>
mysql> grant all on rolling-on-rails.* to 'rolling-on-rails'@'localhost';


Создаём конфиг:

cd ~/projects/rolling-on-rails<br>
echo "production:<br>
adapter: mysql<br>
host: localhost<br>
database: rolling-on-rails<br>
username: rolling-on-rails<br>
password: sakdl5&%1<br>
encoding: utf8" > config/database.yml


Gems and go!

$> echo "rvm 1.8.7@rolling-on-rails > .rvmrc"<br>
$> rvm gemset create rolling-on-rails<br>
$> cd ..<br>
$> cd rolling-on-rails


RVM спросит, доверяете ли вы тому, что вписали в .rvmrc. Так как вы эту строку не сами придумали, а скопировали с источника в открытой сети, а кто знает, что там вам в этих интернетах предложат написать в конфиг-файлы, я бы перечитал ещё раз… Ну ладно, шутки в сторону, идём дальше.

$> rvm info

Ещё раз проверяем что у нас выставилась нужная версия Ruby и gemset.

$> bundle install<br>
$> RAILS_ENV=production rake db:migrate<br>
$> RAILS_ENV=production rake db:seed


Проверяем, всё ли работает.

Ставим пассажира


Добавим временно deployer в группу sudo:

eugzol@my-awesome-host$> sudo adduser deployer sudo<br>
sudo su deployer


Собственно установка:

cd ~/projects/rolling-on-rails<br>
gem install passenger<br>
rvmsudo passenger-install-nginx-module


Говорим установщику — самому всё скачать и поставить.

Создаём место под логи nginx:

mkdir ~/nginx

Редактируем конфиг-файлы:

cd /opt/nginx/conf<br>
sudo nano nginx.conf


В итоге получаем что-то вроде http://pastie.org/2625120.

Ставим init-скрипт:

cd<br>
git clone git://github.com/jnstq/rails-nginx-passenger-ubuntu.git<br>
sudo mv rails-nginx-passenger-ubuntu/nginx/nginx /etc/init.d/nginx<br>
sudo chown root:root /etc/init.d/nginx


Меняем путь к pid-файлу:

$> sudo nano /etc/init.d/nginx
...<br>
PIDSPATH=/home/deployer/nginx<br>
...


Проверяем:

$> sudo service nginx configtest
$> sudo service nginx start

Заходим на наш сервер из браузера по IP или доменному имени. Должны увидеть приглашение «Welcome to nginx!».

Добавляем конфигурацию приложения:

$> cd /opt/nginx/conf<br>
$> sudo su<br>
#> mkdir sites-available<br>
#> mkdir sites-enabled<br>
#> nano sites-available/rolling-on-rails.conf


Добавляем туда что-то вроде http://pastie.org/2625166.

Включаем:

#>cd sites-enabled<br>
#> ln -s ../sites-available/rolling-on-rails.conf .


Перезапускаем:

#> service nginx reload

Заходим на rolling-on-rails.ru. Если всё сделано верно, то наслаждаемся нашим работающим приложением.

Подчищаем хвосты


Убираем оставшийся мусор:

deployer@my-awesome-host$> rm -rf ~/rails-nginx-passenger-ubuntu
deployer@my-awesome-host$> exit

Убираем пользователя deployer из группы sudo:

eugzol@my-awesome-host$> sudo nano /etc/group

Строку похожую на «sudo:x:27:eugzol,deployer» меняем на «sudo:x:27:eugzol».

exit

Занимаемся другими делами, пока всё работает :)

P.S. Этот топик написал в основном хабраюзер eugzol с небольшими моими дополнениями, поэтому лучше все вопросы и плюсы в карму направляйте ему
Tags:
Hubs:
Total votes 65: ↑48 and ↓17+31
Comments43

Articles