Домашний облачный сервер на 10 Ватт? Вполне!

в 22:54, , рубрики: Без рубрики

Привет пользователям Хабра.

Сегодня хочу рассказать про домашний веб-сервер, который одновременно прекрасно выполняет функции домашнего медиа-центра (mp3, ip-tv, video, uPnP и т.д.).

Все началось с того, что я уже некоторое время использовал для внутренних нужд сервер HP MicroServer N36L с RAID5 на 4 терабайта(3x2GB HDD WD Green + 8 Gb ECC RAM), с виртуальными машинами на оракловском vBox, который в принципе и неплох, но его постоянное жужжание беспокоило членов семьи в смысле зря съедаемых киловатт в год (если будут интересующиеся, расскажу о нем в одном из следующих постов).
К тому же хотелось чего-нибудь более современного, с возможностью использования в качестве полноценного медиа-центра с прямым подключением к телевизору.

После долгих поисков и сравнений мною был выбран актуальный на текущий момент девайс на rt3188-чипсете: K-R42, 4-х ядерный ЦПУ, с 2Гб озу и 4Гб флеш-памяти (хотя на коробке было гордо указано 8Гб) и 4-х ядерным графически ядром Mali400 на андроиде 4.2.2.

Конечно, все нижеописанное вполне подходит и для других подобных устройств, подключаемых через HDMI к телевизору, но для меня существенным плюсом в выборе было наличие полноценного корпуса для нормального теплообмена, оптического разъема SPDIF для звука и современного чипсета.

Стоимость K-R42 колеблется в районе 90-120$ (geekbuying.com, aliexpress.com вместе с пересылкой), что правда дороже 2-х ядерных стиков/боксов, но сопоставимо со многими другими на том же rt3188 чипсете.

Стоит отметить, что как медиа-центр он работает на ура: актуальный на сегодня XBMC 12.2 Frodo на нем установился и запустился без каких-бы то ни было проблем, управление с пульта довольно гладкое и с этим особых проблем не возникало. Благодаря внешней антенне беспроводная связь работает очень стабильно, нагревается в процессе работы не так чтобы сильно, но под нагрузкой заметно теплый.

1. Ставим линукс.

Какой – мне особой разницы не было, но для простоты выбрал Debian wheezy.

К сожалению, под Mali400 нет работающих драйверов, чтобы получить полноценное ускорение 3D-графики, поэтому вариантов пока нет – надо использовать chroot-окружение, вместо того чтобы перепрошивать девайс начисто на линукс (соответствующие руководства есть уже в сети).
Благо для этого под андроид есть замечательный app: Linux Deploy, дающий на выбор любой из существующих мэйнстрим-дистрибутивов.

Детально описывать не буду, установка довольно тривиальна: достаточно запустить приложение, выбрать желаемую конфигурацию и нажать старт.
Вставив в медиабокс microSD-карту на 8Гб, я выбрал установку на раздел SD-карты без графического окружения(есть конечно же и опция для желающих получить графический десктоп через VNC), в результате установился Дебиан, с автозагрузкой SSH и sudo-пользователем android с паролем changeme.

Заходим по SSH для дальнейшей настройки:

ssh android@<ip-of-the-box>


2. Пользователи и прочая...

Пароль пользователя android естественно стоит сменить с changeme на что-нибудь посеръезнее:

passwd

а также для рута отключим возможность логина по SSH в /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

PermitRootLogin yes → PermitRootLogin no

если необходимо создать своего полноценного пользователя, то

sudo adduser username

и не забудем добавить его в группы, в которых присутсвует пользователь „android“:

sudo adduser username aid_system aid_radio aid_bluetooth aid_graphics aid_input aid_audio aid_camera aid_log aid_compass aid_mount aid_wifi aid_adb aid_install aid_media aid_dhcp aid_sdcard_rw aid_vpn aid_keystore aid_usb aid_drm aid_available aid_gps aid_media_rw aid_mtp aid_drmrpc aid_nfc aid_sdcard_r aid_shell aid_cache aid_diag aid_net_bt_admin aid_net_bt aid_inet aid_net_raw aid_net_admin aid_net_bw_stats aid_net_bw_acct

В противном случае ваш новый пользователь может не иметь доступа к некоторым устройствам/интернету и т.п.
Необходимые группы можно всегда посмотреть по

groups android

Сделаем теперь обновление свежеустановленной системы:

sudo apt-get update
sudo apt-get dist-upgrade

инсталлируем таскменеджер:

sudo apt-get install cron

Чтобы обеспечить доступ к нашему серверу извне, регистрируемся на каком-нибудь DynDNS-сайте (dyn.com, noip.com и т.п.), и инсталлируем клиента для обновления нашего динамического IP-адреса(я использовал ddclient):

sudo apt-get install ddclient

Вот пример конфигурации ddclient:

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

protocol=dyndns2
use=web, web=checkip.dyndns.com/, web-skip='IP Address'
server=www.dyndns.com
login=myserveruser
password='mydyndnspassword'
myserver.dyndns.org

На роутере необходимо разрешить Port Forwarding из интернета для портов 22(SSH), 80(HTTP), 443(HTTPS) на IP нашего „микро“-сервера.


3. Ставим LAMP

Здесь все достаточно тривиально:

sudo apt-get update
sudo apt-get install apache2 mysql-server php5 php5-curl php5-gd php5-mysql php-apc

Для удобства дальнейшей настройки ставим графическую панель (вебмин)

cd /tmp
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.660_all.deb
sudo dpkg -i webmin_1.660_all.deb
sudo apt-get -f install
sudo service webmin start

(В целях экономии ресурсов вебмин я все время запускаю вручную только когда нужно)

Теперь можно заходить на https://<ip-of-the-box>:10000 с пользователем android и настраивать все что душе угодно.

