Pull to refresh

Сервер дома — AMD, Debian x64, Bind9, Apache 2, PHP5, MySQL5, Trac, Subversion и море удовольствия

Lumber room
Шило в известном месте всё никак не даёт мне покоя.
И решил я поэкспериментировать с установкой сервера дома.

Итак, дано:

1. Домашний интернет с внешним ip на роутере, канал туда/обратно — 8 мбит, провайдер — QWERTY *
2. Бюджет не больше 10 тысяч рублей — чем меньше, тем лучше. **
3. Жгучее желание экспериментов и чего-нибудь эдакого ***

* К сожалению, мой дом не подключает Корбина, у которой более широкие каналы. Приходится довольствоваться тем, что есть
** Получилось путём более-менее реального подсчёта стоимости комплектующих на среднестатический компьютер
*** Для тех, кто хмыкнет и скажет — «эка невидаль, я такое регулярно делаю» — я не так часто что-то настраиваю, больше пишу под уже настроенное, и для меня это чистой воды развлечение — что-то сделать своими руками=)

Ну, все процедуры тут, под катом.

Сразу хочу сказать, что у меня это работает — так, как есть. Дополнительно с бубном я не плясал — но тут вытяжки из моих гуглений и мануалокурений.

Вероятно, что-то можно настроить более гибко или качественно, и я крайне буду рад советам или решениям=)



Подумал, что надо покупать:

1. Материнская плата
2. Процессор
3. Жёсткий диск
4. Память
5. Корпус
6. Кулер на процессор

Выбрал магазин Oldi, собрал online комплектующих на сумму как раз около 10 тысяч — упирая на Intel. Всю ночь ворочался, думал, и на следующее утро пересобрал заказ, упирая на AMD. Разница в деньгах получилась около двух тысяч, а AMD-конфигурация — более подверженная будущим апгрейдам. Например, на Socket 775 в Oldi не было материнских плат до 2k, позволяющих добить оперативку до 16 гигабайт. В общем, решил попробовать — ибо с AMD давно не имел дела.
Проц — AMD x64 2.4 ггц, жёсткий диск взял один, SATAII на 320 гигабайт (как вариант — куплю ещё один расширю до рейд 1), памяти — Кингстон 800мгц, две планки по 2 гигабайта (поставились в Dual), самый дешевый корпус и кулер Igloo — не блистающий дороговизной, но вполне себе охлаждающий (за несколько дней температура не превысила 60 градусов, судя по sensors).

Торжественно с этим всем приехал домой, собрал, подключил к монитору, подключил клавиатуру, провод от роутера, внешний USB-привод, и через полчаса уже смотрел на свежепоставленный Debian.

Настроил переадресацию портов на роутере:

53 порт => Bind9
80 порт => Apache
21 порт => FTP
22 порт => SSH


После чего исполнил три команды:

apt-get update
apt-get upgrade
apt-get install ssh


и улёгся на диван с ноутбуком, продолжая диалог с сервером уже через Putty.

Цели были прозаичны:

1. Bind9
2. Apache2
3. PHP5
4. MySQL 5
5. SVN
6. Trac

Всё это предполагалось сделать на одном недавно купленном домене (предположим, habr.ru), который ещё не был нигде проделегирован.

Bind9. Настройка чайника.



Учитывая то, что о настройке Bind9 лишь слышал, — сразу полез в мануалы и примеры.
В итоге настройку произвёл по этой инструкции, изменив лишь настройку конкретной зоны для домена.
Кроме того, мне хотелось сразу подключить Google Applications для домена, чтобы не иметь дел с настройкой sendmail — в настройках ниже они легко наблюдаются.
Получилось следующее:

1. Создал папку /etc/bind/sites

2. В настройках /etc/bind/named.conf, в самом конце:

include "/etc/bind/named.conf.skazkin";


3. В /etc/bind/named.conf.skazkin:

zone "habr.ru" {
type master;
file "/etc/bind/sites/habr.ru";
};


4. В /etc/bind/sites/habr.ru:

