<?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>hudson@work &#187; linux</title>
	<atom:link href="http://hudson.su/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Assembla: несколько SSH ключей для разных проектов под одним пользователем</title>
		<link>http://hudson.su/2011/05/19/assembla-different-ssh-keys-for-different-projects/</link>
		<comments>http://hudson.su/2011/05/19/assembla-different-ssh-keys-for-different-projects/#comments</comments>
		<pubDate>Thu, 19 May 2011 13:41:18 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[assembla]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=2007</guid>
		<description><![CDATA[Небольшой хинт по использованию нескольких ключей (для различных проектов) для одного пользователя при работе с git.assembla.com в linux. Вам по прежнему будет нужен уникальный ключ для каждого пользователя. Ниже представлен небольшой workaround, позволяющий менять ключи для работы с различными проектами на assembla.com. 1) разместите где-либо в $PATH скриптик (назовем его gitssh): #!/bin/sh key=$&#40;git config ssh.key&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшой хинт по использованию нескольких ключей (для различных проектов) для одного пользователя при работе с <strong>git.assembla.com</strong> в linux.</p>
<p><span id="more-2007"></span></p>
<p><span style="text-decoration: underline;">Вам по прежнему будет нужен уникальный ключ для каждого пользователя. </span></p>
<p>Ниже представлен небольшой workaround, позволяющий менять ключи для работы с различными проектами на assembla.com.</p>
<p>1) разместите где-либо в $PATH скриптик (назовем его <strong>gitssh</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">key</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">git</span> config ssh.key<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$key</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #007800;">git_opts</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #007800;">git_opts</span>=<span style="color: #ff0000;">&quot;-i <span style="color: #007800;">${key}</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #007800;">$git_opts</span> <span style="color: #ff0000;">&quot;$@&quot;</span></pre></div></div>

<p>2) установите переменную GIT_SSH чтобы она указывала на этот скрипт:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">GIT_SSH</span>=gitssh</pre></div></div>

<p>3) выполните настройку ключа для проекта1 в его директории</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">git config ssh.key ~/.ssh/my_cool_project1_key.pub</pre></div></div>

<p>и для проекта2 в его директории</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">git config ssh.key ~/.ssh/my_cool_project2_key.pub</pre></div></div>

