Сервер для домашних нужд

Мануалов по настройке домашних серверов уже написано тысяча и один. Но я всё-таки зафиксирую свой путь для истории. Возможно, пригодится и мне самому, чтоб в следующий раз не шерстить Интернет.

В это раз я взялся настроить виртуальную машину и иметь в будущем возможность легко перенести конфигурацию на новое железо, если таковое появится.

В хост-машине трудится процессор Intel Atom N2800, который не умеет аппаратную виртуализацию VT-x, и мне доступна лишь установка 32-битной системы (но это не единственный нюанс, см. далее), хотя хост-система 64-битная.

Запуск виртуальной машины

Первым делом ставим VirtualBox. В Debian Testing пакеты уже лежат в репозитории с меткой «contrib». Понадобится основной пакет и пакет расширения.

apt-get install virtualbox virtualbox-ext-pack

Далее создаём и настраиваем виртуальную машину и хранилища для неё.

# Создаём:
vboxmanage createvm --name home --ostype debian --register
# Настраиваем (объемы памяти и название сетевого адаптера по вкусу):
vboxmanage modifyvm home --memory 512 --vram 4 --hwvirtex off --floppy disabled --audio none --nic1 bridged --bridgeadapter1 enp1s0 --nictype1 virtio --cableconnected1 on --accelerate3d off --boot1 dvd --boot2 disk --boot3 none --acpi on --usb off --vrde on --vrdeport 3389
# Добавляем диск на 20 ГБ:
vboxmanage createmedium disk --filename vm/home/home.vdi --size 20480 --variant fixed
# Добавляем в машину SATA-контроллер и цепляем на него диск:
vboxmanage storagectl home --name SATA --add sata --bootable on --portcount 2
vboxmanage storageattach home --storagectl SATA --port 0 --type hdd --medium vm/home/home.vdi
# Цепляем также установочный образ Дебиана:
vboxmanage storageattach home --storagectl SATA --port 1 --type dvddrive --medium debian-testing-i386-netinst.iso
# Запускаем машину:
vboxmanage startvm home --type headless

Далее подключаемся по RDP к машине через, например, freerdp и устанавливаем систему.На этом моменте прошло часов пять в пробах разных установочных образов. Обычно я скачиваю минимальный netinst-вариант Debian Testing и добираю потом пакеты по сети.

  1. Инсталлятор в первом образе переводил виртуалку в состояние с забавным название «GURU MEDITATION» по причине «VERR_TRPM_DONT_PANIC» (что бы это не значило). Это когда работа виртуалки полностью блокируется, а в лог сыплются разнообразные дампы всего подряд для, собственно, дальнейшей медитации над ними.
    figureДаже иконку того самого гуру добавили.
    Замечено в том числе и на ноутбучном Core i5 при отключенном в настройках машины VT-x.
  2. Инсталлятор во втором образе уходил в kernel panic и показывал ошибку «Bad EIP value».
    figure

В конце концов я скачал образ Debian Stable, и вот там-то инсталлятор отработал как следует.

По вкусу устанавливаем нужные пакеты и настраиваем.

# Пакеты:
sudo apt-get update && apt-get install iptables-persistent less man mc net-tools openssh-server sntp
# Настройки:
sudo echo -e '#!/bin/sh\n\nsntp -S 3.debian.pool.ntp.org' > /etc/cron.weekly/sntp && sudo chmod 0755 /etc/cron.weekly/sntp

Я померил производительность и хоста, и гостя утилиткой sysbench.

sysbench --test=cpu --num-threads=1 --max-time=30 run

В однопоточном режиме производительность сравнимая: 8,21 мс на тик у хоста и 7,48 мс у гостя (гость почему-то быстрее?). При пяти потоках гость проседает в полтора раза: 29,3 мс у хоста и 42,73 мс у гостя.Тест памяти показал разрыв на порядок: 620 МБ/с против 54 МБ/с.

sysbench --test=memory --memory-total-size=3G run

По ощущениям, конечно, тормозит. Наверное, таким был мой экспириенс, когда я впервые запускал Линукс (Генту!) на Селероне с тактовой частотой в 850 МГц. Но памяти там было вдвое меньше.

Если понадобятся общие директории с хостом (а мне они понадобятся), следует установить в гостевой системе «Guest Additions» и потом добавить директории.