$ORIGIN habr.ru.
$TTL 86400 ; 1 day
@ IN SOA habr.ru. master.habr.com. (
2008291104; serial
10800 ; refresh (3 hours)
3600 ; retry (15 minutes)
3600000 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS ns.habr.ru.
@ IN NS ns.vds.ru.
@ IN A 111.222.333.444
@ IN MX 10 ASPMX.L.GOOGLE.COM.
@ IN MX 20 ALT1.ASPMX.L.GOOGLE.COM.
@ IN MX 20 ALT2.ASPMX.L.GOOGLE.COM.
@ IN MX 30 ASPMX2.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX3.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX4.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX5.GOOGLEMAIL.COM.

ns IN A 111.222.333.444
svn IN CNAME habr.ru.
trac IN CNAME habr.ru.
www IN CNAME habr.ru.


На что хватило понимания мануала.
Непонятно было то, что при попытке прописать всё без @-знака, бинд переставал понимать, что от него хотят — ещё раз прорыв гугл, я подозреваю, что это из-за неправильных отступов (*hic*)?

В общем, тут я как-то вот выкрутился — факт остаётся фактом, домен проделегировался. Но об этом немного позже.

Помимо primary-зоны, мне понадобилось создать ещё и Slave. Пошёл на давно купленный VDS с как-то странно установленным дебианом, там прописал:

1. /etc/bind/named.conf
zone "habr.ru" {
type slave;
file "/var/cache/bind/habr.ru";
masters {
111.222.333.444;
};
};

2. Соответственно, в /var/cache/bind/habr.ru всё то же, что и на домашнем сервере:

$ORIGIN habr.ru.
$TTL 86400 ; 1 day
@ IN SOA habr.ru. master.habr.com. (
2008291104; serial
10800 ; refresh (3 hours)
3600 ; retry (15 minutes)
3600000 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS ns.habr.ru.
@ IN NS ns.vds.ru.
@ IN A 111.222.333.444
@ IN MX 10 ASPMX.L.GOOGLE.COM.
@ IN MX 20 ALT1.ASPMX.L.GOOGLE.COM.
@ IN MX 20 ALT2.ASPMX.L.GOOGLE.COM.
@ IN MX 30 ASPMX2.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX3.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX4.GOOGLEMAIL.COM.
@ IN MX 30 ASPMX5.GOOGLEMAIL.COM.

ns IN A 111.222.333.444
svn IN CNAME habr.ru.
trac IN CNAME habr.ru.
www IN CNAME habr.ru.


После чего и дома, и на VDS сделал
/etc/init.d/bind9 restart # на всякий случай - не будет ли ошибок при рестарте
nslookup habr.ru 127.0.0.1


От лукапа должен получиться успешный ресолв:
bash:/etc/bind# nslookup habr.ru 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: habr.ru
Address: 111.222.333.444


После чего уже при следующих изменениях на домашнем сервере делал только

rnds reload


На VDS отчего-то такого не было, приходилось рестартить демон. Ну, правда, там Bind8.

Через 6 часов, в 23 часа, получив успешную делегацию и успев поужинать, попить чаю и посмотреть телевизор, пошёл настраивать всё прилагающееся.

Apache2, PHP, MySQL



В дебиане установить апач — легче лёгкого.

apt-get install apache2
apt-get install mysql-client mysql-server
apt-get install php5 php5-mysql php5-xmlrpc php5-cli php5-gd php5-curl php5-xsl


В итоге я заполучил с пылу — с жару работающие Apache2, MySQL 5, PHP5 с нужными модулями.

Учитывая то, что MySQL по умолчанию ставится с пустым паролем —

mysqladmin -uroot password мегасекурныйпароль


Ну, и настроить виртуальные хосты.

Решаю всё хранить в /home/sites/

mkdir /home/sites
mkdir /home/sites/habr.ru


Иду в /etc/apache2/sites-availible

Создаю там

touch habr.ru
ln -s /etc/apache2/sites-availible/habr.ru /etc/apache2/sites-enabled/habr.ru


И в habr.ru:

<VirtualHost *>
ServerAdmin master@habr.ru
DocumentRoot "/home/sites/habr.ru"
ServerName habr.ru
ServerAlias www.habr.ru
ErrorLog "/var/log/apache2/habr.ru.error.log"
CustomLog "/var/log/apache2/habr.ru.access.log" common
</VirtualHost>


Затем — рестарт апача

/etc/init.d/apache2 restart


Оставалось то, о чём я уже писал раньше, но про VDS и настраивая это в первый раз — а именно —

SVN + TRAC



Как обычно —

apt-get install subversion
apt-get install libapache2-svn
apt-get install trac


Трак подтянул за собой свои зависимости, и я приступил.

Я выбрал для себя хранилищем сайта папку /home/sites/habr.ru, посему решил около этого и крутиться:

Начал с SVN, ориентируясь на этот мануал
mkdir /home/sites/svn
svnadmin create --fs-type fsfs /home/sites/svn
groupadd subversion
adduser svn_user --ingroup subversion


Опустив строчки про авторизацию и генерацию авторизационных ключей, я сразу полез в Apache

Опять иду в /etc/apache2/sites-availible

cd /etc/apache2/sites-availible
touch svn.habr.ru
ln -s /etc/apache2/sites-availible/svn.habr.ru /etc/apache2/sites-enabled/svn.habr.ru


В svn.habr.ru:

<VirtualHost *>
ServerAdmin master@habr.ru
DocumentRoot "/home/sites/svn"
ServerName svn.habr.ru
ErrorLog "/var/log/apache2/svn.habr.ru.error.log"
CustomLog "/var/log/apache2/svn.habr.ru.access.log" common
<Location />
DAV svn
SVNPath /home/sites/svn
</Location>
</VirtualHost>


Опять перезапускаю Апач:

/etc/init.d/apache2 restart


И — по svn.habr.ru — у меня находится репозиторий.

Попил чаю, приступил к Trac.

Трак решил положить в /home/sites/trac
Сначала создать базу и пользователя:
mysqladmin -uroot -p create trac
Выполнить запрос: GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON trac.* TO 'trac'@'localhost' IDENTIFIED BY 'tracmegapassword';

mkdir /home/sites/trac
trac-admin initenv /home/sites/trac


СВН указывается тот, что уже сделали: /home/sites/svn

А когда trac спросил про БД-хранилище, ответил ему:
mysql://trac:tracmegapassword@localhost:3306/trac


Подправил руками /home/sites/trac/conf/trac.ini — всякие мелкие параметры, и в секции [trac] указал:

[trac]
...
htdocs_location = /tracdocs/


После чего полез в конфиг Apache — создавать хост.

cd /etc/apache2/sites-availible/
touch trac.habr.ru
ln -s /etc/apache2/sites-availible/trac.habr.ru /etc/apache2/sites-enabled/trac.habr.ru


В самом trac.habr.ru:
<VirtualHost *>
ServerAdmin master@habr.ru
DocumentRoot "/home/sites/trac/htdocs"
ServerName trac.habr.ru
ErrorLog "/var/log/apache2/trac.habr.ru.error.log"
CustomLog "/var/log/apache2/trac.habr.ru.access.log" common

<Location />
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/sites/trac
PythonOption TracUriRoot /
</Location>
Alias /tracdocs /usr/share/trac/htdocs
<Location /tracdocs>
SetHandler None
</Location>
</VirtualHost>


После чего — рестарт апача

/etc/init.d/apache2 restart


И в итоге мы имеем незапароленные (внимательно с этим, я-то запаролил позже на глобальном уровне — а кто будет настраивать — не забудьте про секьюрность) SVN и Trac по соответствующим адресам:

svn.habr.ru
trac.habr.ru

В итоге у меня есть работающий (в ближайшем будущем на антресолях) сервер, на котором у меня поднят Trac, SVN, Apache2, MySQL, PHP, Bind9 и крутятся несколько сайтов.

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

Кроме того, я избавился от необходимости оплачивать медленную VDS (скоро перенесу secondary-зону к другу), теперь я знаю что происходит когда мои сайты недоступны (а не «у нас технические проблемы»), а так же могу делать столько доменов, субдоменов и прочего сколько хочется, а не сколько стоит в лимитах хостерского аккаунта.

А так же, теперь торрент качает без «технических» пауз (когда я с ноутбуком на работе).

Единственный минус всего этого — узкий обратный канал. Но у этого QWERTY, в котором я наблюдаюсь, есть трафиколимитированные «широкие» каналы — так что возможно, в скором будущем я буду им отстёгивать ещё 300 рублей за 100 мбит (если обратный трафик не тарифицируется), и буду проводить эксперименты с второй сетевой картой (чтобы торрент с сервера лил без лимитов по другому проводу)

Вот, как-то так.) Море удовольствия для меня и хорошее настроение на неделю=)

