<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Superблог компании LOCUM &#187; Хостинг</title>
	<atom:link href="http://locum.ru/blog/category/hosting/feed" rel="self" type="application/rss+xml" />
	<link>http://locum.ru/blog</link>
	<description></description>
	<lastBuildDate>Thu, 26 Mar 2015 11:44:11 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Изменения в настройках проектов Ruby on Rails, Python uWSGI и Rack</title>
		<link>http://locum.ru/blog/hosting/new-pidfile-path</link>
		<comments>http://locum.ru/blog/hosting/new-pidfile-path#comments</comments>
		<pubDate>Thu, 10 Jul 2014 22:14:14 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=378</guid>
		<description><![CDATA[Мы исправили уязвимость в инфраструктуре нашей хостинг-панели, которая могла приводить к невозможности перезапуска проектов на базе Ruby on Rails, Python uWSGI и Rack. К сожалению, в результате устранения уязвимости вам необходимо самостоятельно перегенерировать файлы деплоймента для проектов Ruby on Rails и Rack. Мы не можем изменить эти файлы, так как они являются частью данных проектов и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Мы исправили уязвимость в инфраструктуре нашей хостинг-панели, которая могла приводить к невозможности перезапуска проектов на базе Ruby on Rails, Python uWSGI и Rack. К сожалению, в результате устранения уязвимости вам необходимо самостоятельно перегенерировать файлы деплоймента для проектов <strong>Ruby on Rails</strong> и <strong>Rack</strong>. Мы не можем изменить эти файлы, так как они являются частью данных проектов и в общем случае не генерируются автоматически или загружаются на сервера хостинга из системы контроля версий.</p>
<p>Изменения коснулись пути доступа к PID-файлам проектов. Новое значение пути выглядит так:</p>
<pre>/var/run/unicorn/#{user}/#{application}.#{login}.pid</pre>
<p>То есть, к пути необходимо добавить еще один каталог, название которого совпадает с названием системного пользователя хостинга. Если вы используете автоматически сгенерированный deploy.rb, вам нужно заменить строку</p>
<pre>set :unicorn_pid, "/var/run/unicorn/#{application}.#{login}.pid"</pre>
<p>на строку</p>
<pre>set :unicorn_pid, "/var/run/unicorn/#{user}/#{application}.#{login}.pid"</pre>
<p>Указанные изменения путей не касаются работоспособности уже запущенных проектов, но без внесения этих изменений перезапустить остановленный проект невозможно.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/new-pidfile-path/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разворачиваем приложение Ruby On Rails на примере Redmine</title>
		<link>http://locum.ru/blog/hosting/locum-ror-redmine</link>
		<comments>http://locum.ru/blog/hosting/locum-ror-redmine#comments</comments>
		<pubDate>Sun, 26 Aug 2012 13:18:01 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=341</guid>
		<description><![CDATA[Rvm, Bundler, Capistrano — все эти инструменты сильно облегчают жизнь разработчику и администратору проекта, но могут изрядно запутать. В этой статье мы наглядно покажем процесс деплоя распространенной системы управления проектами Redmine. Создаем новый Ruby On Rails проект Выбираем тип проекта &#171;Ruby on Rails&#187; Задаем имя будущему проекту Создаем. Панели нужно две-три минуты, чтобы создать всё [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-361" title="image" src="http://locum.ru/blog/wp-content/uploads/2012/08/image.png" alt="" width="600" height="373" /></p>
<p>Rvm, Bundler, Capistrano — все эти инструменты сильно облегчают жизнь разработчику и администратору проекта, но могут изрядно запутать. В этой статье мы наглядно покажем процесс деплоя распространенной системы управления проектами <a href="http://www.redmine.org/" target="_blank">Redmine</a>.</p>
<p><span id="more-341"></span></p>
<h1>Создаем новый Ruby On Rails проект</h1>
<p><img class=" wp-image-352 alignnone" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг.png" alt="" width="600" /></p>
<p><img class=" wp-image-348 alignnone" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-1" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-1.png" alt="" width="600" /></p>
<ol>
<li>Выбираем тип проекта &#171;Ruby on Rails&#187;</li>
<li>Задаем имя будущему проекту</li>
<li>Создаем. Панели нужно две-три минуты, чтобы создать всё необходимое для работы проекта, после чего можно продолжать. Около 15 минут необходимо, чтобы проект начал отзываться по присвоенному ему DNS-имени.</li>
</ol>
<p><img class="alignnone  wp-image-349" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-3" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-3.png" alt="" width="600" /></p>
<p>Обратите внимание на созданную базу данных, она нам еще пригодится.</p>
<h1>Загружаем дистрибутив</h1>
<p>Новые версии Redmine замечательно работают с Ruby 1.9.3, поэтому, настройки проекта по умолчанию нам подойдут. Мы будем ставить последнюю на момент написания статьи стабильную версию Redmine 2.0.3.</p>
<p>Узнаём параметры входа на сервер по ssh</p>
<p><img class="alignnone  wp-image-350" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-4" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-4.png" alt="" width="600" /></p>
<p>Начинаем работать с терминалом. Заходим на сервер</p>
<p><img class="alignnone  wp-image-345" title="1. hosting_redmine5@neon_ ~ (ssh)" src="http://locum.ru/blog/wp-content/uploads/2012/08/1.-hosting_redmine5@neon_-ssh.png" alt="" width="600" /></p>
<p>Переходим с свежесозданный каталог проекта</p>
<blockquote>
<pre>$ cd projects/redmine</pre>
</blockquote>
<p>Удаляем автоматически созданные файлы</p>
<blockquote>
<pre>$ rm -rf ./current/*</pre>
</blockquote>
<p>Загружаем <a href="http://rubyforge.org/frs/?group_id=1850" target="_blank">архив с исходниками</a> Redmine</p>
<blockquote>
<pre>$ wget http://rubyforge.org/frs/download.php/76259/redmine-2.0.3.tar.gz</pre>
</blockquote>
<p>Распаковываем архив</p>
<blockquote>
<pre>$ tar xvf redmine-2.0.3.tar.gz</pre>
</blockquote>
<p>Переписываем симлинк current на распакованный Redmine</p>
<blockquote>
<pre>$ rm current
$ ln -s redmine-2.0.3 current</pre>
</blockquote>
<h1>Подготавливаем окружение</h1>
<p>На этом этапе можно открыть в соседней вкладке <a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall" target="_blank">руководство по установке</a> Redmine и сверяться с ним, если что-то пойдет не так. Также рекомендуем прочитать нашу статью об <a title="Locum — новая сила с RVM" href="http://locum.ru/blog/hosting/rvm-new-force">особенностях работы с rvm</a>.</p>
<p>Переходим в каталог с исходниками</p>
<blockquote>
<pre>$ cd current</pre>
</blockquote>
<p>Подготавливаем бандл. Хотя Gemfile уже идет в поставке Redmine, хостинг Locum использует сервер приложений Unicorn для запуска проектов, поэтому в Gemfile необходимо внести изменения</p>
<blockquote>
<pre>$ echo 'gem "unicorn"' &gt;&gt; Gemfile</pre>
</blockquote>
<p>Теперь можно создать бандл</p>
<blockquote>
<pre>$ rvm use 1.9.3 do bundle install --path=~/projects/redmine/shared/gems --without development test</pre>
</blockquote>
<p>Этот процесс обычно занимает около пяти минут. Теперь нужно поправить конфигурацию базы данных для проекта. Узнаем параметры подключения к БД в панели управления хостингом. Заходим в «Услуги — Проекты», нажимаем «Подробнее» на проекте redmine, далее в графе «Ресурсы» нажимаем на ссылку с базой данных.</p>
<p><img class="alignnone  wp-image-351" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-5" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-5.png" alt="" width="600" /></p>
<p>Возвращаемся в терминал. Копируем файл конфигурации БД из поставки Redmine</p>
<blockquote>
<pre>$ cp config/database.yml.example config/database.yml</pre>
</blockquote>
<p>Редактируем файл с настройками, вписываем параметры подключения нашей базы</p>
<p><img class="alignnone  wp-image-346" title="1. hosting_redmine5@neon_ ~_projects_redmine_current (ssh)" src="http://locum.ru/blog/wp-content/uploads/2012/08/1.-hosting_redmine5@neon_-_projects_redmine_current-ssh.png" alt="" width="600" /></p>
<p>Обратите внимание на адаптер базы, для Ruby 1.9 это должен быть mysql2. Вторая частая ошибка — имя хоста. Обязательно внесите хост со страницы с параметрами подключения БД.</p>
<p>Сохраняем изменения: Ctrl+O, Ctrl+X.</p>
<h1>Выполняем настройку проекта</h1>
<p>Следуем инструкции по установке, выполняем таски, необходимые для запуска проекта. Особенность хостинга — все команды нужно оборачивать в rvm и bundle.</p>
<blockquote>
<pre>$ rvm use 1.9.3 do bundle exec rake generate_secret_token
$ RAILS_ENV=production rvm use 1.9.3 do bundle exec rake db:migrate</pre>
</blockquote>
<p>В нашем примере мы загрузим тестовые данные в проект</p>
<blockquote>
<pre>$ RAILS_ENV=production rvm use 1.9.3 do bundle exec rake redmine:load_default_data</pre>
</blockquote>
<p>Правим права доступа к каталогам</p>
<blockquote>
<pre>$ chmod -R 755 files log tmp</pre>
</blockquote>
<h1>Перезапускаем сервер приложений</h1>
<p>Установка практически завершена. Все, что осталось сделать, это перезапустить сервер приложений, обслуживающий наш проект. Из терминала выполняем команды:</p>
<blockquote>
<pre>$ kill -QUIT `cat /var/run/unicorn/hosting_redmine/redmine.redmine5.pid`
$ rvm use 1.9.3 do bundle exec unicorn_rails -Dc /etc/unicorn/redmine.redmine5.rb</pre>
</blockquote>
<p>Проверяем, что сервер приложений запустился и проект работает. В панели управления идем в «Услуги — Проекты», напротив проекта redmine нажимаем на ссылку с его доменом. Авторизуемся учетной записью по умолчанию admin/admin.</p>
<p><img class="alignnone  wp-image-347" title="Administration - Redmine" src="http://locum.ru/blog/wp-content/uploads/2012/08/Administration-Redmine.png" alt="" width="600" /></p>
<p>Можно приступать к настройке непосредственно самого Redmine.</p>
<p>Если что-то пошло не так, полезную информацию можно найти в логах в каталоге проекта ~/projects/current/log</p>
<ul>
<li><strong>production.log</strong> — основной журнал Redmine. Ошибки уровня приложения пишутся сюда.</li>
<li><strong>unicorn.stderr.log</strong> — журнал ошибок запуска Unicorn. Недостающие библиотеки и проблемы запуска сервера приложений запишутся сюда.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/locum-ror-redmine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Locum &#8212; новая сила с RVM</title>
		<link>http://locum.ru/blog/hosting/rvm-new-force</link>
		<comments>http://locum.ru/blog/hosting/rvm-new-force#comments</comments>
		<pubDate>Thu, 17 Nov 2011 13:58:36 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=295</guid>
		<description><![CDATA[Что случилось? Мы долго шли к этому, и все-таки это состоялось. Теперь по умолчанию используется rvm и bundler на всех новых проектах. Старые проекты не будут затронуты до тех пор, пока вы сами не начнете переключать версию ruby в настройках. Подумайте &#8212; стоит ли делать это, если все работает. Зачем? Хотя бы потому что мы [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2><img class="aligncenter size-full wp-image-320" title="rvm" src="http://locum.ru/blog/wp-content/uploads/2011/11/rvm.png" alt="" width="600" height="401" /></h2>
<h2></h2>
<h2>Что случилось?</h2>
<p>Мы долго шли к этому, и все-таки это состоялось. Теперь по умолчанию используется rvm и bundler на всех новых проектах. Старые проекты не будут затронуты до тех пор, пока вы сами не начнете переключать версию ruby в настройках. Подумайте &#8212; стоит ли делать это, если все работает.</p>
<p><span id="more-295"></span></p>
<h2>Зачем?</h2>
<p>Хотя бы потому что мы всегда стараемся предоставлять новые технологии, как только они становятся достаточно стабильны и удобны. К тому же поступило много просьб от наших пользователей о переходе на новую версию. Конечно, полный переход мы навязывать не стали, ведь есть много проектов, которые давно уже работают на 1.8.7, разработка не ведется и всех все устраивает, так зачем же ломать? Поэтому пришлось делать поддержку нескольких версий, ну а за одно и переключение между ними.</p>
<p>Ruby 1.8.7 уже устарел, тем более в новых версиях Ruby On Rails его поддержка со временем прекратится. Сейчас все наши пользователи могут использовать самые последние версии ruby, да и к тому же переключаться между ними. Переведите свой проект на 1.9.3 и наслаждайтесь производительностью. Конечно, перед этим необходимо установить нужные gem для этой версии ruby. Об этом читайте далее.</p>
<h2>Как теперь все работает?</h2>
<p>В качестве сервера приложений все так же используется unicorn &#8212; он довольно хорошо себя проявил за последнее время по сравнению со своими конкурентами. По крайней мере в разделяемой среде, где много проектов, мы пока не видим ему альтернативы.</p>
<p>Теперь для запуска процессов нужно будет указывать какая версия ruby вам нужна. Для этого используется <a href="http://beginrescueend.com/" target="_blank">Ruby Version Manager</a> или сокращенно &#8212; RVM. Наверняка многие из вас уже знакомы с этим средством переключения между различными версиями ruby. Если нет &#8212; обратитесь к официальной документации, она довольно проста и понятна.</p>
<h3>Как же теперь запускается unicorn?</h3>
<p>Для этого нужно выполнить следующую команду:</p>
<pre>rvm use &lt;версия&gt; do bundle exec unicorn_rails -Dc /etc/unicorn/&lt;имя_проекта&gt;.&lt;логин_в_панель_управления&gt;.rb</pre>
<p>Вместо &lt;версия&gt; нужно подставить одно из следующих значений, что и будет определять версию ruby, которая используется на данный момент:</p>
<ul>
<li>1.9.3</li>
<li>1.9.2</li>
<li>ree-1.8.7 (это <a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition</a>)</li>
<li>1.8.7</li>
</ul>
<h3>Перезагрузка кода</h3>
<p>Тут ничего не поменялось, так как нам нужно всего лишь отправить сигнал USR2 мастер-процессу, это делается и без rvm:</p>
<pre>kill -USR2 `cat /var/run/unicorn/&lt;имя пользователя на сервере&gt;/<span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">&lt;имя_проекта&gt;.&lt;логин_в_панель_управления&gt;.pid`</span></pre>
<p>Как всегда логи находятся в logs/unicorn.*.log, и если вдруг после отправки сигнала ничего не поменялось &#8212; это хороший повод заглянуть в них. Полная остановка unicorn делается аналогично, но сигнал будет QUIT, вместо USR2.</p>
<h2>Почему bundler а не rvm gemsets?</h2>
<p>Этот вопрос может возникнуть у знакомых с работой rvm пользователей. Ответ довольно просто &#8212; gemsets не предназначены для работы в разделяемой среде между несколькими пользователям &#8212; будут проблемы прав доступа. Тем более bundler стал стандартным средством ограничение области видимости gem а так же их установки и обновления, независимо от того используется вообще rvm или нет. Большинство проектов у нас используют bundler уже сейчас, а уж все новые так и тем более должны это делать.</p>
<h3>Куда ставить bundle?</h3>
<p>Мы рекомендуем ставить в ../../shared/gems, сделать это можно указав нужный параметр при выполнении команды (предполагается, что команда выполняется в RAILS_ROOT):</p>
<pre>bundle install --path ../../shared/gems</pre>
<p>Shared &#8212; чтобы не переустанавливать все gem после каждого деплоя, а просто вызывать bundle update.</p>
<h2>Как переключать версии?</h2>
<p>Войдите в раздел <a title="Мои проекты" href="https://locum.ru/projects" target="_blank">&#171;Услуги&#187;-&gt;&#187;Проекты&#187;</a>, далее нажмите на ссылку &#171;подробнее&#187; напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите поле с версией ruby, выберите интересующую вас версию и нажмите кнопку сохранения параметров.</p>
<h3>Что при этом произойдет?</h3>
<p>Важно понимать что действительно происходит при такой смене версии, чтобы избежать ошибок или хотя бы быстро суметь их исправить.</p>
<p>Итак, по умолчанию у нас запущен проект с ruby 1.9.3, если мы сменили версию, то вначале будет удалена директория ../../shared/gems, так как система предполагает, что ваши gem стоят там. Удалять директорию приходится потому, что bundler не может понять иногда, что <strong>native extension</strong> того или иного gem собран был для другой версии ruby и попытается использовать его не пересобирая, что приведет к ошибке и падению unicorn. Конкретно такая проблема наблюдается при смене версии с 1.9.3 до 1.9.2, если не удалить все gem и не поставить снова.</p>
<p>После этого в RAILS_ROOT (projectname/current) будет выполнена команда bundle install &#8212;path ../../shared/gems, а затем &#8212; полная остановка unicorn и запуск его с указанием новой версии ruby для rvm.</p>
<p>Чтобы в процессе этого не возникало никаких ошибок убедитесь что ваш Gemfile валиден и код проекта сможет работать с выбранной вами версией, потому что иногда синтаксис все-таки не полностью совместим. Об отличиях между разными версиями ruby вы всегда сможете прочесть в официальных документах и описаниях каждого из релизов.</p>
<h3>Почему не rvmrc?</h3>
<p>rvmrc &#8212; это всего лишь шелл-скрипт, использование которого рассчитано на определенные настройки пользовательской оболочки. Мы не можем гарантировать что у всех эти настройки соблюдаются, а уж тем более не хотим это навязывать. К тому же в нескольких уровнях rvmrc легко запутаться. Мы никак не ограничиваем вас в использовании rvmrc, но изначально не навязываем его. Вы всегда можете самостоятельно настроить и пользоваться им как вам будет удобно. Подробно о работе rvmrc читайте в <a href="http://beginrescueend.com/workflow/rvmrc/" target="_blank">документации по rvm</a>.</p>
<h3>Что по умолчанию?</h3>
<p>По умолчанию создается &#171;пустой&#187; rails-проект (по сути то, что получаем после rails new) с ruby 1.9.3 и rails 3.1.1</p>
<p>Кстати, не удивляйтесь, что ссылка &#171;About your application’s environment&#187; не работает &#8212; по идеологии Ruby On Rails она должна работать только в development-окружении, а на хостинге все запускается в production.</p>
<h2><strong>Что станет с Capistrano?</strong></h2>
<p>Как всегда мы предполагаем, что для размещения кода на сервере будет использоваться <a href="https://github.com/capistrano/capistrano/wiki/Documentation-v2.x" target="_blank">Capistrano</a>. RVM этому никак не помешает, просто мы теперь генерируем deploy.rb c учетом использования rvm.</p>
<p>Получить deploy.rb для каждого конкретного проекта можно в вашей панели управления услугами <a href="http://locum.ru" target="_blank">Locum.ru</a>. Войдите в раздел <a title="Мои проекты" href="https://locum.ru/projects" target="_blank">&#171;Услуги&#187;-&gt;&#187;Проекты&#187;</a>, далее нажмите на ссылку &#171;подробнее&#187; напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите кнопку для генерации deploy.rb, нажмите ее и получите содержание файла с учетом rvm.</p>
<p>Обычно для того, чтобы начать пользоваться Capistrano достаточно просто добавить в deploy.rb ссылку на вашу систему контроля версий, настроить авторизацию по ключам на наш сервер. а так же с нашего сервера к вашей системе контроля версий (git, svn, mercurial). Если вы нигде еще не разместили свой проект в контроле версий, то можете создать гит репозиторий на нашем сервере, об этом у нас есть <a href="http://locum.ru/blog/hosting/git-on-locum" target="_blank">соответствующая заметка в блоге</a>.</p>
<p>Имейте ввиду, что если вы измените версию ruby для проекта, вам необходимо будет поменять ее и в вашем deploy.rb.</p>
<h2>Что делать с моими старыми проектами?</h2>
<p>Решение остается полностью за вами. Если вы знаете что такое rvm и понимаете зачем вам нужно перейти на новую версию, или даже если понимаете, что это не имеет смысла но хочется (бывает такое, не правда ли?), вы всегда можете это сделать. А так &#8212; просто не трогайте их, с ними ничего не произошло.</p>
<h2>На что еще важно обратить внимание?</h2>
<p>Всегда помните, что все команды ваши теперь следует запускать в rvm и bundle, т.е. вместо</p>
<pre>rails c</pre>
<p>мы используем</p>
<pre>rvm use &lt;версия&gt; do bundle exec rails c</pre>
<p>И только так входим в консоль. Мы всегда рекомендуем вызывать команду явно, а не полагаться на rvmrc, фазу луны или еще что-нибудь. Так меньше вероятность совершить ошибку, потому что довольно легко забыть изменить версию в rvmrc и потом долго думать от чего не работает.</p>
<h2>Заключение</h2>
<p>На этом у нас все. Ждем ваших комментариев и отзывов, спасибо, что выбираете <a href="http://locum.ru">Locum.ru</a>. Мы же и впредь будем стараться радовать вас внедрением новых технологий.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/rvm-new-force/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Создаем Git-репозиторий на Locum.ru</title>
		<link>http://locum.ru/blog/hosting/git-on-locum</link>
		<comments>http://locum.ru/blog/hosting/git-on-locum#comments</comments>
		<pubDate>Mon, 29 Aug 2011 12:12:45 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=230</guid>
		<description><![CDATA[Использование системы контроля версий для управления кодом собственного проекта — прекрасное и рациональное решение, успешно применяемое тысячами команд разработчиков по всему миру. Главный вопрос, возникающий после выбора системы контроля версий: где же хранить репозиторий, в котором будет лежать полная история развития вашего проекта? В случае использования распределённой системы контроля версий Git и виртуального хостинга Locum, этот вопрос [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Использование системы контроля версий для управления кодом собственного проекта — прекрасное и рациональное решение, успешно применяемое тысячами команд разработчиков по всему миру.</p>
<p>Главный вопрос, возникающий после выбора системы контроля версий: где же хранить репозиторий, в котором будет лежать полная история развития вашего проекта?</p>
<p>В случае использования распределённой системы контроля версий <a href="http://git-scm.com/">Git</a> и виртуального хостинга <a href="http://locum.ru/">Locum</a>, этот вопрос можно решить буквально одним движением руки, не прибегая к использованию дорогостоящих тарифных планов GitHub или Assembla.<span id="more-230"></span></p>
<p>Итак, допустим, что у нас есть некоторый проект, репозиторий которого можно сохранить на хостинге Locum, и пусть он находится в каталоге <code>meet.git</code>.</p>
<p>Для начала узнаем название вашего сервера виртуального хостинга. Эту информацию вы можете посмотреть в нашей клиентской панели: вкладка «Услуги» → раздел «FTP и SSH».</p>
<p><a href="http://locum.ru/blog/wp-content/uploads/2011/08/account1.png"><img class="size-full wp-image-283 alignnone" title="account" src="http://locum.ru/blog/wp-content/uploads/2011/08/account1.png" alt="" width="714" height="298" /></a></p>
<p>Зайдём на сервер виртуального хостинга через SSH и подготовим окружение для работы Git.</p>
<pre><code>% ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru</code></pre>
<pre>% mkdir -p ~/git/meet.git</pre>
<pre>% cd ~/git/meet.git</pre>
<pre>% git init --bare</pre>
<p>Команда <code>git init</code> с ключом <code>--bare</code> создаст репозиторий в текущем каталоге, обеспечивая хранение исключительно служебной информации и блоков данных. При этом напрямую работать с сохранёнными файлами и каталогами будет невозможно: все данные проекта хранятся во внутреннем представлении Git.</p>
<p>Работа с репозиторием будет проводиться поверх протокола SSH, поэтому лучше избавиться от постоянного требования ввода пароля, добавив свой публичный SSH-ключ в список авторизованных ключей на сервере: достаточно просто скопировать ваш публичный SSH-ключ в конец файла <code>~/.ssh/authorized_keys</code>, а если такого файла не существует, то достаточно будет просто создать его.</p>
<p>На самом деле, всё это можно легко автоматизировать. Выполните данную команду на вашем <em>локальном</em> компьютере:</p>
<pre><code>% cat ~/.ssh/id_rsa.pub | ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru 'cat &gt;&gt; ~/.ssh/authorized_keys' </code></pre>
<p>На всякий случай, стоит удостовериться, что директория <code>.ssh</code> и список авторизованных ключей закрыты для чтения остальными пользователями. Это требование продиктовано реализацией OpenSSH и здравым смыслом. Для этого достаточно выполнить команду на <em>нашем</em> сервере:</p>
<pre><code>% ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru 'chmod 0700 ~/.ssh' </code></pre>
<p>Отлично, теперь работа с нашими серверами при помощи SSH станет гораздо проще и комфортнее, без какого-либо ущерба безопасности. Главное — мы выполнили все приготовления для функционирования Git.</p>
<p>Создадим в директории вашего проекта на <em>локальном</em> компьютере Git-репозиторий:</p>
<pre><code>% cd meet.git</code></pre>
<pre><code>% git init </code></pre>
<p>Добавим в учёт все файлы вашего проекта:</p>
<pre><code>% git add . </code></pre>
<p>Пока не поздно, можно сделать ревизию состояния всех файлов:</p>
<pre><code>% git status </code></pre>
<p>Необходимо принять изменения (выполнить commit). Каждое множество изменений обязано сопровождаться хотя бы кратким описанием. Поскольку это наш первый коммит, то описание будет соответствующим:</p>
<pre><code>% git commit -m 'initial commit' </code></pre>
<p>Отлично, теперь на вашем локальном компьютере выполняется полноценный контроль версий. С этого момента вы сможете отслеживать любые изменения в коде вашего проекта, что позволяет значительно облегчить процесс разработки и, в особенности, отладки.</p>
<p>Для того, чтобы Git обеспечил согласование вашего локального репозитория с его братом-близнецом на сервере Locum, нужно определить точку синхронизации. Это не является обязательным пунктом, ведь оба репозитория являются полноценными, и возможность согласования — всего лишь приятная возможность. В системе Git точки синхронизации называются <code>remotes</code> и являются именованными. Как правило, единственная точка синхронизации носит гордое имя <code>origin</code>.</p>
<pre><code>% git remote add origin ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git </code></pre>
<p>Теперь попробуем впервые отправить наши данные на сервер. В терминологии Git это зовётся <code>push</code>. При этом необходимо указать целевую точку синхронизации и название ветке, в которую публикуются изменения. По-умолчанию все данные в Git лежат в ветке <code>master</code>.</p>
<pre><code>% git push -u origin master</code></pre>
<pre><code>Counting objects: 3, done.</code></pre>
<pre><code>Writing objects: 100% (3/3), 211 bytes, done.</code></pre>
<pre><code>Total 3 (delta 0), reused 0 (delta 0)</code></pre>
<pre><code>To ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git</code></pre>
<pre><code>* [new branch] master -&gt; master</code></pre>
<pre><code>Branch master set up to track remote branch master from origin. </code></pre>
<p>Команда <code>push</code> вызвана с ключом <code>-u</code>, который заставляет Git запомнить, что вы предпочитаете делать <code>push</code> и обратный ему процесс <code>pull</code> в ветке <code>master</code> точки синхронизации <code>origin</code>. С этого момента никаких дополнительных параметров для команд <code>git push</code> и <code>git pull</code> вам не понадобится.</p>
<p>Кстати, если после выполнения последней команды вы увидели аналогичный результат в вашем терминале, то Git функционирует корректно. Для того, чтобы это проверить, попробуем выполнить клонирование (скачивание) новоиспечённого репозитария. Попробуйте выполнить эту команду, находясь в какой-либо директории, не содержащей каталог <code>meet-git</code>:</p>
<pre><code>% git clone 'ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git'</code></pre>
<pre><code>Cloning into meet-git...</code></pre>
<pre><code>remote: Counting objects: 3, done.</code></pre>
<pre><code>remote: Total 3 (delta 0), reused 0 (delta 0)</code></pre>
<pre><code>Receiving objects: 100% (3/3), done. </code></pre>
<p>Удалось? Поздравляем, у вас теперь есть собственный приватный Git-репозиторий, в котором вы можете самостоятельно заниматься разработкой вашего проекта, не беспокоясь о сохранности исходного кода. Удачи!</p>
<p>Для дальнейшего чтения мы можем посоветовать <a href="http://progit.org/book/ru/">русскоязычный перевод книги Pro Git</a>.</p>
<p>P.S. Кстати, если вам нужно подключить к репозиторию своих сотрудников, то просто пропишите их публичные SSH-ключи в конец списка авторизованных ключей (см. выше) и попросите выполнить git clone с известным вам адресом.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/git-on-locum/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Используем bundler на locum.ru</title>
		<link>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru</link>
		<comments>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru#comments</comments>
		<pubDate>Mon, 25 Jul 2011 08:51:47 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=212</guid>
		<description><![CDATA[Странные сообщения об ошибках Если вы читаете эту статью, то вполне вероятно вы видели такую ошибку, несмотря на то, что gem  с нужной версией ruby on rails у вас установлен. Missing the Rails 2.3.8 gem. Please `gem install -v=2.3.8 rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2><a href="http://locum.ru/blog/?p=212"><br />
<img class="size-full wp-image-247 aligncenter" title="Используем bundler на locum.ru" src="http://locum.ru/blog/wp-content/uploads/2011/07/gemfile1.png" alt="" width="585" height="194" /></a></h2>
<h2>Странные сообщения об ошибках</h2>
<p>Если вы читаете эту статью, то вполне вероятно вы видели такую ошибку, несмотря на то, что gem  с нужной версией ruby on rails у вас установлен.</p>
<blockquote><p>Missing the Rails 2.3.8 gem. Please `gem install -v=2.3.8 rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.</p></blockquote>
<p>Или может быть такую?</p>
<blockquote><p>You have already activated ** rack** 1.1.0, but your Gemfile requires rack 1.0.1. Consider using bundle exec. (Gem::LoadError)</p></blockquote>
<p>Версии, указанные в примерах могут, конечно, отличаться, но сути это не меняет.  В этой статье я объясню от чего такое возникает и как этого избежать.</p>
<p><span id="more-212"></span></p>
<h2>Rack и проблемы, связанные с ним</h2>
<p>Всему виной rack, точнее несоответствие его версии тому, что хочет видеть rails. Причем первое сообщение об ошибке очень странное, никаким образом не упоминает rack и даже никак не намекает на него, но давайте посмотрим в код, который выводит это сообщение. Открывает config/boot.rb, и видим:</p>
<pre>class GemBoot &lt; Boot
   def load_initializer
       self.class.load_rubygems
       load_rails_gem
       require 'initializer'
   end
   def load_rails_gem
       if version = self.class.gem_version
          gem 'rails', version
      else
          gem 'rails'
      end
      rescue Gem::LoadError =&gt; load_error
          $stderr.puts %(Missing the Rails #{version} gem.</pre>
<pre>          Please `gem install -v=#{version} rails`,</pre>
<pre>          update your RAILS_GEM_VERSION setting in config/environment.rb</pre>
<pre>          for the Rails version you do have installed,</pre>
<pre>          or comment out RAILS_GEM_VERSION</pre>
<pre>          to use the latest version installed.)</pre>
<pre>          exit 1
      end</pre>
<p><span style="font-style: normal;">Тут-то и становится понятно, что это сообщение выводится не только когда не удается загрузить именно rails, но и в любом другом случае, когда возбуждается исключение <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">Gem::LoadError. </span>Стоит отметить, что в последующих версиях rails (где-то после 2.3.10), сообщение об ошибке стало более информативно, и пользователи перестали предпринимать отчаянные попытки установить нужный gem несколько раз подряд, до этого видимо авторы rails не подозревали, что такое исключение может возникнуть в иной ситуации.</span></p>
<p><span style="font-style: normal;">Вторая ошибка уже более информативна и подсказывает нам, что дело тут в rack, как это на самом деле обстоит и в первом случае. Суть в том, что отличный сервер для rails &#8212; unicorn, использует rack для своей работы. Современные версии Ruby On Rails так же используют rack для своей работы, и необходимо, чтобы они использовали одну и ту же версию. Иначе будем получать такие вот ошибки, потому что вызов activate! у rack во время загрузки rails не пройдет.</span></p>
<p><span style="font-style: normal;">Очевидным решением было бы добавить в config/environment.rb строку следующего вида:</span></p>
<pre><span style="font-style: normal;">config.gem 'rack', '=1.0.1'</span></pre>
<p>Однако, попробовавшие это решение будут разочарованы &#8212; ничего не поменяется. Проблема в том, что unicorn вначале запускается сам, загружает свой код и активирует rack. Причем написан он довольно грамотно и активировать будет самую новую версию, которая есть, работает он с ней нормально. И уже только после этого unicorn будет пытаться загрузить Ruby On Rails, только тогда считается environment.rb и эта строка, но более новый rack уже будет активирован.</p>
<p>Еще одним простым решением будет просто удалить локальную инсталляцию более нового rack, оставив только нужную нашему rails-проекту версию, но такое решение подходит лишь для тех, у кого один проект, или на всех проектах нужен один и тот же rack. Если у вас есть проекты, например на rails 2.3.8, 2.3.11 и 3.0.2 &#8212; вам потребуется для каждого из них своя версия rack и вариант с удалением не подойдет.</p>
<p>Тут на выручку приходит bundler.</p>
<h2>Решаем проблему с помощью bundle</h2>
<p>Bundler &#8212; это средство управления различными окружениями gem. Он легко позволяет создать изолированную инсталляцию gem для конкретного проекта, чтобы остальные, установленные на локальной машине gem не мешали работать. Так же при помощи bundler удобно устанавливать большие пачки gem в системные или иные директории. На всех серверах <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a> bundler уже установлен. Если при попытке выполнить команду bundle вы получаете ошибку:</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">bash: bundle: команда не найдена</span></p>
<p>То убедитесь, что у вас правильно настроена переменная окружения PATH. Мы рекомендуем устанавливать следующее значение PATH=&#187;/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/$HOME/.gem/ruby/1.8/bin:/var/lib/gems/1.8/bin&#187;.</p>
<p>Подробнее о том, как работать с bundler и что он позволяет вы всегда сможете узнать в официальной документации, тут же мы кратко рассмотрим только ограничение версий нужных нам gem. Итак, для начала создаем Gemfile. Gemfile &#8212; это такой список используемых в проекте gem, с указанием нужных версий. Если версию не указать &#8212; будет доступна самая последняя из установленных. Важно перечислить все gem, необходимые для работы проекта, так как то, что не указано в Gemfile, не будет доступно из кода ни rails, ни unicorn. Ровно по этой же причине необходимо добавить сам unicorn в список. Gemfile должен находиться в той директории, откуда запускается unicorn, т.е. в нашем случае это current в каталоге capistrano, RAILS_ROOT. Если вы используете систему контроля версий, рекомендуем поместить Gemfile  в нее, так как он будет нужен для каждого деплоя.</p>
<p>Вот пример Gemfile для запуска redmine из trunk:</p>
<pre>source "http://rubygems.org"
gem "unicorn"
gem "rack", "1.1.0"
gem "rails", "2.3.11"
gem "rake", "0.8.7"
gem "i18n", "0.4.2"
gem "rubytree", "0.5.2", :require =&gt; "tree"
gem "RedCloth", "~&gt;4.2.3", :require =&gt; "redcloth" # for CodeRay
gem "mysql"
gem "coderay", "~&gt;0.9.7"</pre>
<p>Сохранив такое содержимое рекомендуем выполняем следующие команды (все запускается из директории current):</p>
<pre>bundle install --path ../../shared/gems</pre>
<pre>kill -QUIT `cat /var/run/unicorn/имя_пользователя_на_сервере/имя_проекта.логин_в_панели_управления.pid`</pre>
<pre>bundle exec unicorn_rails -Dc /etc/unicorn/имя_проекта.логин_в_панели_управления.rb</pre>
<p>Первая команда должна установить все gem с нужными версиями (просто так, на всякий случай), важно не забывать про ключ &#8212;path, потому что иначе bundler будет пытаться установить все в системную директорию и требовать с вас пароль на sudo. Вторая — остановить уже запущенный экземпляр unicorn для проекта. Если он упал ранее по причине ошибки &#8212; ничего страшного, PID-file просто будет отсутствовать. Последняя команда стартует unicorn в созданном нами окружении bundle. После этого все должно работать, перезагрузка кода так же выполняется отправлением сигнала USR2. Так же для этого есть специальная кнопка в панели управления хостингом <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a>.</p>
<p>Если вы используете capistrano, как мы всем рекомендуем, то нужно добавить вызов bundle exec перед командой запуска unicorn в ваш deploy.rb.</p>
<p>Иногда при работе со старыми версиями Rails возникает ошибка, примерно следующего вида:</p>
<blockquote><p>uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)</p></blockquote>
<p>Эта проблема не связана с bundle и rack, но возникает не редко, связанно это с изменениями в новых версиях rubygems, на которые не рассчитаны старые версии rails. Решается проблема добавлением вызова <strong>require &#8216;thread&#8217; </strong>в config/environment.rb или config/boot.rb. Спорный вопрос в какой из этих файлов идеологически правильнее добавить вызов, но сработают оба варианта. Кто имеет четкое мнение по этому вопросу &#8212; напишите, пожалуйста, в комментариях. Что до меня, так идеологически правильным я вижу только одно решение &#8212; обновить версию rails до такой, где ошибки не возникает, а все остальное примерно одинаково костыль, но костыль абсолютно рабочий.</p>
<h2>Подведем итог</h2>
<p>Bundler &#8212; действительно удобное средство для решения таких проблем. Любая система установки дополнительных пакетов, вроде rubygems, которая позволяет держать много версий одной и той же библиотеки, в итоге должна столкнуться с проблемами конфликтов версий и как-то их решать. Недостатком является только то, что саму версию rubygems выбрать при помощи bundler никак не получится, но это нужно уже совсем редко, в таких ситуациях придется скорее всего решать проблему при помощи RVM. Процесс деплоя с bundler не сильно усложнился, тем более все это так же легко автоматизируется с Capistrano.  Ограничивать версию разных gem для rails можно было и раньше, используя вызовы config.gem в environment.rb и хорошим тоном всегда считалось перечислять там нужные gem. Сейчас просто ограничивается набор gem не только для rails, но и для сервера приложений, а вызов bundle install просто заменяет нам старое rake gems:install.</p>
<p>На этом прощаемся с вами, всем удачи в развитии своих проектов и их размещении на <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a>. Кстати, кто-нибудь сталкивался в своей практике с необходимостью ограничить версию чего-то еще не только для самого rails-приложения, но и для сервера, кроме Rack? Если да &#8212; напишите, пожалуйста, об этом в комментариях. Пока по общению с нашими клиентами и собственной практике разработки и деплоя мы не встречались с другими примерами.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Разворачиваем rails-приложение правильным и удобным методом</title>
		<link>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b</link>
		<comments>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b#comments</comments>
		<pubDate>Fri, 28 Jan 2011 14:38:27 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[unicorn]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=187</guid>
		<description><![CDATA[В этой статье я расскажу как проще и удобнее всего разворачивать приложения на ruby on rails на нашем хостинге. Используя эту инструкцию вы сэкономите время и легко обнаружите ошибки, которые могут возникать при развертывании Rails-приложений. Так же будет информация о самых частых проблемах и о том, как их избежать. Описанный метод так же подходит и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a rel="attachment wp-att-201" href="http://blog.locum.ru/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b/attachment/rails"><img class="aligncenter size-full wp-image-201" title="rails" src="http://blog.locum.ru/wp-content/uploads/2011/01/rails.png" alt="" width="600" height="401" /></a></p>
<p>В этой статье я расскажу как проще и удобнее всего разворачивать приложения на ruby on rails на нашем хостинге. Используя эту инструкцию вы сэкономите время и легко обнаружите ошибки, которые могут возникать при развертывании Rails-приложений. Так же будет информация о самых частых проблемах и о том, как их избежать. Описанный метод так же подходит и для Rack-приложений, с некоторыми оговорками и незначительными изменениями в конфигурационных файлах.<span id="more-187"></span></p>
<h2>Сервер приложений.</h2>
<p>На серверах locum.ru для Rails-приложений по умолчанию используется <a href="http://unicorn.bogomips.org" target="_blank">unicorn</a>. По запросу можно создать проект, который будет использовать <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a>, но обычно это не требуется. Unicorn зарекомендовал себя как быстрый и очень гибкий в использовании сервер для rails и rack.</p>
<h2>Определяем нужную версию Rails.</h2>
<p>Итак, мы решили разместить приложение на ruby on rails на сервере locum.ru. Первое что нам нужно знать &#8212; версию Ruby On Rails, которую использует наше приложение. Если это Rails ветки 2.3 и версия выше 2.3.5 &#8212; дополнительные действия не нужны. Можно сразу переходить к следующему шагу. Приложение на Rails 2.3.5 и старше скорее всего не получится запустить на Unicorn, из-за несовместимости этих версий с нужной версией <a href="http://rack.rubyforge.org/" target="_blank">Rack</a>. Стоит отметить, что для большинства приложений будет достаточно просто поменять версию фреймворка на 2.3.6 в config/environment.rb, чтобы все заработало на unicorn, например с популярным issue-трекером <a href="http://redmine.org" target="_blank">Redmine</a> это легко решает проблему запуска.</p>
<p>Если наше приложение использует rails 3.X, первым делом следует войти по ssh на сервер и установить соответствующий gem. Для этого нужно выполнить команду:</p>
<pre>gem install rails --user-install --no-rdoc --no-ri</pre>
<p>Если хочется использовать <a href="http://gembundler.com/" target="_blank">Bundler</a> и устанавливать gem вне стандартного пути &#171;~/.gem&#187;,  то нужно установить хотя бы rack версии 1.2 в стандартный путь для gem аналогичной командой:</p>
<pre>gem install raсk --user-install --no-rdoc --no-ri</pre>
<p>Дело в том, что unicorn при старте запускается вне bundle, поэтому он будет использовать rack 1.1, и не сможет запустить приложение, требующее более новую версию rack, так же как и не сможет заменить в процесс работы уже активированную версию rack на более новую. Это является особенностью работы rack и часто приводит к ошибкам, если не помнить о ней.</p>
<h2>Создание проекта из панели управления.</h2>
<p>Теперь нужно зайти в панель управления и создать проект для нашего приложения. Заходим в раздел &#171;проекты&#187;, создаем новый проект с типом Ruby On Rails. Если планируется использовать отличную от MySQL базу данных, то отключаем пункт &#171;создать базу данных&#187;, так как по умолчанию создается база именно этого типа.</p>
<h2>Размещение кода на сервере.</h2>
<p>Создание проекта занимает некоторое время, но после этого у вас на сервер в директории projects появится директория с именем проекта, а в ней стандартная структура каталогов для <a href="http://capify.org/" target="_blank">Сapistrano</a>.  Удобнее всего использовать именно capistrano для загрузки кода на сервер. Это стандартное средство, которое позволяет легко обновлять версию кода, перезапускать сервер приложений, а так же многое другое. Пример конфигурационного файла, адаптированного для использования с нашим хостингом и unicorn можно скачать по следующей ссылке: <a href="http://locum.ru/examples/deploy.rb">http://locum.ru/examples/deploy.rb</a></p>
<p>Заменив в примере нужные значения вы сможете легко загрузить ваш проект на сервер и перезапустить unicorn командой &#171;cap deploy&#187;.</p>
<p>Если не хочется использовать capistrano &#8212; это не проблема, можно обойтись и без  нее. Структура директорий такова:</p>
<pre>имя проекта/
   current -&gt; текущий каталог для unicorn, является символической ссылкой на одну из версий в релизах
   releases/ -&gt; директория с версиям приложения
       initial_release/ -&gt; созданное по умолчанию приложение</pre>
<p>Вам нужно разместить код вашего приложения в директории внутри releases, имя выберите произвольно, а затем изменить ссылку current, чтобы она указывала на директорию с вашим приложением, вместо initial_release, сделать это можно командой ln -sf по ssh.</p>
<p>Типичной ошибкой является удаление директории initial_release или всех файлов в ней.  Дело в том, что у нас unicorn использует очень удобный метод перезапуска. Когда приходит команда на перезагрузку сервера, запускается новый экземпляр unicorn, загружается код и затем, если все в порядке &#8212; новый экземпляр замещает предыдущий, а старый завершается. Сам процесс немного сложнее, но полное описание работы unicorn выходит за рамки этой статьи. Так как старый процесс был запущен в то время, когда ссылка current указывала на каталог initial_release, то и лог пишется там. Если новый экземпляр unicorn не сможет запуститься, то информацию об ошибке следует искать в файле log/unicorn.stderr.log именно по старому пути. Если эти файлы удалить, unicorn будет все еще пытаться писать по открытому заранее дескриптору, но прочитать мы эти данные уже не сможем. Если директория initial_release вам чем-то мешает, то вы всегда сможете удалить ее позже, после того как эти файлы уже перестанут использоваться.</p>
<p>После того, как файлы размещены и ссылка current изменена следует зайти в подробности проекта в панели управления хостингом и нажать кнопку &#171;перезагрузить сервер&#187;.  В случае использования capistrano, сервер будет перезапущен автоматически. Через минуту вы можете зайти на URL вашего проекта и увидеть свое приложение в работе.</p>
<h2>Распространенные ошибки, где их искать и как избежать.</h2>
<p>Опыт показывает, что самой распространенной проблемой при размещении rails-приложений на нашем хостинге является  нехватка того или иного gem или же нужной его версии. Этого можно избежать, если описывать все, необходимые для работы кода gem в environment.rb и выполнять rake gems:install перед перезагрузкой unicorn с новым кодом. Так же можно использовать bundler и выполнять bundle install. Имейте ввиду, что команда bundle по умолчанию будет пытаться установить gem в системные директории, что конечно же не удастся сделать без root-доступа. Поэтому не забывайте всегда использовать ключ &#8212;path с указанием пути, куда вы хотите устанавливать локальные gem. Можно делать это, например, в директорию &#171;~/.gem&#187;.</p>
<p>Так же, некоторые пользователи банально забывают внести нужные настройки для базы данных в database.yml. Не забывайте, что на нашем хостинге все проекты запускаются в режиме &#8216;production&#8217;, а значит и настройки нужно вносить в соответствующей секции database.yml</p>
<p>Что делать, если после перезагрузки кода unicorn на сайте проекта ничего не поменялось? Это значит, что новый экземпляр unicorn не смог запуститься по какой-то причине. Для выяснения причины нужно посмотреть последние строки файла log/unicorn.stderr.log в той директории, где запущена версия unicorn, которая осталась работать. При загрузке нового приложения это будет releases/initial_release.</p>
<p>Еще одна частая ошибка, это попытка зайти на домен, созданный для проекта сразу после появления его в панели управления. Дело в том, что для перезагрузки конфигурации DNS-сервера требуется некоторое время, потому лучше подождать несколько минут. В противном случае можно оказаться в неприятной ситуации. DNS сервер вашего провайдера может кэшировать ответы на запросы, если вы зайдете слишком рано и получите ответ, что такого домена нет, и это попадет в кэш, может получиться, что после того, как наш DNS сервер уже начнет сообщать IP-адрес этого домена, вы  все еще будете получать ошибочный ответ из кэша.</p>
<p>Коллектив Locum.ru желает успеха всем нашим пользователям в разработке и размещении проектов.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Выбор сервера приложений для rails</title>
		<link>http://locum.ru/blog/hosting/app_server</link>
		<comments>http://locum.ru/blog/hosting/app_server#comments</comments>
		<pubDate>Mon, 25 Jan 2010 15:51:36 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[application server]]></category>
		<category><![CDATA[mongrel]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[thin]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=116</guid>
		<description><![CDATA[У веб-разработчиков часто возникает вопрос: какой же метод запуска rails приложений выбрать? Попробуем рассмотреть плюсы и минусы каждого из них. Сразу оговоримся, что вариант jruby (запуск ruby кода в jvm) оставим без внимания, как специфический и для нашего проекта не очень интересный. Mongrel Первый метод, что приходит в голову, &#8212; Mongrel cluster. В основном, именно [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.locum.ru/hosting/app_server"><img class="size-full wp-image-132 aligncenter" title="Locum: Выбор сервера приложений для Rails" src="http://blog.locum.ru/wp-content/uploads/2010/01/Fotolia_2796388_M.png" alt="Locum: Выбор сервера приложений для Rails" width="600" height="395" /></a></p>
<p style="text-align: left;">У веб-разработчиков часто возникает вопрос: какой же метод запуска rails приложений выбрать? Попробуем рассмотреть плюсы и минусы каждого из них. Сразу оговоримся, что вариант <a href="http://jruby.org/">jruby</a> (запуск ruby кода в jvm) оставим без внимания, как специфический и для нашего проекта не очень интересный.<br />
<span id="more-116"></span></p>
<h3>Mongrel</h3>
<p style="text-align: left;">Первый метод, что приходит в голову, &#8212; <a href="http://mongrel.rubyforge.org/">Mongrel cluster</a>. В основном, именно он описан в литературе по ruby on rails, он же используется для запуска rails-кода в режиме разработки (development environment). Все, что необходимо для запуска rails с mongrel cluster уже разработано и идет в стандартной поставке, также готовы и методы для <a href="http://www.capify.org/">capistrano</a>. Казалось бы: бери, да пользуйся! Но, как говорится, без ложки дегтя тут не обходится.<br />
Как же работает rails-приложение, запущенное при помощи mongrel cluster? Слово cluster в данном случае использовано не случайно. Дело в том, что сервер mongrel умеет обрабатывать одновременно только один запрос, поэтому запускается некоторое количество серверов на разных портах. Чтобы скрыть эти нюансы от посетителей сайта, используется прокси-сервер. Он распределяет между серверами mongrel запросы для своевременной их обработки. Каждый mongrel — это процесс, который выполняется независимо от своих «собратьев». Поскольку все они работают с одной базой данных и одной версией кода, запросы могут приходить на любой из них. Никаких проблем это не вызывает. Если ваш сервер перестал справляться с нагрузкой, вы легко можете добавить к нему еще один, запустив на нем еще некоторое количество серверов mongrel. Изменений в коде приложения для такой кластеризации делать не придется, ведь ruby on rails изначально рассчитан на данный подход. Единственное, придется обеспечить всем серверам доступ к хранилищу сессионных данных. Это могут быть и СУБД, и <a href="http://www.danga.com/memcached/">memcached</a>, и примонтированная сетевая файловая система (NFS). Такое действие необходимо для того, чтобы при случайном распределении запросов по серверам сессия пользователя не терялась, т.к. первый его запрос может обрабатывать один mongrel, второй — уже другой и т.д.<br />
А вот теперь пора поговорить о минусах. Самый очевидный из них заключается в том, что каждый из серверов mongrel в силу своей автономности будет загружать в память собственную копию кода rails, кода приложения и всех необходимых библиотек. Вот вам и обратная сторона простого кода сервера и легкой возможности кластеризации. При среднем проекте каждый mongrel запросто потребляет около 100М памяти. И если запускать на сайт по три сервера mongrel (т.к. одного явно недостаточно), то память будет потребляться в очень больших количествах. Да, сегодня 300-500 мегабайт памяти – цифра не слишком серьезная. Однако не стоит забывать, что речь идет о разделяемом хостинге, а значит число таких сайтов будет измеряться сотнями. В такой ситуации потребление памяти действительно становится проблемой.</p>
<p style="text-align: left;">
<h3>Thin</h3>
<p style="text-align: left;">Еще одной слабой стороной сервера приложений mongrel является то, что он обязательно занимает один порт. Это создает возможность для различных коллизий и трудно отслеживаемых ошибок. Например, пользователю A выделены порты 3001, 3002 и 3003. Он остановил на время свой mongrel-кластер, а пользователь B в это время взял и запустил на 3001-м порту собственный. При старте один из серверов mongrel пользователя A обязательно упадет, так как порт, который он собирается прослушивать, уже занят другим процессом. Пользователь A ничего не сможет с этим сделать, ведь он никак не может остановить процесс пользователя B. А тем временем один из трех запросов на сайт пользователя A будет попадать на чужой mongrel, так как фронтенд настроен именно на эти порты. Конечно, обратившись к администрации сервера, пользователь A решит свои проблемы, но осадочек останется&#8230; Есть ли выход? Дать определенному пользователю возможность прослушивать только конкретный список портов средствами современных операционных систем не так-то просто, все это лишь еще раз усложнит общую систему. Хорошим решением было бы слушать не порт, а unix сокет, но mongrel не обладает такой возможностью.Еще один известный метод запуска rails приложений – <a href="http://code.macournoyer.com/thin/">thin</a>. Он разработан с использованием <a href="http://rubyeventmachine.com/">EventMachine</a> и <a href="http://rack.rubyforge.org/">Rack</a>, достаточно хорошо оптимизирован. Это делает его более производительным сервером, чем mongrel. Thin обладает теми же что и mongrel особенностями в вопросах одновременной обработки запросов и кластеризации. В сравнении с mongrel он потребляет меньше памяти, но по-прежнему загружает всю копию rails для каждого экземпляра. Большим и важным для хостеров плюсом thin является то, что он умеет «слушать» unix-сокеты вместо стандартных tcp портов. Это позволяет избежать неприятной проблемы, что была описана в примере для сервера mongrel. Ограничивать права на сокет, по сути являющийся файлом с атрибутами чтения и записи, гораздо проще и удобнее. К тому же работа через unix-сокеты ведется быстрее из-за отсутствия накладных расходов на tcp/ip стэк. Мы по возможности рекомендуем использовать unix-сокеты вместо tcp портов. Это действительно положительно сказывается на скорости работы приложения. В качестве подтверждения &#8212; <a href="http://macournoyer.wordpress.com/2008/01/26/get-intimate-with-your-load-balancer-tonight/">ссылка</a> на некоторые результаты сравнения серверов thin и mongrel с точки зрения производительности.<br />
Настройка и запуск thin не сложнее чем у сервера mongrel, конфигурационный файл по-прежнему представляет из себя YML. Для capistrano так же легко добавить нужный код в deploy.rb, чтобы перезапуск серверов thin происходил автоматически при выкладывании новой версии кода. С thin вместо mongrel хостеру (а значит и пользователям) живется действительно легче. Однако проблема большого потребления памяти все еще остается. Ведь получается, что для каждого проекта независимо от текущего количества запросов будет запущено несколько серверов thin, а каждый из них поместит в память весь код rails и самого приложения.</p>
<h3>Passenger</h3>
<p style="text-align: left;">Попробуем решить проблему с памятью при помощи <a href="http://www.modrails.com/">Phusion Passenger</a>, известного также как mod_rails или mod_rack. Passenger — это модуль для популярных сегодня веб-серверов Apache и Nginx. Он изначально создан для запуска большого количества rails приложений. Passenger грамотно распределяет ресурсы и потребляет память по мере необходимости. Проблем с прослушиванием большого количества портов разными процессами тоже, по понятным причинам, нет. При этом в конфигурационном файле можно указать интерпретатор ruby, который будет использоваться для запуска rails. Это при желании позволит использовать <a href="http://www.rubyenterpriseedition.com/">ruby enterprise edition</a> и выиграть в потреблении памяти еще до 30%. Для пользователя все опять же остается достаточно прозрачно. Для перезагрузки кода приложения теперь нужно просто создать файл tmp/restart.txt или изменить его время последнего доступа. Это легко автоматизируется средствами capistrano. Каждый проект до сих пор имеет возможность использовать свою версию rails, достаточно лишь установить необходимый gem. Passenger устанавливается при помощи rubygems, затем вам нужно будет скомпилировать модуль для вашего веб-сервера и включить его в сборку. По умолчанию код rails будет запускаться с правами пользователя, который владеет файлом environment.rb. Это поведение вполне удобно для хостера, но при желании его можно изменить соответствующими настройками, описанными в документации. Возможность кластеризации при этом остается, просто уже не диктуется необходимостью: ведь никто не мешает поставить несколько веб-серверов, на которых работает passenger за балансирующим прокси.<br />
Phusion Passenger умеет работать не только с rails, но и с любым приложением, которое следует rack-интерфейсу. Это позволяет запускать код, разработанный с использованием фреймворков <a href="http://merbivore.com/">Merb</a>, <a href="http://www.sinatrarb.com/">Sinatra</a> и других rack-приложений. Мы выбрали для себя связку Nginx + Passenger как самую выгодную по производительности и удобству для нас и наших пользователей. Использование модуля Nginx вместо Apache обусловлено нежеланием поддерживать лишнее звено в цепи запуска rails приложений без явной необходимости. Ведь чем проще система, тем удобнее ее поддерживать, а значит и работа будет стабильнее.</p>
<h3>Смотрите также:</h3>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/19drAMpDnxg&amp;hl=ru_RU&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/19drAMpDnxg&amp;hl=ru_RU&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div id="__ss_2337409" style="width: 510px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Антон Веснин - &quot;Обзорное сравнение серверов приложений ruby-on-rails&quot;" href="http://www.slideshare.net/railsclub.russian/rubyonrails-2337409">Презентация &#8212; &#171;Обзорное сравнение серверов приложений ruby-on-rails&#187;</a></div>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/app_server/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Новогоднее обращение</title>
		<link>http://locum.ru/blog/news/new_year</link>
		<comments>http://locum.ru/blog/news/new_year#comments</comments>
		<pubDate>Mon, 28 Dec 2009 14:20:41 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Компания]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=121</guid>
		<description><![CDATA[Дорогие друзья! Дружная команда Locum поздравляет вас с Новым годом! Уходящий 2009-й год ознаменовался запуском нашего проекта в широкую эксплуатацию. Сегодня, в предновогоднюю пору, уже можно подвести некоторые итоги работы Locum и поделиться планами на будущее. Итак, приступим. За десять месяцев, прошедших со старта проекта, мы исправили более 200 ошибок и учли около 500  пожеланий [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;"><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } --><span lang="ru-RU"><a href="http://blog.locum.ru/news/new_year"><img class="aligncenter size-full wp-image-126" title="123" src="http://blog.locum.ru/wp-content/uploads/2009/12/123.png" alt="123" width="600" height="300" /></a><br />
</span></p>
<p style="text-align: left;"><span lang="ru-RU">Дорогие друзья!</span> Дружная команда Locum поздравляет вас с Новым годом!<span lang="ru-RU"> </span></p>
<p style="text-align: left;">Уходящий 2009-й год ознаменовался запуском нашего проекта в широкую эксплуатацию. Сегодня, в предновогоднюю пору, уже можно подвести некоторые итоги работы Locum и поделиться планами на будущее. Итак, приступим. <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>За десять месяцев, прошедших со старта проекта, мы исправили более 200 ошибок и учли около 500  пожеланий клиентов.  Мы <span lang="ru-RU">постоянно</span> стремимся обеспечивать  самые высокие скорости работы ваших проектов. Среднее время непрерывной работы наших серверов составило около 50 дней, а их доступность &#8212; 99,56%.</p>
<p>Для вашего удобства мы запланировали и внедрили такие замечательные вещи как возможность размещения Django-проектов, Passenger для обработки Ruby on rails проектов, а также  услугу виртуального <a href="http://locum.ru/public/virtual_servers" target="_blank">выделенного сервера</a> на базе технологии <span lang="en-US">Xen</span>. Кардинальные изменения претерпел дизайн нашего сайта и панели управления, в итоге став более современным и удобным.<br />
<span id="more-121"></span></p>
<p>В новом году мы не собираемся останавливаться на достигнутом и будем радовать вас новыми услугами и специальными предложениями (в планах уже значатся более 150 различных усовершенствований!). В их числе:</p>
<ul>
<li>долгожданная 	поддержка Java-проектов на тарифах 	виртуального хостинга;</li>
<li>легкая 	и быстрая установка популярных 	web-приложений — всего пара минут и вы 	сможете получить работающий блог или 	информационный сайт;</li>
<li>
<p lang="en-US">SMS-<span lang="ru-RU">уведомления пользователей;</span></p>
</li>
<li>
<p lang="ru-RU">работы по улучшению панели инструментов<span lang="en-US">;</span></p>
</li>
<li>специально 	от отдела по работе с клиентами — новая 	партнерская программа.</li>
</ul>
<p style="text-indent: 0cm;">Конечно же, это далеко не все, что мы собираемся внедрить в наступающем году. Ведь политика Locum идти навстречу пожеланиям клиентов, предоставляя сервис самого высокого качества по доступным ценам, остается неизменной. Каждая наша услуга основана прежде всего на стабильных и хорошо оттестированных системных компонентах, что позволяет вам всегда быть уверенными в полной стабильности и качестве предлагаемого продукта.</p>
<p>Накануне праздничных дней хочется сказать теплые слова и пожелания в адрес абсолютно всех наших клиентов! Особенно хочется поблагодарить самых активных посетителей, которые оставляют свои идеи и предложения в системе <a href="http://locum.reformal.ru/">Reformal</a>. Ни одна из этих здравых мыслей не осталась без внимания, а многие из них будут реализованы уже в самом ближайшем будущем. <a href="http://twitter.com/LocumRu" target="_blank">Следите</a> за нашими анонсами <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /><br />
Отдельное спасибо также тем, кто публикует о нас <a href="http://hosting101.ru/locum.ru" target="_blank">такие </a><a href="http://hostingsaitov.ru/locum" target="_blank">положительные</a> отзывы. Поверьте, нам очень приятно, что вы так высоко оцениваете нашу работу.</p>
<p style="text-indent: 0cm;">Еще раз с праздником! Здоровья и счастья вам и вашим близким! Пусть сбудутся все самые сокровенные и светлые мечты!</p>
<h3>Locum — лучший дом для ваших интернет-проектов.</h3>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/new_year/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Проект-ориентированный хостинг</title>
		<link>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting</link>
		<comments>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting#comments</comments>
		<pubDate>Thu, 01 Oct 2009 07:28:04 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[web-проекты]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[компания]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=97</guid>
		<description><![CDATA[Web-приложения набирают все большую популярность, развиваются средства разработки таких приложений, появляются новые языки программирования и фреймворки. Понятие «сайт» практически стало синонимом «проект», когда от браузера требуется гораздо больше, чем просто показать страничку-другую текста. Хостинговые технологии не должны отставать от технологий создания web-проектов. Необходимо обеспечивать работоспособность широкого спектра фреймворков, написанных на очень разных языках: от традиционного [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.locum.ru/news/proekt-orienti…shared-hosting"><img class="alignleft size-full wp-image-99" title="Проект-ориентированный хостинг" src="http://blog.locum.ru/wp-content/uploads/2009/10/Fotolia_7682116_S.png" alt="Проект-ориентированный хостинг" width="600" height="355" /></a></p>
<p>Web-приложения набирают все большую популярность, развиваются средства разработки таких приложений, появляются новые языки программирования и фреймворки. Понятие «сайт» практически стало синонимом «проект», когда от браузера требуется гораздо больше, чем просто показать страничку-другую текста.<br />
<span id="more-97"></span></p>
<p>Хостинговые технологии не должны отставать от технологий создания web-проектов. Необходимо обеспечивать работоспособность широкого спектра фреймворков, написанных на очень разных языках: от традиционного PHP до нетривиального <a href="http://ru.wikipedia.org/wiki/Lisp" target="_blank">Lisp</a>.</p>
<p>Именно этими принципами мы руководствовались, когда проектировали наш хостинг: разнородная среда, скорость и масштабируемость — именно такими были основные критерии. В результате каждый пользователь нашей системы имеет возможность создавать «проекты» — это специально подобранные наборы системных и внешних ресурсов. Именно проект является основой системы. Далее пользователь получает контроль над основными ресурсами, которые предоставлены ему в рамках проекта, а также может изменять набор этих ресурсов, например, добавить в проект еще одну базу данных.</p>
<p>Виртуальный хостинг предполагает работу множества пользователей на одном физическом сервере. В такой среде необходимо строго следить за соблюдением прав доступа к объектам. Все проекты на нашем хостинге выполняются только от имени пользователя, который создал этот проект.</p>
<p>Основное преимущество проектно-ориентированного подхода — это возможность одному пользователю создавать проекты разных типов без необходимости повторной регистрации или переключения на другой сервер. К одному аккаунту можно привязать как традиционный PHP-проект, так и <a href="http://www.djangoproject.com/" target="_blank">Django</a>-приложение, которое будет работать также прозрачно для пользователя. В будущем мы планируем значительно расширить список доступных типов проектов, наша архитектура позволяет сделать это без особого труда.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Невидимая архитектура</title>
		<link>http://locum.ru/blog/hosting/invisible_architecture</link>
		<comments>http://locum.ru/blog/hosting/invisible_architecture#comments</comments>
		<pubDate>Mon, 17 Aug 2009 13:04:04 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[веб-интерфейс]]></category>
		<category><![CDATA[компания]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=80</guid>
		<description><![CDATA[Пользуясь услугами хостинга, клиенты видят только веб-интерфейс панели управления и окно ftp-клиента. А ведь многим наверняка интересно узнать о том, каким же образом работает вся система? Вот вкратце принципы работы архитектуры, которую мы выбрали для предоставления общего интерфейса управления ресурсами хостинг-серверов. Естественно, веб-интерфейс &#8212; это далеко не основной компонент системы. Он лишь принимает запрос пользователя, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;"><a href="http://blog.locum.ru/hosting/invisible_architecture"><img class="alignleft size-full wp-image-92" title="Superблог LOCUM: Невидимая архитектура" src="http://blog.locum.ru/wp-content/uploads/2009/08/arch.png" alt="Superблог LOCUM: Невидимая архитектура" width="600" height="300" /></a></p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { color: #000080; so-language: zxx; text-decoration: underline } 		A:visited { color: #800000; so-language: zxx; text-decoration: underline } --></p>
<p style="margin-bottom: 0cm;">Пользуясь услугами хостинга, клиенты видят только веб-интерфейс панели управления и окно ftp-клиента. А ведь многим наверняка интересно узнать о том, каким же образом работает вся система? Вот вкратце принципы работы архитектуры, которую мы выбрали для предоставления общего интерфейса управления  ресурсами хостинг-серверов.</p>
<p><span id="more-80"></span></p>
<p style="margin-bottom: 0cm;">Естественно, веб-интерфейс &#8212; это далеко не основной компонент системы. Он лишь принимает запрос пользователя, конвертирует его в удобный для системы формат и кладет в особую очередь задач для выполнения. Стоит заметить, что какое-либо атомарное с точки зрения интерфейса пользователя действие может на самом деле состоять из некоторого количества мелких операций. Например, пользователь, создавая новый сайт, кликает на соответствующую кнопку в своей панели управления. Та определяет, какие действия нужно выполнить: добавить DNS-имя, создать директорию сайта в домашней папке пользователя, скопировать в нее стандартные файлы-заглушки, создать конфигурационный файл веб-сервера и т.д. После того, как задачи отправлены в очередь, работа веб-интерфейса  заканчивается. В дело вступает второе звено нашей системы &#8212; специальный процесс, который следит за очередью задач и их выполнением. Он постоянно получает запросы и отчеты от третьего звена — маленьких рабочих серверов, отвечающих за исполнение всех физических действий на той или иной машине. Обработчик очереди, руководствуясь системой приоритетов, а также специализацией конкретного сервера, видит запросы от этих приложений, анализирует текущую очередь задач и выбирает из них первоочередную. После этого задача получает статус «в работе», и обработчик очереди ожидает отчета об ее исполнении. Тут надо отметить, что некоторые задачи (регистрация доменного имени и др.) требуют достаточно много времени, поэтому была выбрана именно такая схема взаимодействия компонентов  системы. Обработчик очереди не ждет мгновенного ответа от исполнителя, но помнит о каждой задаче и в любой момент готов принять отчет о ее исполнении.</p>
<p style="margin-bottom: 0cm;">Если все эти операции прошли без помех, то действия, которые пользователь хотел выполнить, обретают свое физическое воплощение. Если же произошла ошибка, этот факт логируется для дальнейшего разбирательства администратором. В любом случае, обработчик очереди получит отчет об удачном или неудачном исполнении каждой поставленной задачи. Когда задача выполнена, она получает соответствующий статус и покидает активную очередь. Однако все сведения о запрошенных действиях сохраняются, чтобы всегда можно было восстановить картину событий для поиска ошибок, а также сбора статистики. Настройка серверов организована таким образом, что пользователи, выполняя свои команды, никак не могут помешать друг другу. Сервера-исполнители задач выполняют физические действия от имени соответствующей учетной записи в системе. Такой подход позволяет при непредвиденных обстоятельствах максимально обезопасить данные наших клиентов.</p>
<p style="margin-bottom: 0cm;">Помимо постоянно функционирующих трех основных звеньев системы на главном сервере периодически запускаются вспомогательные процессы. Они предназначены для обработки биллинга, данных системы электронных платежей, API-регистра доменов и тому подобных внешних сервисов.</p>
<p style="margin-bottom: 0cm;">Использование такой архитектуры позволяет нам легко расширять инфраструктуру. На обработчике очереди для этого имеется специальная карта серверов, в которой описаны все существующие в инфраструктуре машины, их роли и функции. Для ввода нового сервера достаточно лишь установить на него приложение по исполнению задач и внести его в карту серверов на обработчике очереди.</p>
<p style="margin-bottom: 0cm;">Такой подход нам представляется весьма удобным. Сложности, с которыми приходится сталкиваться при разработке данной системы, с лихвой окупаются в дальнейшем за счет удобства использования и масштабируемости.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/invisible_architecture/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Современный хостинг — на переднем краю разработок</title>
		<link>http://locum.ru/blog/hosting/sovremennyj_hosting</link>
		<comments>http://locum.ru/blog/hosting/sovremennyj_hosting#comments</comments>
		<pubDate>Fri, 31 Jul 2009 07:43:08 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[it]]></category>
		<category><![CDATA[новые технологии]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=36</guid>
		<description><![CDATA[С каждым днем отрасль IT бурно прогрессирует и новые технологии растут как грибы после дождя. С одной стороны, такие темпы радуют, но с другой &#8212; создают достаточно много сложностей. Хостерам (мы же все живые люди!) за динамикой развития технологий уследить также непросто. Отсюда и возникают проблемы при выполнении важнейшей задачи для любой хостинговой компании &#8212; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } 		A:link { color: #000080; so-language: zxx; text-decoration: underline } 		A:visited { color: #800000; so-language: zxx; text-decoration: underline } --><a href="http://blog.locum.ru/hosting/sovremennyj_hosting"><img class="alignleft size-full wp-image-37" title="Современный хостинг — на переднем краю разработок." src="http://blog.locum.ru/wp-content/uploads/2009/07/problems.png" alt="Современный хостинг — на переднем краю разработок." width="600" height="247" /></a></p>
<p>С каждым днем отрасль IT бурно прогрессирует и новые технологии растут как грибы после дождя. С одной стороны, такие темпы радуют, но с другой &#8212; создают достаточно много сложностей. Хостерам (мы же все живые люди!) за динамикой развития технологий уследить также непросто. Отсюда и возникают проблемы при выполнении важнейшей задачи для любой хостинговой компании &#8212; как предоставить клиентам возможность использовать самые передовые IT-достижения, при этом не нарушив работу старых проектов? Ведь, с одной стороны, нельзя отставать от прогресса и конкурентов, а с другой — хочется стабильности и проверенных временем решений.<br />
<span id="more-36"></span></p>
<p>В таких ситуациях часто приходится балансировать на грани, к тому же разработчики языков  программирования, фреймворков и серверов приложений иногда недостаточно заботятся об обратной совместимости своих продуктов.  Это сильно усложняет работу хостеров. Посудите сами: код, написанный под <a href="http://www.php.net/" target="_blank">php 4</a>, вовсе не обязательно будет стабильно работать с пятой версией этого популярного языка, с <a href="http://www.ruby-lang.org/" target="_blank">ruby</a> 1.9 будет работать  <a href="http://rubyonrails.org/" target="_blank">rails</a>, но половина популярных <a href="http://ru.wikipedia.org/wiki/RubyGems" target="_blank">gem</a>-ов — не будет.</p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } --><img class="alignleft size-full wp-image-44" title="Работает — не трогай!" src="http://blog.locum.ru/wp-content/uploads/2009/07/Fotolia_9698814_XS1.png" alt="Работает — не трогай!" width="220" height="214" />Многим IT-специалистам известен золотой принцип: «Работает — не трогай!». Он действительно помогает избежать лишних  проблем, но, к сожалению, не универсален. С таким подходом  легко превратиться в этакого IT-ретрограда, ведь на современном рынке хостинга  можно и сейчас встретить серверы под управлением <a href="http://www.freebsd.org/" target="_blank">FreeBSD</a> 4.11 (вышедшей еще в  2005 году), на которых предоставляется хостинг с php 4 и <a href="http://www.mysql.com/" target="_blank">mysql</a> четвертой  ветки. В такой ситуации и сотрудники хостинговой компании, и их клиенты не могут  использовать множество новых возможностей, появившихся в последующих версиях  операционной системы и прочего программного обеспечения. В итоге хостер имеет стабильность ради стабильности, пожертвовав ради нее как своим  удобством, так и новыми клиентами, которые хотят пользоваться всеми  современными технологиями.<br />
Постоянное обновление до последних версий в день их появления на свет тоже  не будет разумным решением. Ведь помимо очевидных проблем с безопасностью и  стабильностью это может привести к ситуации, когда у половины клиентов перестанут  работать их проекты (просто потому, что разработчики не очень хорошо подумали о  вопросах обратной совместимости, или были сделаны слишком принципиальные  изменения, и добиться совместимости со старым кодом не представлялось  возможным).<br />
Таким образом, хороший хостер вынужден постоянно балансировать на грани между  ретроградством и переднем краем разработок, изучать вопрос совместимости  старого кода с новыми версиями языков и платформ, выделять новые сервера для  запуска новых решений, а потом тестировать все это для выявления проблем с безопасностью  и стабильностью работы.</p>
<p>Прежде чем внедрить какую-либо новую технологию в проект LOCUM, мы тщательно изучаем опыт других  специалистов, чтобы убедиться в готовности данного решения для практического  использования. Затем тестируем его на некотором количестве размещаемых у нас ресурсов, чтобы выявить очевидные проблемы с совместимостью старого  кода. И уже только после этого предлагаем нашим клиентам использовать новинку. Если у кого-то после перехода на нее возникают проблемы, мы всегда  готовы дать советы по запуску проекта под новой версией или предложить вариант  с возможностью сохранения старой версии языка, фреймворка или сопутствующего  программного обеспечения. Конечно, этот путь намного хлопотнее, чем просто не трогать то, что уже работает. Но  топтаться на месте &#8212; занятие бесполезное и скучное. А нам и нашим клиентам нужны широкие перспективы.</p>
<p style="margin-bottom: 0cm;">
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } --></p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/sovremennyj_hosting/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