Если это еще не сделано, перезагружаем вебсервер, чтобы активировать все установленные нами модули:

sudo service apache2 restart


4. Автозагрузка

Для того, чтобы наши службы-демоны автоматически загружались в chroot-окружении при старте нашего бокса, в Linux Deploy предоставляется скрипт /etc/init.d/myscrypt

Мой выглядит так:

#!/bin/sh
case "$1" in
  start)
    /bin/mount -a
    /etc/init.d/mysql start
    /etc/init.d/apache2 start
    /etc/init.d/ddclient start
    /etc/init.d/cron start
;;
  stop)
    /etc/init.d/apache2 stop
    /etc/init.d/mysql stop
    /etc/init.d/ddclient stop
    /etc/init.d/cron stop
    /bin/umount /mnt/usb
;;
  *)
     echo "Usage: $0 {start|stop}"
;;
esac

При „выключении“ медиаплеера с пульта устройство вместо полного отключения переходит в дежурный режим(многие в сети считают эту особенность недостатком, но в нашем случае является неоспоримым достоинством!), при этом все запущенные службы продолжают работать. Загрузка процесора порядка 5%, и всего на одно ядро из 4-х!


5. Устанавливаем ownCloud

5-ой стабильной версией этого облачного сервиса можно уже вполне комфортно пользоваться. Очень подробно установка owncloud описана на официальной странице(http://doc.owncloud.org/server/5.0/admin_manual/), здесь приведу основные шаги относительно к нашей инсталляции:

  • Создаем базу данных, например через вебмин-панель, и пользователя для этой базы с полными правами на нее.
  • Инсталлируем owncloud. На текущий момент появился репозиторий, который сильно упрощает процесс:

sudo echo 'deb http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_7.0/ /' >> /etc/apt/sources.list.d/owncloud.list 
sudo apt-get update
sudo apt-get install owncloud

Теперь заходим в браузере на

http://<ip-of-the-box>/owncloud/

и завершаем настройку owncloud: вводим данные базы MySQL.

В случае, если инсталлятор жалуется на невозможность использования .htaccess,
изменяем в файле /etc/apache2/sites-enabled/000-default AllowOverride на All:

sudo nano /etc/apache2/sites-enabled/000-default

 <Directory /var/www/>
 …
      AllowOverride None → AllowOverride All
… 
</Directory>

а также и в файле /etc/apache2/sites-enabled/default-ssl, если предполагается использовать owncloud с SSL:

sudo nano /etc/apache2/sites-enabled/default-ssl

<Directory /var/www/>
 …
      AllowOverride None → AllowOverride All
… 
</Directory>

и перезагружаем вебсервер:

sudo service apache2 restart

Дальнейшая настройка owncloud обычно не вызывает проблем и подробно описана в руководстве адмнинистратора.

5.1 Если мало места

Размер „облачного“ хранилища при описанной установке ограничен свободным местом на SD-карте. Удобным способом увеличить объем доступного места является вынесение папки owncloud/data на внешний USB-HDD.

Для этого форматируем любым способом внешний USB-диск (например его первый раздел) как ext4, и указываем его точку монтирования в /etc/fstab:

sudo mkdir /mnt/usb_hdd
sudo chmod a+rwx /mnt/usb_hdd

sudo nano /etc/fstab

…
/dev/block/sda1 /mnt/usb_hdd             ext4       noatime,acl,user_xattr        1 1
…

Монтируем диск

mount /mnt/usb_hdd

и переносим owncloud/data на него:

sudo mv /var/www/owncloud/data /mnt/usb_hdd/
sudo ln -s /mnt/usb_hdd/data /var/www/owncloud/data

Теперь объем нашего хранилища ограничен только свободным местом на внешнем USB-диске.


6. Бэкап по плану

Легко и быстро, с помощью duplicity, организовывается регулярный backup на внешний сервер, при желании также с шифрованием.
Если основной файл-сервер как у меня расположен в той же сети и поддерживает wake-on-lan, то этот процесс можно полностью автоматизировать(запуск файл-сервера включительно).

sudo apt-get install wakeonlan duplicity

Мы создадим папку для бэкапов (например /media/backup/owncloud) на файл-сервере 192.168.0.2 с MAC-адресом 33:d0:ab:dd:11:c1,
для которой локальный пользователь user1 имеет права на запись.

Настраиваем беспарольный доступ для пользователя root по SSH на файл-сервер:

sudo su
ssh-keygen -t rsa
(пароль не вводим, просто жмем ввод)
ssh-copy-id -i .ssh/id_rsa.pub user1@192.168.0.2
exit

теперь вносим задания для таскменеджера в crontab:

sudo crontab -e

49 23 * * * 	/usr/bin/wakeonlan  33:d0:ab:dd:11:c1 
0 0 * * sun     /usr/bin/duplicity full --no-encryption --volsize 100 --exclude /tmp --exclude /proc --exclude /sys / rsync://rus@192.168.178.5//media/backup/owncloud
0 0 * * 1-6     /usr/bin/duplicity --no-encryption --volsize 100 --exclude /tmp --exclude /proc --exclude /sys / rsync://rus@192.168.178.5//media/backup/owncloud
0 1 * * sun     /usr/bin/duplicity remove-all-but-n-full 2 --force rsync://rus@192.168.178.5//media/backup/owncloud

По этому плану будет производится бэкап всего нашего chroot-окружения, по воскресениям полный, в другие дни инкрементальный, с удалением старых записей. Если файл-сервер спит, он будет разбужен заранее по сети (конечно если он поддерживает эту функцию).


Ну вот, имеем одновременно работающий медиа-центер и веб-сервер с облачным хранилищем.
Конструктивные критика и предложения приветствуются.

Автор: hrum

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js