Дополнительно, вопрос к телезрителям: в какой блог лучше перенести для широкой публики — «Я умный», или «Linux для всех», или «Системное администрирование»?=) Учитывая не особо глубокие инструкции по применению?)

UPDATE: Вот только что немношка поседел — сервер перестал отзываться. Я забыл настроить самое главное — статический ip!

Позвонил жене, отдал инструкции о новых перенаправлениях, и — вуаля —

mcedit /etc/network/interfaces
# удаляю всё, что относится к eth1 и добавляю:
auto eth1
iface eth1 inet static
address 192.168.1.5
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.0.255
gateway 192.168.1.1
#сохраняю, закрываю и потом...
/etc/init.d/networking restart

На одну проблему стало меньше=)

Сегодня приду домой и воткну туда Wi-Fi — и обновлю этот пост с учётом Wi-Fi-настройки=)

UPDATE2:

Не проверил работоспособность ProFTPD извне!
Надо открыть /etc/proftpd/proftpd.conf и туда:

DefaultAddress 111.222.333.444
Port 21
PassivePorts 60000 60010
MasqueradeAddress 111.222.333.444


И внести соответствующие перенаправления портов на роутере! (для пассивных портов.). У меня их 10 — потому что не ожидается много коннектов
Tags:
Hubs:
Total votes 44: ↑38 and ↓6 +32
Views 4.1K
Comments Comments 66