<p>Вот и все работает ) Успехов!</p>
<p><a href="http://www.assembla.com/spaces/breakoutdocs/wiki/Different_SSH_keys_for_different_projects" target="_blank">http://www.assembla.com/spaces/breakoutdocs/wiki/Different_SSH_keys_for_different_projects</a></p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/05/19/assembla-different-ssh-keys-for-different-projects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Скрипт для бэкапа mysql баз</title>
		<link>http://hudson.su/2011/03/03/mysql-backup-script/</link>
		<comments>http://hudson.su/2011/03/03/mysql-backup-script/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 16:14:43 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1821</guid>
		<description><![CDATA[Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности: Наличие списка исключений (т.е. бэкапим все кроме&#8230;) Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу) Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221; Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все [...]]]></description>
			<content:encoded><![CDATA[<p>Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности:</p>
<ul>
<li>Наличие списка исключений (т.е. бэкапим все кроме&#8230;)</li>
<li>Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу)</li>
<li>Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221;</li>
<li>Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все в один файл)</li>
<li>Архивирование бэкапа в тарбол</li>
<li>Зачистка .sql</li>
</ul>
<p>Собственно к написанию скрипта меня сподвигло именно то что mysqldump бэкапит все что ему сказано в один файл (если требуется восстановить одну базу, то попробуй ее выцарапай из общего дампа&#8230;), а создавать отдельную строку для бэкапа всякой новой БД геморно (об этом как минимум надо вспомнить!).</p>
<p>В общем если интересно &#8211; прошу под кат:</p>
<p><span id="more-1821"></span><br />
Собственно сам скрипт</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># MySQL backup utility</span>
<span style="color: #666666; font-style: italic;"># @author dmitry.bykadorov@gmail.com</span>
<span style="color: #666666; font-style: italic;">##</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># current date</span>
<span style="color: #007800;">DATE</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y-<span style="color: #000000; font-weight: bold;">%</span>M-<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># y/m/d/h/m separately</span>
<span style="color: #007800;">YEAR</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MONTH</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>m<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">DAY</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">HOURS</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>H<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MINUTES</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>M<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># database credentials</span>
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBHOST</span>=<span style="color: #ff0000;">&quot;&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># create list of databases</span>
mysql <span style="color: #660033;">-h</span> <span style="color: #007800;">$DBHOST</span> <span style="color: #660033;">-u</span> <span style="color: #007800;">$DBUSER</span> -p<span style="color: #007800;">$DBPASS</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;show databases;&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list
&nbsp;
<span style="color: #666666; font-style: italic;"># create backup dir (e.g. ../2011/01/01/04-00)</span>
<span style="color: #007800;">BACKUP_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$YEAR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$MONTH</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$DAY</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">--parents</span> <span style="color: #660033;">--verbose</span> <span style="color: #007800;">$BACKUP_DIR</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># excludes list (Database is a part of SHOW DATABASES output)</span>
<span style="color: #007800;">EXCLUDES</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #ff0000;">'Database'</span> <span style="color: #ff0000;">'information_schema'</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">NUM_EXCLUDES</span>=<span style="color: #800000;">${#EXCLUDES[@]}</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> database <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #007800;">skip</span>=<span style="color: #000000;">0</span>
&nbsp;
  <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #000000;">0</span>
  <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$count</span> <span style="color: #660033;">-lt</span> <span style="color: #007800;">$NUM_EXCLUDES</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #666666; font-style: italic;"># check if this name in excludes list</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> = <span style="color: #800000;">${EXCLUDES[$count]}</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">skip</span>=<span style="color: #000000;">1</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #007800;">$count</span>+<span style="color: #000000;">1</span>
  <span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$skip</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;++ <span style="color: #007800;">$database</span>&quot;</span>
    <span style="color: #666666; font-style: italic;"># now we can backup current database</span>
    <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$BACKUP_DIR</span>
    <span style="color: #007800;">backup_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$YEAR</span>-<span style="color: #007800;">$MONTH</span>-<span style="color: #007800;">$DAY</span>.<span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>.<span style="color: #007800;">$database</span>.backup.sql&quot;</span>
    <span style="color: #007800;">backup_tarball_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>.tar.gz&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqldump <span style="color: #660033;">-h</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBHOST</span>&quot;</span> <span style="color: #660033;">--databases</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> <span style="color: #660033;">-u</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBUSER</span>&quot;</span> <span style="color: #660033;">--password</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBPASS</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   backup <span style="color: #007800;">$backup_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-zcf</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_tarball_name</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   compress <span style="color: #007800;">$backup_tarball_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   cleanup <span style="color: #007800;">$backup_name</span>&quot;</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;done!&quot;</span></pre></div></div>

<p>Можете его свободно:</p>
<ul>
<li>использовать (никаких гарантий я вам конечно же не даю &#8211; на свой страх и риск )))</li>
<li>модифицировать (например добавить выгрузку бэкапа на другой сервер или на Amazon S3 )))</li>
<li>критиковать ))</li>
</ul>
<p>P.S. Если таки будете использовать &#8211; не забудьте подставить ваши mysql credentials ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/03/03/mysql-backup-script/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ProFTPD &#8211; symlink = mount</title>
		<link>http://hudson.su/2010/12/22/proftpd-symlink-mount/</link>
		<comments>http://hudson.su/2010/12/22/proftpd-symlink-mount/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 14:32:12 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1683</guid>
		<description><![CDATA[Потребовалось мне сделать на девелопеском сервере логин для временного человечка, который JavaScript кумекает. Это конечно не проблема, но вот что меня в тупик поставило на некоторое время. Помимо собственно FTP на сервер, человечку нужен был виртуальный хост для его отладочных нужд. Сервер как правило использовался только проверенными людьми, поэтому особо с безопасностью никто особо не [...]]]></description>
			<content:encoded><![CDATA[<p>Потребовалось мне сделать на девелопеском сервере логин для временного человечка, который JavaScript кумекает. Это конечно не проблема, но вот что меня в тупик поставило на некоторое время.</p>
<p>Помимо собственно FTP на сервер, человечку нужен был виртуальный хост для его отладочных нужд. Сервер как правило использовался только проверенными людьми, поэтому особо с безопасностью никто особо не заморачивался. Ан вот приспичило. На счастье, попался мне на просторах интерентов документик <a href="http://www.proftpd.org/docs/howto/Chroot.html" target="_blank">ProFTPD mini howto</a>, в котором подробно разбирается почему демон не хочет работать с прямыми симлинками из хомяка в docroot виртуальника (в моем случае). Собственно остановился я на этом решении:</p>
<blockquote><p><strong>Filesystem Tricks</strong> [...]</p>
<p>To have an exact duplicate of the <code>/var/ftp/incoming directory</code> available in <code>/home/bob/incoming</code> and <code>/home/dave/incoming</code>, use one of these commands:</p>
<p>Linux (as of the 2.4.0 kernel):</p>
<pre>  mount --bind /var/ftp/incoming /home/bob/incoming
  mount --bind /var/ftp/incoming /home/dave/incoming</pre>
</blockquote>
<p>Что я в общем-то и применил.</p>
<p>P.S. Надеюсь дыр в безопасности не добавил )</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/12/22/proftpd-symlink-mount/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BitNami &#8211; помощник ленивому программисту</title>
		<link>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/</link>
		<comments>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/#comments</comments>
		<pubDate>Sun, 30 May 2010 06:42:38 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[bitnami]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[suse]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1520</guid>
		<description><![CDATA[Кросспост из моего хабра. Век живи &#8211; век учись. Ковыряясь в публикациях о Ruby на википедии наткнулся на замечательный проект, который не только поможет ленивому программисту поднять development среду для своих нужд, но также во многих случаях выручит и администратора и менеджера проектов. Проект этот называется BitNami. Что же такое &#8211; BitNami? Целью BitNami является [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Кросспост из моего <a href="http://habrahabr.ru/blogs/webdev/94904/" target="_blank">хабра</a>.</p></blockquote>
<p>Век живи &#8211; век учись.</p>
<p>Ковыряясь в публикациях о Ruby на википедии наткнулся на замечательный проект, который не только поможет ленивому программисту поднять development среду для своих нужд, но также во многих случаях выручит и администратора и менеджера проектов. Проект этот называется <a href="http://bitnami.org" target="_blank">BitNami</a>.</p>
<p><span id="more-1520"></span>Что же такое &#8211; BitNami?</p>
<p>Целью BitNami является  упрощение процесса развертывания веб-приложений, таких как вики или блоги, что позволит сделать их более доступными. В мире есть много качественных программных пакетов с открытым исходным кодом, которые не  используются так широко, как они могли быть использованы, потому что установить их и настроить не каждому по плечу. Команда BitNami намерена бороться с этим.</p>
<p>BitNami Stack представляет  собой интегрированный пакет программного обеспечения, которое включает в  себя веб-приложение и все его необходимые компоненты (веб-сервер, базу  данных, Language Runtime), поэтому он готов к запуску &#8220;из коробки&#8221;. Stack&#8217;и могут быть представлены в виде нативных инсталляторов, образов виртуальных машин,  или образов для облачного хостинга.</p>
<p>Нативные инсталляторы &#8211; это отдельные исполнимые файлы, которые вы можете загрузить к себе на машину. После запуска инсталлятора будет выполнен пошаговый атоматический процесс установки выбранной системы. Инсталляторы доступны для Windows, Mac OS X, Linux и Solaris (согласитесь, этого более чем достаточно в 95% случаев).</p>
<p>Образы виртуальных машин &#8211; это преднастроенные виртуальные машины, которые включают минимальную инсталляцию Linux и собственно компоненты BitNami Stack. Образы виртуальных машин доступны для VMWare и последних версий VirtualBox.</p>
<p>Образы для облачного хостинга позволяют вам запустить BitNami Stack в облачном окружении и программно запускать или останавливать его. Облачные образы на текущий момент доступны для Amazon EC2, кроме того планируется также поддержка других облачных хостингов.</p>
<p>Независимо от того, какой тип стека выберете, все они позволяют запустить выбранное вами приложение в считанные минуты, не тратя времени на его конфигурирование и настройку.</p>
<p>На текущий момент доступно уже несколько десятков стеков. Вот некоторые из них:</p>
<ul type="none">
<li><strong>Infrastructure</strong>
<ul>
<li>DjangoStack</li>
<li>LAMPStack</li>
<li>RubyStack</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Blog</strong>
<ul>
<li>WordPress</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Bug-Tracking</strong>
<ul>
<li>Redmine</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>CMS</strong>
<ul>
<li>Drupal</li>
<li>Joomla</li>
<li>Radiant CMS</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Forum</strong>
<ul>
<li>phpBB</li>
</ul>
</li>
<li><strong>Version  Control</strong>
<ul>
<li>Subversion</li>
</ul>
</li>
<li><strong>Wiki</strong>
<ul>
<li>DokuWiki</li>
<li>MediaWiki</li>
<li>&#8230;</li>
</ul>
</li>
</ul>
<p>Где же могут нам пригодиться BitNami Stacks?</p>
<ul>
<li>Локальные девелоперские среды.</li>
<li>Вируализация девелоперских сред на централизованных началах (безобразно, но однообразно, как в армии).</li>
<li>Тестирование CMS, Wiki, багтрекеров &#8211; поиграться, чтобы понять, а нужно ли оно вообще, подходит ли.</li>
<li>Развертывание быстрых конфигураций в продуктовых средах (облачный хостинг как минимум).</li>
<li>Ваш вариант?</li>
</ul>
<p>Я уже опробовал VMWare образы Python/Ruby/Redmine &#8211; очень понравилось. Django Stack (native installer) почему-то не установился на Win7 &#8211; что-то с PostgreSQL, пока детально не разбирался.</p>
<p>Вот вкратце и все. Надеюсь, был полезен ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Устанавливаем Git на CentOS</title>
		<link>http://hudson.su/2010/05/11/install-git-on-centos/</link>
		<comments>http://hudson.su/2010/05/11/install-git-on-centos/#comments</comments>
		<pubDate>Tue, 11 May 2010 07:17:27 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1484</guid>
		<description><![CDATA[Поскольку в официальном руководстве на GitHub описана установка только для Ubuntu (через Synaptic и apt-get), на коей как водится свет клином не сошелся, предлагаю вашему вниманию небольшой очерк на тему &#8220;как установить GIT&#8221; на Redhat-совместимом дистрибутиве CentOS при помощи нескольких простых команд: Устанавливаем зависимости: yum install gettext-devel expat-devel curl-devel zlib-devel openssl-devel Мне также еще потребовалось [...]]]></description>
			<content:encoded><![CDATA[<p>Поскольку в официальном руководстве на GitHub описана установка только для Ubuntu (через Synaptic и apt-get), на коей как водится свет клином не сошелся, предлагаю вашему вниманию небольшой очерк на тему &#8220;как установить GIT&#8221; на Redhat-совместимом дистрибутиве CentOS при помощи нескольких простых команд:</p>
<p><span id="more-1484"></span></p>
<p>Устанавливаем зависимости:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">yum <span style="color: #c20cb9; font-weight: bold;">install</span> gettext-devel expat-devel curl-devel  zlib-devel openssl-devel</pre></div></div>

<p>Мне также еще потребовалось установить GCC:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">yum <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span></pre></div></div>

<p>Загружаем исходники и разархивируем их:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span>  http:<span style="color: #000000; font-weight: bold;">//</span>kernel.org<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>software<span style="color: #000000; font-weight: bold;">/</span>scm<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>git-1.6.1.tar.gz
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">tar</span> xvfz git-1.6.1.tar.gz</pre></div></div>

<p>Устанавливаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> git-1.6.1
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> all
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Вуаля! )</p>
<p>Оригинал <a href="http://www.how-to-linux.com/2009/01/install-git-161-on-centos-52/" target="_blank">тут</a>. Проверено также на CentOS 5.4 32bit.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/05/11/install-git-on-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Добавляем 2 и более IP в CentOS 5 (RHEL, Fedora)</title>
		<link>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/</link>
		<comments>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 04:54:47 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1323</guid>
		<description><![CDATA[В основном в своей практике я сталкивался с необходимостью использования двух IP на разных сетевых интерфейсах. Как правило это eth0 и eth1. Но вот потребовалось &#8220;навесить&#8221; на один интерфейс сначала два, а потом и четыре IP. Сделать это оказалось не сложно, но ранее я такой прием не использовал: Итак, у нас есть один IP на [...]]]></description>
			<content:encoded><![CDATA[<p>В основном в своей практике я сталкивался с необходимостью использования двух IP на разных сетевых интерфейсах. Как правило это <code>eth0</code> и <code>eth1</code>. Но вот потребовалось &#8220;навесить&#8221; на один интерфейс сначала два, а потом и четыре IP. Сделать это оказалось не сложно, но ранее я такой прием не использовал:</p>
<p><span id="more-1323"></span></p>
<p>Итак, у нас есть один IP на интерфейсе eth0:</p>
<pre>eth0 Link encap:Ethernet HWaddr 00:26:B9:2A:B9:13
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
</pre>
<p>Нам нужен еще один IP на том же сетевом интерфейсе (пусть для определенности это будет 192.168.0.200). Для этого нужно создать в директории <code>/etc/sysconfig/network-scripts/</code> файл <code>ifcfg-eth0:0</code></p>
<pre>DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.200
NETMASK=255.255.255.255
</pre>
<p>После этого нужно перезапустить сетевые службы:</p>
<pre>service network restart</pre>
<p>Выполняем ifconfig и видим, что появился &#8220;алиас&#8221; eth0:0</p>
<pre>eth0:0 Link encap:Ethernet HWaddr 00:26:B9:2A:B9:13
inet addr:192.168.0.200 Bcast:192.168.0.11 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:185 Base address:0xa000
</pre>
<p>Если потребуется добавить еще несколько IP, то добавляем соответственно файлы <code>ifcfg-eth0:X</code>, где X &#8211; 1,2,3 и так далее. Выглядит не очень оптимально, так? Действительно, если требуется &#8220;навесить&#8221; на сетевой интерфейс последовательность из IP-адресов (допустим такой вот диапазон: 192.168.0.200-220), то можно воспользоваться следующей конфигурацией. Создаем файл <code>/etc/sysconfig/network-scripts/ifcfg-eth0-range0</code>:</p>
<pre>IPADDR_START=192.168.0.200
IPADDR_END=192.168.0.220
NETMASK=255.255.255.255
CLONENUM_START=1
NO_ALIASROUTING=yes
</pre>
<p>Опять перезапускаем сетевые службы:</p>
<pre>service network restart</pre>
<p>В результате появятся 20 алиасов eth0:1 &#8211; eth0:20, c нужными адресами.</p>
<p>Кроме того, добавлять, изменять и удалять ip-адреса можно с  помощью  команд ip и ifconfig, например если нужно временно поднять   дополнительный адрес:</p>
<pre>ifconfig eth0:0 inet 192.168.0.200/32
</pre>
<p>Естественно, после перезагрузки адрес пропадет. Чтобы убрать временный адрес:</p>
<pre>ifconfig eth0:0 down
</pre>
<p>Have fun! ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Скрипт просмотра объема памяти, потребляемого процессами в linux</title>
		<link>http://hudson.su/2010/01/22/script-memory-usage-in-linux/</link>
		<comments>http://hudson.su/2010/01/22/script-memory-usage-in-linux/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:54:05 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=771</guid>
		<description><![CDATA[Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт: Собственно скрипт #!/bin/bash ps -eo pid,comm,user,%mem &#124; awk ' { memory[$2]+=$4; } END { print( "--== Cumulative memory usage TOP: ==--" ); print( "--------------------------------------" ); print( "%MEM t&#124; COMM" ); print( [...]]]></description>
			<content:encoded><![CDATA[<p>Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт:</p>
<p><span id="more-771"></span></p>
<p>Собственно скрипт</p>
<pre>#!/bin/bash
ps -eo pid,comm,user,%mem | awk '
{
    memory[$2]+=$4;
}
END
{
    print( "--== Cumulative memory usage TOP: ==--" );
    print( "--------------------------------------" );
    print( "%MEM t| COMM" );
    print( "--------------------------------------" );
    while( length(memory) &gt; 0 )
    {
        max = -1;
        for( i in memory )
        {
            if( memory[i]&gt;max )
            {
                max_index = i;
                max = memory[max_index];
            }
        }
        delete memory[max_index];
        print( max, "t| ", max_index  );
    }
}' | less
</pre>
<p>Несколько комментариев:</p>
<ul>
<li>Сначала получаем список процессов при помощи <strong>ps</strong>. Выглядит он примерно так:</li>
</ul>
<pre>  PID COMMAND         USER     %MEM
    1 init            root      0.0
    2 migration/0     root      0.0
    3 ksoftirqd/0     root      0.0
    4 watchdog/0      root      0.0
    5 migration/1     root      0.0
    6 ksoftirqd/1     root      0.0
</pre>
<ul>
<li>Затем при помощи <strong>awk </strong>собираем кумулятивные данные в массив ( <em>memory[$2]+=$4;</em> ). Тут думаю все понятно.</li>
<li>Последним штрихом является сортировка кумулятивных значений и их отображение. К сожалению <strong>asort</strong>, встроенный в <strong>gawk</strong>,<strong> </strong>выдавал что-то неудобоваримое, пришлось написать простую сортировку самостоятельно. Пока массив memory содержит элементы, пробегаем мессив memory, ищем максимальный элемент, печатаем его, удаляем максимальный элемент ( <em>delete memory[max_index];</em> ). Каждую итерацию, массив memory уменьшается на один элемент.</li>
<li>less добавлен для удобства использования.</li>
</ul>
<p>Результат работы скрипта:</p>
<pre>--== Cumulative memory usage TOP: ==--
--------------------------------------
%MEM    | COMM
--------------------------------------
7.4     |  httpd
3.1     |  clamd
2.8     |  spamd
0.6     |  mysqld
0.4     |  yum-updatesd
0.2     |  named
0.1     |  ntpd
0.1     |  munin-node
0       |  rpciod/1
0       |  rpciod/2
0       |  udevd
</pre>
<p>Боле короткая форма записи для скрипта (без сортировки, но в одну строку):</p>
<pre>
#
ps -eo pid,comm,user,%mem | awk '{memory[$2]+=$4} END{ print( "%MEM t| COMM" ); for( proc in memory ) print( memory[proc], "t| ", proc  ); }' | less
</pre>
<p>Have fun ))</p>
<p>p.s. Можно добавить еще распознавание и группировку таких процессов rpciod/1 и rpciod/2<br />
p.p.s. Можно попробовать добавить обновление по времени like top, и ограничить число выводимых процессов (например 20ю).</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/01/22/script-memory-usage-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 2 &#8211; работа с Subversion</title>
		<link>http://hudson.su/2009/12/09/subversion-centos-rhel-p2/</link>
		<comments>http://hudson.su/2009/12/09/subversion-centos-rhel-p2/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 22:31:07 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=526</guid>
		<description><![CDATA[По мотивам вики centos &#8211; статья в двух частях про Subversion (http://wiki.centos.org/HowTos/Subversion). Часть вторая, в которой рассматриваются вопросы работы с SVN для начинающих: Использование Subversion Структура репозитория Subversion Если все предыдущие шаги пройдены успешно, то вы готовы к использованию вашего репозитория. В комлекте Subversion поставляется интерфейс для командной строки, который так и называется: svn. # [...]]]></description>
			<content:encoded><![CDATA[<p>По мотивам вики centos &#8211; статья в двух частях про Subversion (<a href="http://wiki.centos.org/HowTos/Subversion">http://wiki.centos.org/HowTos/Subversion</a>).</p>
<p>Часть вторая, в которой рассматриваются вопросы работы с SVN для начинающих:</p>
<p><span id="more-526"></span></p>
<h3>Использование Subversion</h3>
<h4>Структура репозитория Subversion</h4>
<p>Если все предыдущие шаги пройдены успешно, то вы готовы к использованию вашего репозитория. В комлекте Subversion поставляется интерфейс для командной строки, который так и называется: <strong>svn</strong>.</p>
<pre># Получить справку по использованию
[root@name] svn --help</pre>
<p>Основные команды, которые вам нужно знать это <strong>svn import</strong> (импорт исходников в репозиторий), <strong>svn commit</strong> (ci) (обновление репозитория с учетом сделанных вами изменений), и <strong>svn checkout</strong> (co) (загрузка рабочей копии файлов к вам на локальную машину или в локальную директорию). Итак, сначала import чтобы поместить исходники в svn, затем checkout чтобы получить полную актуальную версию и наконец, после правок и изменений &#8211; commit для сохранения внесенных вами изменений.</p>
<p>Перед тем как мы продолжим, несколько слов о структуре репозитория. Едва ли не все источники говорят о создании определенной структуры директорий в репозитории. В особенности они отмечают что необходимо создать директории <strong>branches</strong>, <strong>tags</strong>, и <strong>trunk</strong> в корневой директории репозитория. Например:</p>
<pre>.
|-- project1
|   |-- branches
|   |-- tags
|   `-- trunk
`-- project2
|-- branches
|-- tags
`-- trunk</pre>
<p>Далее в литературе описано как организовать работу с таким репозиторием. Надо сказать что такая структура не является обязательной и если у вас не очень сложный проект вы можете ей не следовать.</p>
<blockquote><p>От переводчика. К слову сказать, я работал как с описанной в литературе структурой, так и без нее. Собственно если разработчиков 1-3, можно обойтись без усложнения процедур и репозитория. Если команда 5 и более человек, проект быстро растет и развивается, то заранее надо подумать о том как будут работать 10, 20 или даже 100 разработчиков.</p></blockquote>
<p>В качестве примера, создадим тестовые директории и несколько файлов в них.</p>
<pre>[root@name] cd /tmp
[root@name] mkdir mytestproj
[root@name] cd mytestproj
[root@name] mkdir configurations options main
[root@name] vim configurations/testconf1.cfg
[root@name] vim options/testopts1.cfg
[root@name] vim main/mainfile1.cfg</pre>
<p>Имейте в виду, что вы можете создать любую нужную вам структуру директорий. Когда у вас есть структура проекта и несколько файликов, мы можем приступить к импортированию их в репозиторий.</p>
<h4>Импорт в Subversion</h4>
<pre>[root@name] svn import /tmp/mytestproj/
file:///var/www/svn/repos/mytestproj
-m "Initial repository layout for mytestproj"
Adding         /tmp/mytestproj/main
Adding         /tmp/mytestproj/main/mainfile1.cfg
Adding         /tmp/mytestproj/configurations
Adding         /tmp/mytestproj/configurations/testconf1.cfg
Adding         /tmp/mytestproj/options
Adding         /tmp/mytestproj/options/testopts1.cfg</pre>
<blockquote><p>На самом деле импортировать можно не только через <strong>file:///var/www/svn/repos/mytestproj</strong> (этот прием подразумевает что репозиторий и ваши файлы находятся на одном сервере), но и указывая URL: <strong>http://yoursvnserver/repos/mytestproj</strong>. Этот же URL будет использован для выгрузки далее.</p></blockquote>
<h4>Выгрузка из Subversion</h4>
<p>Теперь, легким движением руки&#8230; о чем это я&#8230; )) В общем давайте заберем из репозитория то что мы туда положили. Но сперва откройте в браузере http://yourmachine/repos. Однажды импортировав проект в SVN, вы можете использовать его на любой другой машине. Для соединения с репозиторием, вы также будете использовать аккаунт пользователя, созданного в <a href="http://hudson.su/?p=518">первой части данной статьи</a>:</p>
<pre>[root@name] cd /tmp
[root@name] svn co http://yoursvnserver/repos/mytestproj
Authentication realm: &lt;http://yoursvnserver:80&gt; Subversion repos
Password for 'youruser':
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 1.</pre>
<h4>Правка и коммит в Subversion</h4>
<p>На предыдущем шаге мы выгрузили 1ю ревизию нашего проекта. Теперь вы можете отредактировать что-нибудь и закоммитить (commint) ваши правки обратно на сервер Subversion:</p>
<pre>[root@name] cd mytestproj
[root@name] vim configurations/testconf1.cfg -- Add or delete something and save.
[root@name] svn commit -m "Added a line to testconf1.cfg."
Sending        configurations/testconf1.cfg
Transmitting file data .
Committed revision 2.</pre>
<blockquote><p>От переводчика: обратите внимание, с ключом -m добавляется текстовый комментарий (в данном случае &#8220;Added a line to testconf1.cfg.&#8221;). Комментарий не является обязательным, но я рекомендую не пренебрегать данной возможностью, это очень облегчает понимание изменений сделанных ранее другим разработчиком или вами, но несколько месяцев назад. Об этом еще будет сказано ниже.</p></blockquote>
<p>В общем-то теперь вы можете удалить локальные файлы, так как правку вы внесли и закоммитили. Теперь ваши изменения можно посмотреть через браузер в репозитории. Тем не менее как правило так не делают, так как работают с файлами проекта несколько дней, недель, а то и месяцев.</p>
<h4>Добавление и удаление в Subversion</h4>
<p>Теперь, когда у нас все тип-топ, неожиданно нам требуется добавить файлы в наш репозиторий. Сделать это несложо используя аргумент <strong>add</strong>.  Выгружаем наш проект, копируем новые файлы, добавляем их к репозиторию и коммитим изменения:</p>
<pre># Выгружаем
[root@name] svn co http://yoursvnserver/repos/mytestproj
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 2.</pre>
<pre># Добавляем файл
[root@name] cd mytestproj
[root@name] cp /etc/yum.repos.d/CentOS-Base.repo configurations/
[root@name] svn add configurations/CentOS-Base.repo
A         configurations/CentOS-Base.repo</pre>
<pre># Коммитим правку
[root@name] svn commit -m "Added the CentOS Yum repo file."
Adding         configurations/CentOS-Base.repo
Transmitting file data .
Committed revision 3.</pre>
<p>Удалить элементы также просто &#8211; только используйте <strong>delete</strong> а не <strong>add</strong>. И не забывайте коммитить изменения! Теперь, если вы зайдете через браузер в репозиторий, вы увидите что ревизия уже 3я.</p>
<h4>Откат в Subversion</h4>
<p>Описанное выше смотрится здорово, но что, если потребуется откатиться назад, к предыдущей версии? Это тоже несложно сделать. Если вы не уверены, какая версия вам нужна, команда <strong>log</strong> вам в помощь. Вот зачем <strong>очень желательно добавлять комментарии к каждому коммиту.</strong> Информации в комментарии не много, но достаточно для того чтобы понять что было сделано.</p>
<blockquote><p>От переводчика: кстати полезно к комментарию добавлять номер бага или требования, по которому вносится данная правка (конечно если у вас используется багтрекинговая система или система управления требованиями), например &#8220;bug 1234: new directory added&#8221;</p></blockquote>
<pre># Лог по всему репозиторию
[root@name] svn log http://yoursvnserver/repos
# Лог по выбранному проекту
[root@name] svn log http://yoursvnserver/repos/mytestproj</pre>
<p>Таким образом вы получили полный список ревизий с комментариями. На основании списка вы можете выбрать нужную вам ревизию.</p>
<pre># Выгрузка первой ревизии
[root@name] svn co -r 1 http://yoursvnserver/repos/mytestproj</pre>
<h4>Контроль доступа (ACL)в Subversion</h4>
<p>Зачастую, вам не потребуется разграничивать доступ пользователей к каждому репозиторию. Тем не менее, если это потребуется, то доступы пользователям можно разграничивать при помощи списков контроля доступа (ACLs). Данные списки можно подключить при помощи директивы <strong>AuthzSVNAccessFile</strong>, параметром которой служит имя файла:</p>
<pre># Включение ACLs
AuthzSVNAccessFile /etc/svn-acl-conf</pre>
<p>Вы можете добавить эту директиву в секцию Location, соответствующую вашему репозиторию:</p>
<pre>DAV svn
SVNParentPath /var/www/svn/repos
AuthzSVNAccessFile /etc/svn-acl-conf
AuthType Basic
AuthName "Subversion repos"
AuthUserFile /etc/svn-auth-conf
Require valid-user</pre>
<p>Теперь необходимо создать файл /etc/svn-acl-conf. Он будет содержать секции следующего вида:</p>
<pre>[reponame:repopath]
user = access</pre>
<p>Параметр access может быть: r (read &#8211; чтение), rw (read-write &#8211; чтение-запись), или пустой (нет доступа). По умолчанию, при использовании ACLs, пользователи не имеют доступа к репозиторию. Предположим, что у нас есть репо <em>framework</em>, и мы хотим выдать следующие права: john &#8211; чтение, joe &#8211; чтение-запись. Это можно сделать при помощи следующей записи:</p>
<pre>[framework:/]
john =  r
joe = rw</pre>
<p>Также можно создавать группы в секции groups. В дальнейшем при использовании перед именами групп ставится @, например:</p>
<pre>[groups]
staff = joe, george

[framework:/]
john =  r
@staff = rw</pre>
<p>Если вы хотите сделать все репозитории доступными всем пользователям, вы можете добавить секцию для корневой директории каждого репо:</p>
<pre>[/]
* = r</pre>
<h4>В качестве заключения</h4>
<p>В данной статье освещена малая часть всех возможностей, которые Subversion может вам предложить. Этот краткий курс молодого svn-бойца предназначен помочь начинающим сориентироваться как что и зачем. Пользуйтесь документацией, там содержится множество полезных фич и приемов, которые будут полезны как одному разработчику, так и большой, в том числе и распределенной географически, команде. Вы также можете использовать Subversion для своих локальных нужд, указывая file:///path/to/repo вместо того чтобы работать через apache http://yoursvnserver/repos/whatever.</p>
<p>Удачи! )</p>
<h4>Что еще почитать о Subversion?</h4>
<p>Version Control with Subversion ака svnbook: <a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/</a></p>
<p>P.S.<br />
Про установку и настройку SVN вы сможете прочитать в первой части &#8211; <a href="http://hudson.su/?p=518">Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 1 &#8211; установка и настройка</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2009/12/09/subversion-centos-rhel-p2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 1 &#8211; установка и настройка</title>
		<link>http://hudson.su/2009/12/08/subversion-centos-rhel-p1/</link>
		<comments>http://hudson.su/2009/12/08/subversion-centos-rhel-p1/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 20:25:30 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=518</guid>
		<description><![CDATA[По мотивам вики centos &#8211; статья в двух частях про Subversion (http://wiki.centos.org/HowTos/Subversion). Часть первая, в которой рассматривается установка и настройка SVN через mod_dav: Системы Данное руководство применимо к CentOS 4.x/5.x и Red Hat Enterprise (RHEL) 4/5 Ссылки Subversion: http://subversion.tigris.org/ Version Control with Subversion ака svnbook: http://svnbook.red-bean.com/ Установка [root@name]$ yum install mod_dav_svn subversion Устанавливаем перечисленные выше [...]]]></description>
			<content:encoded><![CDATA[<p>По мотивам вики centos &#8211; статья в двух частях про Subversion  (<a href="http://wiki.centos.org/HowTos/Subversion">http://wiki.centos.org/HowTos/Subversion</a>).</p>
<p>Часть первая, в которой рассматривается установка и настройка SVN через mod_dav:</p>
<p><span id="more-518"></span></p>
<h3>Системы</h3>
<p>Данное руководство применимо к <strong>CentOS 4.x/5.x</strong> и <strong>Red Hat Enterprise (RHEL) 4/5</strong></p>
<h3>Ссылки</h3>
<p>Subversion: <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a><br />
Version Control with Subversion ака svnbook: <a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/ </a></p>
<h3>Установка</h3>
<pre>[root@name]$ yum install mod_dav_svn subversion</pre>
<p>Устанавливаем перечисленные выше пакеты. Если у вас еще не утсанавлен apache, то его также необходимо установить. При устновке из yum, также могут устанавливаться дополнительные пакеты, в зависимости от вашей системы и установленных ранее пакетов.</p>
<h3>Конфигурация Subversion</h3>
<h4>Apache</h4>
<p>Перед тем как мы углубимся в дебри, нужно убедиться что у вас есть и сконфигурирован apache. В первую очередь откроем <strong>/etc/httpd/conf/httpd.conf</strong> и как минимум поменяем <strong>ServerName</strong>. Если это не помогает ))) то сверьтесь с официальной документацией по apache (<a href="http://httpd.apache.org">http://httpd.apache.org</a>)</p>
<pre>[root@name] vim /etc/httpd/conf/httpd.conf
[root@name] service httpd start
[root@name] chkconfig httpd on</pre>
<p>Проверьте работает ли веб-сервер, для этого достаточно открыть http://yourmachine в браузере. Работает? Отлично, впереди нас ждут более забавные вещи.</p>
<h4>Конфигурация Apache для Subversion</h4>
<p>Далее нужно сконфигурировать несколько вещей, чтобы apache и subversion могли работать вместе. Открываем примерный файл конфигурации, который шел вместе с пакетом subversion:</p>
<pre>[root@name] cd /etc/httpd/conf.d/
[root@name] vim subversion.conf

# Убедитесь что эти две строки раскоментированы
# это значит apache будет загружать данные модули
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so</pre>
<p>Добавьте или подредактируйте следующие строки для базовой аутентификации и указания места расположения репозиториев</p>
<pre>&lt;Location /repos&gt;
DAV svn
SVNPath /var/www/svn/repos
AuthType Basic
AuthName "Subversion repos"
AuthUserFile /etc/svn-auth-conf
Require valid-user
&lt;/Location&gt;</pre>
<p>Локация &#8211; это строка запроса, которая будет передаваться apache через URL, например http://yourmachine/repos указывает на SVNPath, который вы указали. Пример выше не является истиной первой инстанции, поэтому данные параметры вы можете настраивать как вам угодно (да, и не забывайте сохранять файл после того как отредактируете его)))).</p>
<p>Далее нам надо создать файл с паролями для аутентификации (этот файл мы уже прописали в конфигурации выше). Мы воспользуемся для этого утилитой htpasswd. В первый раз ее надо запускать с параметрами <strong>-cm</strong>. При этом будет создан новый файл и пароль будет зашифрован при помощи алгоритма MD5. Далее нужно использовать только ключ <strong>-m</strong>.</p>
<pre>[root@name] htpasswd -cm /etc/svn-auth-conf yourusername
New password:
Re-type new password:
Adding password for user yourusername
[root@name] htpasswd -m /etc/svn-auth-conf anotherusername
New password:
Re-type new password:
Adding password for user anotherusername</pre>
<h4>Конфигурирование репозитория</h4>
<p>Далее нужно создать репозиторий, куда будут загружаться ваш файлы. Это несложно сделать с помощью инструментария, который идет в комплекте с svn.</p>
<pre>[root@name] cd /var/www/
[root@name] mkdir svn
[root@name] cd svn
[root@name] svnadmin create repos
[root@name] chown -R apache:apache repos
[root@name] service httpd restart</pre>
<p>Протестируйте репозиторий через браузер http://yourmachine/repos. Сначала должно отобразиться окошко с запросом имени и пароля. После успешной аутентификации должна отобразиться страница ревизии 0. Если все было именно так, значит наш репозиторий настроен. Если нужно много репозиториев, обратитесь к документации в начале данной статьи. Ну чтож, приступим к использованию нашего репозитория )</p>
<p><strong>P.S.</strong><br />
Про работу с SVN вы сможете прочитать во второй части &#8211; <a href="http://hudson.su/?p=526">Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 2 – работа с svn</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2009/12/08/subversion-centos-rhel-p1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Установка QmailToaster на CentOS 5 или Qmail сравнительно малой кровью</title>
		<link>http://hudson.su/2009/11/27/centos5-qmailtoaster-install/</link>
		<comments>http://hudson.su/2009/11/27/centos5-qmailtoaster-install/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 21:56:27 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[qmail]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=503</guid>
		<description><![CDATA[Для меня установка QMail это всегда огонь, вода и медные трубы. В репозиториях для CentOS 5 судя по всему пакета нет (и вряд ли будет), поэтому наименее тернистым выглядит полуавтоматическая установка QmailToaster, описание которой приведено ниже (перевод официальной документации): Сразу оговорюсь, что CentOS 5 x86_64 у меня уже была установлена, поэтому шаги по установке ОС [...]]]></description>
			<content:encoded><![CDATA[<p>Для меня установка QMail это всегда огонь, вода и медные трубы. В репозиториях для CentOS 5 судя по всему пакета нет (и вряд ли будет), поэтому наименее тернистым выглядит полуавтоматическая установка <a href="http://wiki.qmailtoaster.com/index.php/CentOS_5_QmailToaster_Install">QmailToaster</a>, описание которой приведено ниже (перевод официальной документации):</p>
<p><span id="more-503"></span><br />
<em>Сразу оговорюсь, что CentOS 5 x86_64 у меня уже была установлена, поэтому шаги по установке ОС опускаем.</em></p>
<h3>Подготовка к установке QmailToaster</h3>
<p>Прежде всего проверяем selinux</p>
<pre>[root@name ~]# getenforce

Если отображается Disabled, то все окей. Если нет, то отключаем в ручную:
[root@name ~]# vim /etc/selinux/config

Заменяем:
SELINUX=enforcing
На:
SELINUX=disabled</pre>
<p>Аналогичную операцию можно выполнить, запустив утилиту setup и</p>
<li>Выбрать <strong>Firewall Configuration</strong></li>
<li>Выбрать <strong>Run Tool</strong></li>
<li>Изменить <strong>Security Level </strong>на <strong>Disabled</strong>.</li>
<li>Изменить <strong>SELinux</strong> на <strong>Disabled</strong>.</li>
<li>Выбрать <strong>OK.</strong></li>
<p>После желательно перезагрузиться, чтобы изменения в настройках selinux вступили в силу.</p>
<p>Если вы хотите чтобы selinux оставался активен, нужно выполнить такую команду:</p>
<pre>setsebool -P httpd_can_network_connect=1</pre>
<h4>Директория для инсталяции</h4>
<p>Войдите в систему под root&#8217;ом, создайте директорию qtms-install</p>
<pre>mkdir -p /usr/src/qtms-install</pre>
<h4>Пре-установочные скрипты</h4>
<p>Перемещаемся в директорию /usr/src/qtms-install, которую создали ранее</p>
<pre>cd /usr/src/qtms-install</pre>
<h4>cnt50-deps.sh и cnt5064-deps.sh</h4>
<p>Для i386: нужно скачать скрипт <strong>cnt50-deps.sh</strong></p>
<pre>wget http://www.qmailtoaster.com/centos/cnt50/cnt50-deps.sh</pre>
<p>Для x86_64: нужно скачать скрипт <strong>cnt5064-deps.sh</strong></p>
<pre>wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-deps.sh</pre>
<p>Далее их нужно запустить:<br />
Для i386: выполняем <strong>cnt50-deps.sh</strong></p>
<pre>sh cnt50-deps.sh</pre>
<p>Для x86_64: выполняем <strong>cnt5064-deps.sh</strong></p>
<pre>sh cnt5064-deps.sh</pre>
<h4>cnt50-perl.sh и cnt5064-perl.sh</h4>
<p>Для i386: нужно скачать скрипт <strong>cnt50-perl.sh</strong></p>
<pre>wget http://www.qmailtoaster.com/centos/cnt50/cnt50-perl.sh</pre>
<p>Для x86_64: нужно скачать скрипт <strong>cnt5064-perl.sh</strong></p>
<pre>wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-perl.sh</pre>
<p>Для i386: выполняем <strong>cnt50-perl.sh</strong></p>
<pre>sh cnt50-perl.sh</pre>
<p>Для x86_64: выполняем <strong>cnt5064-perl.sh</strong></p>
<pre>sh cnt5064-perl.sh</pre>
<p>Скрипт запросит ручную конфигурацию CPAN, отвечайте <del>нихт ферштейн</del> no ))<br />
Далее скрипт запросит несколько раз yes/no, не обращайте внимания, просто нажимайте ENTER, будет выбран ответ по-умолчанию.</p>
<h4>cnt50-svcs.sh и firewall.sh</h4>
<p>Скачиваем <strong>cnt50-svcs.sh</strong> (не забывайте, если у вас CentOS 5 x86_64, заменяйте cnt50 на cnt5064, т.е. будет <strong>cnt5064-svcs.sh</strong>):</p>
<pre>wget http://www.qmailtoaster.com/centos/cnt50/cnt50-svcs.sh
или
wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-svcs.sh</pre>
<p>Редактируем <strong>cnt50-svcs.sh (cnt5064-svcs.sh)</strong> вашим любимым редактором:</p>
<pre>vim cnt50-svcs.sh
или
vim cnt5064-svcs.sh</pre>
<p>Находим строку <strong>MYSQLPW=YOUR_MYSQL_ROOT_PASSWORD</strong> и меняем <strong>YOUR_MYSQL_ROOT_PASSWORD</strong> на пароль mysql пользователя root. Сохраняем файл.</p>
<p>Скачиваем <strong>firewall.sh</strong></p>
<pre>wget http://www.qmailtoaster.com/centos/cnt5064/firewall.sh
или
wget http://www.qmailtoaster.com/centos/cnt5064/firewall.sh</pre>
<p>Редактируем <strong>firewall.sh</strong></p>
<pre>vim firewall.sh</pre>
<p>Находим строку <strong>MYIP=YOUR_IP_ADDRESS</strong> и изменяем <strong>YOUR_IP_ADDRESS</strong> на IP вашего сервера.</p>
<p>Запускаем <strong>cnt50-svcs.sh</strong></p>
<pre>sh cnt50-svcs.sh
или
sh cnt5064-svcs.sh</pre>
<p>Этот скрипт включает все необходимые сервисы. Затем скрипт коннектится к mysql как root, создает и настраивает привилегии для vpopmail, создает симлинк на krb5, редактирует php.ini, устанавливает runlevel 3 и настраивает файрволл, вызывая <strong>firewall.sh</strong>. Некоторые сервисы могут выдавать ошибки во время работы скрипта, не беспокойтесь ))</p>
<p>Вы также можете утратить коннект если ваша сеть <strong>192.168.0.0/16</strong>. Для того чтобы поправить это досадное недоразумение, поправьте должным образом <strong>/etc/sysconfig/iptables</strong> и перезапустите iptables.</p>
<p>Также может понадобиться поправить строку коннекта к mysql:<br />
если у вас возникает ошибка <em>&#8216;Access denied for user &#8216;root&#8217;@'localhost&#8217; (using password: NO)&#8217;</em>, измените строку <strong>cnt50-svcs.sh</strong> (<strong>cnt5064-svcs.sh</strong>)</p>
<pre>mysqladmin -u root password $MYSQLPW
на
mysqladmin -u root -p$MYSQLPW</pre>
<h4>Обновление пакетов</h4>
<p>Теперь нужно обновить все пакеты в системе:</p>
<pre>yum -y update</pre>
<p>После успешного завершения обновления, перезагружаемся</p>
<pre>reboot</pre>
<h3>Установка QmailToaster</h3>
<h4>Загрузка необходимых пакетов QmailToaster</h4>
<p>Логинимся под root&#8217;ом и переходим в директорию /usr/src/qtms-install/</p>
<pre>cd /usr/src/qtms-install</pre>
<p>Загружаем скрипт <strong>current-download-script.sh</strong>, который и загрузит нам все необходимые пакеты для последующей установки и запускаем его:</p>
<pre>wget http://www.qmailtoaster.com/info/current-download-script.sh
sh current-download-script.sh</pre>
<p>Вы можете спросить: <em>а если возникнут проблемы? Например ошибки сборки RPM</em>:</p>
<pre>Bad exit status from /var/temp/rpm-tmp.84356 (%build)
      error: File not found by glob: /usr/src/redhat/RPMS/x86_64/vpopmail-toaster*.rpm.</pre>
<p>И потом, при установке qmail-toaster :</p>
<pre>error: Failed dependencies :
      exim conflicts with qmail-toaster-1.03-1.3.16.x86_64
error: Failed dependencies :
      qmail-toaster &gt;= 1.03-1.3.16 is needed by qmail-pop3d-toaster-1.03-1.3.16.x86_64</pre>
<p>Нужно перед инсталляцией деинсталлировать <strong>exim</strong> и его зависимости:</p>
<pre>rpm -e --nodeps arpwatch
rpm -e --nodeps sendmail
rpm -e --nodeps exim</pre>
<p>Это должно помочь.</p>
<h4>Установка пакетов QmailToaster</h4>
<p>Скачиваем cnt50-install-script.sh (cnt5064-install-script.sh) &#8211; инсталлятор QmailToaster</p>
<pre>wget http://www.qmailtoaster.com/centos/cnt50/cnt50-install-script.sh
или
wget http://www.qmailtoaster.org/centos/cnt5064/cnt5064-install-script.sh</pre>
<p>Запускаем инсталятор:</p>
<pre>sh cnt50-install-script.sh
или
sh cnt5064-install-script.sh</pre>
<p>Скрипт запросит подтверждение на установку каждого пакета. Просто нажимаем Enter, чтобы выбирать Yes по умолчанию.</p>
<p>Если после устанвоки ничего не заработает: открываем инсталляционный скрипт, видим там дюжину секций или около того. Вы можете копипастнуть секцию и запустить ее независимо. Например, видим что не работает imap. Запускаем ручками:</p>
<pre>DISTRO=cnt50
ARCH=i386
BDIR=redhat
IMAP=courier-imap-toaster-*.src.rpm
rpmbuild --rebuild --with $DISTRO $IMAP
rpm -Uvh /usr/src/$BDIR/RPMS/$ARCH/courier-imap-toaster*.rpm</pre>
<p>Видим что ошибка возникает потому что пакет cyrus-imap вызывает конфликт. Удаляем его</p>
<pre>yum -y remove cyrus-imapd-2.3.7-2.el5.i386</pre>
<p>Затем опять запускаем проблемный сегмент и тем самым решаем проблему.</p>
<p>Если в ходе инсталляции, при запуске <strong>sh cnt50-install-script.sh</strong> вы получаете ошибки <strong>vpopmail-toaster-5.4.13-1.3.1</strong> (типа таких &#8216;cant run even the simplest ANSI C program&#8230;. create usergroup, create user&#8230;&#8217;):</p>
<li>проверьте, установлен ли postfix командой <strong>rpm -q postfix</strong></li>
<li>если установлен:</li>
<li>пробуеем удалить его <strong>rpm -e &#8211;nodeps postfix</strong></li>
<li>удаляем строку <strong>postfix:x:89:</strong> из <strong>/etc/group</strong></li>
<li>добавьте нужную группу <strong>groupadd &#8211;gid 89 vchkpw</strong></li>
<li>добавьте нужного пользователя <strong>adduser &#8211;gid 89 vpopmail</strong></li>
<li>теперь пробуйте запустить <strong>sh cnt50-install-script.sh</strong> еще раз. Можете пропустить модули, которые были собраны ранее.</li>
<h4>Проверка сервисов</h4>
<p>После установки мы должны убедиться в том что все нужные сервисы будут запущены при перезгрузке.</p>
<ul>
<li>Выполняем команду setup</li>
<li>Выбираем <strong>System Services</strong> и выбираем <strong>Run Tool</strong></li>
<li>Проверям, выбраны ли требуемые сервисы:
<ul>
<li>acpid</li>
<li>anacron</li>
<li>atd</li>
<li>autofs</li>
<li>cpuspeed</li>
<li>crond</li>
<li>freshclam</li>
<li>haldaemon</li>
<li>httpd</li>
<li>iptables</li>
<li>kudzu</li>
<li>messagebus</li>
<li>mysqld</li>
<li>network</li>
<li>ntpd</li>
<li>qmail</li>
<li>smartd</li>
<li>sshd</li>
<li>syslog</li>
<li>xinet</li>
</ul>
</li>
<h4>Install djbdns</h4>
<p>Установка <strong>djbdns </strong>(если вы не хотите <strong>bind</strong>)</p>
<pre>#Удаяем bind
rpm -e --nodeps bind bind-chroot

#Собираем djbdns для i386
rpmbuild --rebuild --with cnt50 djbdns*.src.rpm

#Собираем djbdns для x86_64
rpmbuild --rebuild --with cnt5064 djbdns*.src.rpm

# Устанавливаем djbdns для i386
rpm -Uvh ../redhat/RPMS/i386/djbdns-localcache*.rpm

# Устанавливаем djbdns для x86_64
rpm -Uvh ../redhat/RPMS/x86_64/djbdns-localcache*.rpm

# Добавляем search your-domain.com в /etc/resolv.conf (не забывайте заменять your-domain.com на ваше значение)
echo "search your-domain.com" &gt; /etc/resolv.conf

# Добавляем nameserver 127.0.0.1 в /etc/resolv.conf
echo "nameserver 127.0.0.1" &gt;&gt; /etc/resolv.conf

# перезагружаемся
reboot</pre>
<h4>Конфигурация QmailToaster</h4>
<p>Проверяем статус mail сервера</p>
<pre>qmailctl stat</pre>
<p>Вывод команды должен выглядеть примерно так:</p>
<pre>root@gateway ~]# qmailctl stat
authlib: up (pid 2425) 65 seconds
clamd: up (pid 2425) 65 seconds
imap4: up (pid 2421) 65 seconds
imap4-ssl: up (pid 2423) 65 seconds
pop3: up (pid 2414) 65 seconds
pop3-ssl: up (pid 2409) 65 seconds
send: up (pid 2416) 65 seconds
smtp: up (pid 2418) 65 seconds
spamd: up (pid 2407) 65 seconds
authlib/log: up (pid 2417) 65 seconds
clamd/log: up (pid 2417) 65 seconds
imap4/log: up (pid 2422) 65 seconds
imap4-ssl/log: up (pid 2424) 65 seconds
pop3/log: up (pid 2415) 65 seconds
pop3-ssl/log: up (pid 2413) 65 seconds
send/log: up (pid 2420) 65 seconds
smtp/log: up (pid 2419) 65 seconds
spamd/log: up (pid 2408) 65 seconds</pre>
<h4>Добавляем домен</h4>
<pre># Добавляем домен
/home/vpopmail/bin/vadddomain your-domain.com

# Добавляем пользователя
/home/vpopmail/bin/vadduser you@your-domain.com 

# Редактируем /etc/php.ini и устанавливаем register_globals = On
service httpd restart</pre>
<p>Открываем браузер и переходим по URL http://www.your-domain.com/admin-toaster/<br />
Username: admin<br />
Password: toaster<br />
Тут вы можете изменить пароль.</p>
<pre># Редактируем /etc/php.ini и устанавливаем register_globals = Off, рестартим апач
service httpd restart</pre>
<p>Проверяем полученный mail сервер:</p>
<li>http://www.your-domain.com/webmail</li>
<li>Входите с использованием полного email адреса и пароля</li>
<li>Отправьте самому себе email &#8211; должно работать</li>
<li>Отправьте email на другой (внешний) адрес</li>
<li>Примите письмо на внешний адрес и ответьте на него</li>
</ul>
<p>Если не отображается Isoqlog нужно выполнить следующее:</p>
<ul>
<pre>sh /usr/share/toaster/isoqlog/bin/cron.sh</pre>
</ul>
<p>Уф. Написать это было не менее утомительно чем сделать ) Не говоря уж о том чтобы написать с нуля. Спасибо разработчику QmailToaster, а я на этом пойду спать. Благо то немногое, что мне нужно от Qmail, закрутилось завертелось.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2009/11/27/centos5-qmailtoaster-install/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