# Создаём общие директории:
vboxmanage sharedfolder add home --name cctv --hostpath /home/mic/stuff/cctv/
vboxmanage sharedfolder add home --name share --hostpath /home/mic/stuff/share/
vboxmanage sharedfolder add home --name torrent --hostpath /home/mic/stuff/torrent/
# Скачиваем образ:
wget "https://download.virtualbox.org/virtualbox/5.2.6/VBoxGuestAdditions_5.2.6.iso"
# Монтируем в SATA-привод:
vboxmanage storageattach home --storagectl SATA --port 1 --type dvddrive --medium VBoxGuestAdditions_5.2.6.iso
# Внутри виртуалки монтируем образ, устанавливаем зависимости и сами Guest Additions:
sudo mount /media/cdrom0
sudo aptitude install gcc make perl linux-headers-686
sudo /media/cdrom0/VBoxLinuxAdditions.run
# Добавляем запись в /etc/fstab, чтоб монтировалось автоматически.
# Монтировать будем для специальных групп, которые будут созданы после установки соответствующих сервисов, описанных далее.
sudo echo "cctv /home/cctv vboxsf defaults,uid=mic,gid=mic 0 0" >> /etc/fstab
sudo echo "share /home/share vboxsf defaults,uid=mic,gid=mic 0 0" >> /etc/fstab
sudo echo "torrent /home/torrent vboxsf defaults,uid=debian-transmission,gid=mic 0 0" >> /etc/fstab
# Вынимаем диск:
vboxmanage storageattach home --storagectl SATA --port 1 --type dvddrive --medium none

DHCP & DNS

Без этих базовых протоколов никакой сети не получится. Возьму Dnsmaq: просто и сердито.

# Устанавливаем и добавляем в автозагрузку:
sudo aptitude install dnsmasq && sudo systemctl enable dnsmasq
# Создаём файл с настройками:
sudo echo -e "dhcp-authoritative\nread-ethers\ndhcp-range=192.168.1.10,192.168.1.150,24h" > /etc/dnsmasq.d/my.conf

В /etc/ethers можно положить пары «MAC IP», которые будут приняты во внимание при распределении адресов. Т.е. полезно, когда нужно привязать конкретный IP-адрес конкретной машине в сети.

VPN-клиент и VPN-сервер

VPN пригодится, когда нужно безопасно работать в незнакомой сети. Поднимаешь шифрованный туннель — и порядок. Или, бывает, нужно зайти на сайт, где не любят русских (или который не любят сами русские). Возьму OpenVPN.

# Устанавливаем и добавляем в автозагрузку:
sudo aptitude install openvpn && sudo systemctl enable openvpn

VPN-сервер

Придётся перенаправить порт с внешнего сетевого интерфейса, чтобы иметь возможность подключиться извне.Дальше много плясок с приватными ключами и сертификатами.

make-cadir openvpn && cd openvpn
ln -s openssl-1.0.0.cnf openssl.cnf
# Тут просматриваем и заполняем файл ./vars.
source ./vars
./build-ca
./build-key-server server
./build-key laptop
./build-dh
sudo mkdir /etc/openvpn/home && sudo cp keys/{ca.crt,server.crt,server.key,dh2048.pem} /etc/openvpn/home/

Примерный конфиг /etc/openvpn/home.conf сервера:

verb 3
port 1194
proto udp
dev tun1
dev-type tun
server 192.168.10.0 255.255.255.0
keepalive 10 120
ca /etc/openvpn/home/ca.crt
cert /etc/openvpn/home/server.crt
key /etc/openvpn/home/server.key
dh /etc/openvpn/home/dh2048.pem
push "redirect-gateway def1"

Примерный конфиг /etc/openvpn/home.conf клиента:

dev tun
proto udp
verb 3
ca /etc/openvpn/home/ca.crt
cert /etc/openvpn/home/laptop.crt
key /etc/openvpn/home/laptop.key
client
remote-cert-tls server
remote home 1194

Далее настроить форвардинг трафика: раскомментировать net.ipv4.ip_forward=1 в /etc/sysctl.conf и добавить пригоршню правил в iptables.

Тонкая настройка OpenVPN — тема для отдельной огромной статьи. Опций там реально много.

