Итак, у вас есть чистая Ubuntu, в консоли открыто ssh-соединение с сервером и консоль вас заманчиво приглашает — «root@my-awesome-host:~#» — и больше ничего нет. А хочется запустить и показать всему миру какое-то рельсовое приложение. Поехали от супа до орехов.
В вашей системе пока даже нет пользователей. Да даже название хоста, скорее всего, не как в приведённом примере, а что-нибудь вроде «56-78-vps-small». Не порядок.
Меняем:
Перезагружаемся:
Ждём когда система загрузится. Сразу добавим правила фаерволла:
По фэн-шую можно сохранить конфигурацию в отдельный файл и восстанавливать её отдельной командой. Но можно и так :) Вдыхаем:
Пробуем:
Если буковки отображаются — выдыхаем, значит не срубили сук на котором сидели (не закрыли правилами ssh-соединение). Идём дальше.
Запоминаем пароли.
Под deployer'ом будет работать всё www. Под eugzol будем сидеть через ssh (выберите своё любимое имя пользователя). Выходим, заходим…
Всё работает — хорошо. Добавляем свой ключ:
Отключаемся, подключаемся, пароль спрашивать не должен. Аналогично добавляем свой ключ пользователю deployer.
Если вам нравится цветная консоль, уберите знак комментария у соответствующей строки в .bashrc:
Ставим заранее всё что пригодится. Ну, может чего-то и забыли, не страшно, добавим потом по обстоятельствам.
Для сборки Ruby:
MySQL (запоминаем рут пароль):
Для сборки Passenger:
Дальше создаём структуру каталогов:
/home/deployer/repos — гит-репозитории
/home/deployer/projects — рабочие копии проектов
Поставим руби:
Смотрим, чего пишет в конце. А важно там две вещи:
— возможно, надо добавить в .bashrc указанную строку, если её там ещё нет
— возможно, не все пакеты раньше поставили из указанных. надо вернуться на шаг назад и доставить
Идём дальше.
Мне нужна была эта версия Руби. Если у вас основная другая версия — ставьте другую.
Посмотрим теперь, как будем ставить приложение, например, rolling-on-rails. По науке надо это оборачивать в Capistrano или подобное средство. Но для начала можно и обойтись простыми методами.
И напоследок:
Чтобы rubygems не тормозили на установке документации, которую всё равно с локального компьютера никто не смотрит.
Дальше на своей локальной машине в каталоге проекта:
Возвращаемся на удалённую:
В каталоге должны появиться файлы нашего проекта.
Вводим пароль.
Создаём конфиг:
RVM спросит, доверяете ли вы тому, что вписали в .rvmrc. Так как вы эту строку не сами придумали, а скопировали с источника в открытой сети, а кто знает, что там вам в этих интернетах предложат написать в конфиг-файлы, я бы перечитал ещё раз… Ну ладно, шутки в сторону, идём дальше.
Ещё раз проверяем что у нас выставилась нужная версия Ruby и gemset.
Проверяем, всё ли работает.
Добавим временно deployer в группу sudo:
Собственно установка:
Говорим установщику — самому всё скачать и поставить.
Создаём место под логи nginx:
Редактируем конфиг-файлы:
В итоге получаем что-то вроде http://pastie.org/2625120.
Ставим init-скрипт:
Меняем путь к pid-файлу:
Проверяем:
Заходим на наш сервер из браузера по IP или доменному имени. Должны увидеть приглашение «Welcome to nginx!».
Добавляем конфигурацию приложения:
Добавляем туда что-то вроде http://pastie.org/2625166.
Включаем:
Перезапускаем:
Заходим на rolling-on-rails.ru. Если всё сделано верно, то наслаждаемся нашим работающим приложением.
Убираем оставшийся мусор:
Убираем пользователя deployer из группы sudo:
Строку похожую на «sudo:x:27:eugzol,deployer» меняем на «sudo:x:27:eugzol».
Занимаемся другими делами, пока всё работает :)
P.S. Этот топик написал в основном хабраюзер eugzol с небольшими моими дополнениями, поэтому лучше все вопросы и плюсы в карму направляйте ему
Строим дом
В вашей системе пока даже нет пользователей. Да даже название хоста, скорее всего, не как в приведённом примере, а что-нибудь вроде «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 с небольшими моими дополнениями, поэтому лучше все вопросы и плюсы в карму направляйте ему