VPN-клиент

Я пользуюсь сервисом prostovpn.ru. Ребята дают стабильный линк всего за 1 бакс в месяц.После оплаты они присылают на почту архив с ключом и сертификатом для OpenVPN. Конфиг будет примерно такой:

nobind
client
remote nl1.pvpn.pw
ca /etc/openvpn/prostovpn/ca.crt
cert /etc/openvpn/prostovpn/client.crt
key /etc/openvpn/prostovpn/client.key
fast-io
remote-cert-tls server
dev tun0
dev-type tun
proto udp
resolv-retry infinite
persist-key
persist-tun
route-nopull
verb 3

Плюс ворох строчек route xxx.xxx.xxx.xxx: список адресов, куда следует ходить через VPN. Пускать через туннель совсем весь трафик нет смысла, да и будет нерационально, наверное. Побережём ребятам канал!

Принт-сервер

Принт-сервер особенно необходим теперь, когда основными информационными терминалами стали смартфоны и планшеты. К каждому смартфону же не подключишь по принтеру.На роутере крутился p910nd, но он слишком уж простой, а простых путей мы не ищем.Я бы взял CUPS, но именно на этом моменте пошёл разбираться с Docker (см. окончание заметки).

DLNA-сервер

Раздавать медиа на телевизор или смартфон удобно через DLNA. Возьму MiniDLNA.

# Устанавливаем и добавляем в автозагрузку:
sudo aptitude install minidlna && sudo systemctl enable minidlna

Настройка сводится к добавлению в /etc/minidlna.conf строчек media_dir=/path/to/somewhere, которые сервис просканирует и составит список медиафайлов к выдаче.

Торренты

Пока не задушили, и можно невозбранно качать — качаем! Возьму Transmission.

# Устанавливаем, добавляем в автозагрузку и сразу останавливаем, чтобы изменить настройки (не сохранятся, если демон запущен):
sudo aptitude install transmission-daemon && sudo systemctl enable transmission-daemon && sudo systemctl stop transmission-daemon

Настройки лежат в /etc/transmission-daemon/settings.json. Не самый привычный формат для конфигов. Стоит обратить внимание на опции «download-dir», «incomplete-dir», «peer-port». В Transmission встроен веб-сервер для управления закачками. Доступ к нему — хост, порт, логин, пароль — можно посмотреть в том же файле настроек.Качает небыстро даже с 50-ти пиров, процессор грузит на 90%. Впрочем, достаточно юзабельно. Понизить приоритет процесса можно в /etc/default/transmission-daemon: раскомментировать строку с START_STOP_OPTIONS переопределив команду systemd для запуска демона.

sudo systemctl edit transmission-daemon
# В открывшемся редакторе написать:
[Service]
ExecStart=
ExecStart=/usr/bin/nice -n 19 /usr/bin/transmission-daemon -f --log-error

Для Android написали неплохой клиент — «Transdrone». Позволяет добавлять и удалять торренты и внешне выглядит симпатично. Правда, иногда выдаёт непонятные ошибки про нестабильное сетевое соединение.

I2P

I2P рядовому обывателю, в том числе и мне, не нужен по большому счёту. Я не употребляю и не смотрю ничего необычного, так что и нырять в Даркнет нет никакой необходимости. Можно посёрфить на правах эксперимента.Оригинальный i2p работает на Java, а тянуть её в хлипкую виртуалку я не хочу. Возьму i2pd.Для Дебиана поддерживается сторонний репозиторий с готовыми пакетами. Пакет скачался с третьей попытки (сервер отдавал «502 Bad gateway»).Настраивается легко. Из коробки запускает кучу подсервисов, каждый из которых открывает себе отдельный порт. Стоит пробежаться по конфигам и отключить ненужное.Сервис умеренно жрёт трафик и системные ресурсы, так что пока оставлю работать. Сделаю посильный вклад в красивую идею децентрализованного веба.figureСтатистика после 15 часов работы.Кстати, закинул парням пуллреквест, чтобы ссылки в веб-интерфейсе не вели в корень сайта: это не работает, если веб-интерфейс является лишь подразделом сайта — ломается навигация. Отклонили.

Видеонаблюдение

«Видеонаблюдение» здесь — это громкое слово. Фактически я ставлю единственную вебкамеру, которая смотрит в одну фиксированную точку. Раньше это было поактуальней, чтоб приглядывать издалека за кошкой. Теперь — чтоб потешить любопытство. Возьму Motion.

# Сначала готовим хост-машину.
# Включаем поддержку USB:
vboxmanage modifyvm home --usb on
# Прокидываем камеру в виртуалку:
vboxmanage controlvm home webcam attach .0
# Прокидывать придётся при каждом запуске виртуалки, пишем скрипт:
echo -e '#!/bin/bash\n\nvboxmanage startvm home --type headless\nvboxmanage controlvm home webcam attach .0' > start_home.sh && chmod a+x start_home.sh
# Далее на гостевой машине.
# Устанавливаем и добавляем в автозагрузку:
sudo aptitude install motion && sudo systemctl enable motion
sudo echo 'start_motion_daemon=yes' > /etc/default/motion

Нет необходимости включать поддержку EHCI (USB 2.0, стало быть). VirtualBox эмулирует камеру сам (мануал), для работы нужны лишь Guest Additions.Настройки хранятся в /etc/motion/motion.conf. Инструмент довольно мощный: можно писать и картинки, и ролики, и при обнаружении движения, и по таймеру. Есть встроенный веб-сервер для просмотра и управления камерами, есть live-стриминг в браузер.Motion создаёт симлинк на последнюю созданную картинку, но VirtualBox по умолчанию запрещает симлинки в общих директориях. Делаем так, а потом перезапускаем машину:

vboxmanage setextradata home VBoxInternal2/SharedFoldersEnableSymlinksCreate/cctv 1

figureСмотрим Пчё…Пнё…Пхёнчхан-2018.Демон поглощает 20% CPU даже при простое. Держать ли его включенным постоянно — это надо смотреть целесообразность.TODO: видео и очистка

Книги и фоточки

Собираюсь использовать сервер как резервное хранилище для файлов. Опять же, можно устроить файлопомойку для оперативного обмена или временного пристанища всяких полезностей. Нужна кроссплатформенность и поддержка со стороны бóльшего количества клиентов. Возьму Samba.

# Устанавливаем и добавляем в автозагрузку. 
# Обращаем внимание на название сервиса. Сервис "samba" тоже существует, но не фунциклирует как ожидается.
sudo aptitude install samba && sudo systemctl enable smbd

В /etc/samba/smb.conf надо добавить новые секции по количеству директорий и указать внутри параметр «path = <путь до директории>». По вкусу — «guest ok = yes» (именно с пробелом), если хочется разрешить анонимусам пользоваться шарой. Либо добавить и активировать пользователей через smbpasswd -a и smbpasswd -e. Пользователи уже должны существовать в системе, т.е. быть добавленными через useradd -M (например).

Мониторинг

Вовсе необязательная вещь. Удобно, однако, следить за заполненностью файлопомойки по наглядным графикам, а не ныряя постоянно в консоль.

sudo aptitude install munin munin-node nginx-light && sudo systemctl enable munin-node nginx

Стоит провести ревизию списка активных плагинов в /etc/munin/plugins/, лишние удалить. Удалять не страшно, это симлинки, позже можно будет вернуть обратно.Подождать 5 минут, пока соберётся первая порция диагностики. Положить в /etc/nginx/sites-enabled/munin примерно такое:

server {
    listen 80 default_server;
    server_name home;
    location /munin/ {
        alias /var/cache/munin/www/;
        index index.html;
    }
}

Перезапустить nginx: sudo service nging reload. Теперь по адресу «http://home/munin/» появятся красивые графики.

В итоге

Что хотел, в итоге получил. Все сервисы крутятся без скрипа. Единственное что напрягает — производительность. Слабый процессор вкупе с софтверной виртуализацией еле вывозят на одном ядре всю честную компанию демонов, средняя загрузка колеблется в районе 1.5.

Когда почти всё настроил, на работе коллега завёл разговор про Docker. Трендовая нынче штука, во взрослой разработке чуть ли не индустриальный стандарт уже. Руки всё не доходили попробовать, а тут стало интересно, будет ли выигрыш по производительности. Все эксперименты — в следующей заметке!

Добавить комментарий

Ваш e-mail не будет опубликован.

Я бот

Я не бот