Введение
Этот материал является своего рода продолжением, а в некоторых местах - переосмыслением моей уже довольно давнишней статьи Настройка Ubuntu Server 14.04.1 на домашнем сервере. Также я решил отдельно рассмотреть процесс установки и начальной настройки операционной системы: Установка Ubuntu Server 18.04. Благодаря этим двум статьям и, возможно, другим источникам, я исхожу из того, что некое представление о Linux в целом и Ubuntu в частности уже есть, система установлена, а также имеется доступ к консоли (SSH/PuTTY) и Webmin (последнего, впрочем, я буду стараться избегать). Ну и что про значки # и $ известно.
Сразу же хотел бы затронуть тему LVM, т.е. Logical Volume Management. Я в последнее время стал, можно сказать, горячим поклонником этого самого менеджмента, хотя и пользуюсь по сути лишь базовой функцией - объединением физических разделов. Это, само собой, очень удобно для хранилища, но и для корневого раздела может иметь смысл, если вдруг станет ясно, что неплохо бы этот самый корневой раздел "подвигать". Так что при самостоятельной сборке домашнего сервера рекомендую сразу же задействовать эту технологию, даже если вдруг начинаете с одного накопителя.
Другой вопрос, надо ли описывать работу с LVM. Пока, если честно, я такой потребности не ощущаю, ибо есть Webmin и вполне неплохие руководства начиная с, как ни странно, help.ubuntu и заканчивая wiki.gentoo или даже документацией от Red Hat. С другой стороны, Gentoo'шная вики, конечно, имеет некоторую специфику своей ОС, а документация Red Hat еще и полностью на английском. Так что пишите в комментариях - имеет ли смысл сделать авторскую интерпретацию.
Кратко об изменениях
Предлагаю сначала пробежаться по темам, затронутых в статье про 14.04.
Никакого Windows с NTFS на сервере, конечно же, не осталось (равно как и GUI), поэтому везде файловые системы "родные" - ext4. К тому же полностью изменился состав жестких дисков, причем диски "для информации" объединены "по системе" LVM. Для виртуальной памяти используется именно файл подкачки, автоматически созданный установщиком ОС.
Midnight Commander устанавливается из штатного репозитория, манипуляций с ключами не требуется. ACPI отдельно вроде бы тоже не требуется устанавливать.
Несмотря на то, что с точки зрения "внутренностей" ОС переход на systemd является коренным изменением, "внешне" отличия проявляются не так сильно. Главным образом изменились команды для запуска и остановки сервисов. Например, если раньше было:
# service transmission-daemon stop
То теперь пишем:
# systemctl stop transmission-daemon
По сути: вместо service пишем systemctl, а идентификатор сервиса - в конце. Действие enable говорит о том, что сервис необходимо запускать во время загрузки ОС, disable - наоборот. Удобно.
Кстати про transmission-daemon. Манипуляции с пользователем и перемещением конфигурационных файлов по прежнему имеют место быть, чтобы синхронизировать владельца скачанных файлов с "шарой". Только с переходом на systemd имя unix-пользователя для сервиса нужно задавать в /etc/init.d/transmission-demon (параметр USER), а проблема с запуском демона больше не актуальна.
В настройке источника бесперебойного питания, по-моему, вообще ничего не изменилось (не считая systemd), разве что Apache скорее всего не надо трогать. Просто создаем ссылку:
# ln -s /usr/share/nut/www /var/www/html/nut
На температуру процессора и материнской платы (lm-sensors) я, если честно, забил - ничего с ними не сделается, в крайнем случае есть контроль процессора со стороны материнки. Температуру жестких дисков для Webmin предоставляет не hddtemp, как я ошибочно полагал, а средства мониторинга S.M.A.R.T.:
# apt-get install smartmontools
И это как раз важно.
Samba
Представим, что никакого Webmin в нашем распоряжении нет и выполним настройку "шары" вручную. Если при установке по каким-то причинам Samba выбрана не была, то можно ее доустановить через tasksel или apt:
# apt-get install samba
Как это обычно заведено, в режиме суперпользователя редактируем файл /etc/samba/smb.conf (на всякий случай его желательно сначала куда-нибудь скопировать). Формат похож на ini-файлы (параметры сгруппированы по секциям). В Ubuntu комментарии и примеры содержатся прямо в этом файле, поэтому увидеть нужные параметры поначалу может быть непросто.
Сначала проверим секцию [global]. Настройки по умолчанию довольно "мягкие" - рабочая группа уже выставлена в WORKGROUP и разрешен гостевой доступ:
[global]
... workgroup = WORKGROUP
... map to guest = bad user
...
Имя компьютера по умолчанию совпадает с заданным при установке (см. /etc/hostname); можно переопределить параметром netbios name. Если необходимо запретить гостевой доступ, комментируем map to guest.
Есть небольшой нюанс с сетевыми интерфейсами, но он больше характерен для виртуалки с двумя адаптерами. Чтобы доступ к "шаре" гостевой ОС осуществлялся не только по IP, но и по имени (заданному в netbios name или /etc/hostname), нужно явно указать виртуальный адаптер хоста (не забывая про localhost):
interfaces = lo enp0s8
Остальные секции определяют общие ресурсы. Допустим, при установке системы был создан пользователь serv и мы хотим предоставить доступ различного уровня к трем каталогам. Создадим их:
$ mkdir /mnt/lvmred/SHARED $ mkdir /mnt/lvmred/VIDEO $ mkdir /mnt/storage/TORR
Таким образом, все три директории имеют права доступа 755 и владельца serv. /mnt/lvmred и /mnt/storage создавались в качестве точек монтирования файловых систем при установке ОС. Сценарий следующий: SHARED - общедоступный ресурс (мало ли что по сети надо быстро "протащить"), VIDEO - чтение для всех, полный доступ для serv (я формирую медиатеку, поэтому будет жалко, если кто-то что-то наворочает), и, наконец, TORR с доступом только для serv (разбор загрузок).
[SHARED] path = /mnt/lvmred/SHARED writeable = yes public = yes force user = serv guest account = serv
Название секции определяет имя общего ресурса. В нашем случае секции будут совпадать с названиями каталогов, но вообще это необязательно. В параметре path указываем полный путь, writeable - возможность записи, public (или guest ok) - возможность гостевого доступа, force user - принудительно устанавливаемый владелец создаваемых файлов, guest account - пользователь, с которым сопоставляется гость.
"Закрытый" ресурс TORR настраивать пожалуй даже проще:
[TORR] path = /mnt/storage/TORR writeable = yes valid users = serv browseable = no
Добавил параметр browsable = no, чтобы ресурс не отображался при обзоре сети. В параметре valid users перечисляем, у кого будет доступ (в данном случае у пользователя serv).
С медиатекой для выполнения заданных условий придется немного повозиться:
[VIDEO] path = /mnt/lvmred/VIDEO public = yes writeable = yes only user = yes valid users = serv,nobody read list = serv,nobody write list = serv guest account = nobody
Гостя сопоставляем с unix-пользователем nobody ("никто"). Указываем, что доступ к ресурсу возможен только для перечисленного списка пользователей (only user и valid users). В read list дублируем допустимых пользователей для режима чтения, а во write list добавляем только пользователя serv.
Теперь необходимо сопоставить unix-пользователя с samba-пользователем. Делается это так:
# smbpasswd -a serv # smbpasswd -e serv
Первой командой, чтобы не запутаться, задаем пользователю samba тот же пароль, что и unix-пользователю. Второй командой активируем вновь созданного пользователя. Осталось перезапустить сервисы:
# systemctl restart smbd # systemctl restart nmbd
Второй сервис больше про сопоставление имени компьютера с IP адресом, так что его по идее необязательно перезапускать. Для пущей важности, конечно, можно перезагрузить сервер целиком.
В Windows, очевидно, к созданным ресурсам надо обращаться через механизм подключения сетевого диска, чтобы явно указать имя пользователя и пароль.
DLNA
При наличии недостаточно умных SmartTV или Blu-Ray проигрывателей, которые не умеют "в Самбу", придется установить DLNA-сервер. Я пробовал Plex и Emby, последнюю даже оставил в качестве веб-интерфейса для своей коллекции, однако встроенные в эти системы DLNA скорее не работали (во всяком случае с моим плеером Blu-Ray). Поэтому установил классику жанра - MiniDLNA:
# apt-get install minidlna
Тянет за собой немного странные зависимости, но что поделать. Как обычно, требуется адаптировать конфигурацию. Сам файл /etc/minidlna.conf довольно длинный, однако нам потребуется изменить всего несколько параметров:
media_dir=V,/mnt/lvmred/VIDEO root_container=B friendly_name=ServDLNA
Указываем путь (V - тип директории "видео") и для просмотра группируем видеофайлы в соответствии со структурой каталогов. Также предлагаю явно задать имя сервера. Перезапускаем сервис:
# systemclt restart minidlna
Должен сказать, что "plex/emby-совместимая" структура хранения видео и "samba-совместимая" слегка друг другу противоречат. Например я не люблю указывать год выхода в имени файла (а тем более создавать каталог для каждого фильма), поэтому довольно существенную часть базы Emby пришлось править вручную.
Кодирование видео
Задача в каком-то виде всплывала в обзорах процессоров. Собственно говоря, с появлением Ryzen 5 2600 актуальность кодирования именно на сервере отпала, поскольку Райзен обрабатывает BDRemux за вменяемое время (сопоставимое с длительностью кина), не говоря уже о DVD. Тем не менее, решил добавить описание процесса в консоли Ubuntu. Кстати сказать, ремукс получаю программой MakeMKV.
Я пользуюсь утилитой командной строки HandBrake, которая в Ubuntu 18.04 доступна из стандартного репозитория (хотя и не самой последней версии):
# apt-get install handbrake-cli
Программа тянет за собой довольно большое количество зависимостей. К счастью, конфигурировать ничего не надо - все определяется набором параметров, которые должны быть одинаковыми что в Linux, что в Windows. Мой пример для ремукса:
HandBrakeCLI -i _t00.mkv -o thor3.mkv --markers -e x264 -q 21.0 -a 1,2,4 -E copy,copy,copy --width 1280 --decomb --non-anamorphic --keep-display-aspect --x264-preset veryslow --x264-profile high --x264-level 4.1 -s 3,1,4,2,5 --subtitle-default 1
Коротенько (минут на 40) расскажу о применяемых параметрах:
- -i - исходный файл (или папка)
- -o - выходной файл
- --markers - сохранить разметку глав
- -e - видеокодек (265-й тоже поддерживается, только работает очень медленно даже на Райзене - в районе 4-5 кадров в секунду)
- -q - качество. Я для себя выбрал 21 для фильма и 22 для дополнительных материалов. Чем меньше - тем лучше; считается, что меньше 18 ставить не имеет смысла
- -a - номера аудиодорожек (из исходного файла)
- -E - аудиокодеки для каждой дорожки соответственно (copy - простое копирование исходных аудиодорожек)
- --width - ширина кадра результирующего видео
- --decomb - один из вариантов деинтерлейсинга (согласно документации - комбинация yadif, blend, cubic или EEDI2, что бы это ни означало)
- --non-anamorphic - сброс пропорций пикселей до 1:1
- --keep-display-aspect - сохранять исходные экранные пропорции
- --x264-preset - предустановка видеокодека (я использую veryslow для фильма и slower для допов)
- --x264-profile - профиль кодека (ставлю high и не заморачиваюсь)
- --x264-level - уровень кодека (избыточно ставлю 4.1 для HD и 3.1 для SD)
- -s - номера дорожек субтитров из исходного файла
- --subtitle-default - дорожка субтитров по умолчанию (важно - в конечном файле, а не исходном)
Кстати может оказаться полезным "обнулить" кроп: --crop 0:0:0:0 - мало ли, вдруг автоматика ошибется (что часто происходит с дополнительными материалами, которые идут попеременно в 16:9 и условно 2,35:1 в одном файле).
Осталось разобраться, как запустить столь длительный процесс в фоне, чтобы можно было не дожидаться его завершения. Я для себя подготовил скрипт, в котором помимо собственно вызова команды в комментариях оставил типовые комбинации параметров. Сам скрипт вызывал через вспомогательную утилиту nohup "с апострофом". Важно иметь в виду: нужно указывать абсолютные пути как в команде nohup, так и в вызываемом ею скрипте (или делать принудительный переход командой cd). Например:
$ nohup /mnt/lvmred/SHARED/convert &
Здесь /mnt/lvmred/SHARED/convert - скрипт с правами 744 и уже знакомой основной командой конвертирования:
#!/bin/sh cd /mnt/lvmred/SHARED rm done.txt # # MKV extras example #HandBrakeCLI -i Thor_t02.mkv -o Extras02.mkv --markers -e x264 -q 22.0 -a 1 -E copy --width 1280 --crop 0:0:0:0 --decomb --x264-preset slower --x264-profile high --x264-level 4.1 -s 1,2 --subtitle-default 1 # # DVD example #HandBrakeCLI -i LOCKER --main-feature -o locker.mkv --markers -e x264 -q 19.0 -a 1,3 -E copy,copy --decomb --x264-preset veryslow --x264-profile high --x264-level 3.1 -s 1 --native-language rus # # --start-at duration:540 --stop-at duration:120 # --encoder-tune stillimage # HandBrakeCLI -i _t00.mkv -o thor3.mkv --markers -e x264 -q 21.0 -a 1,2,4 -E copy,copy,copy --width 1280 --decomb --non-anamorphic --keep-display-aspect --x264-preset veryslow --x264-profile high --x264-level 4.1 -s 3,1,4,2,5 --subtitle-default 1 echo "done" > done.txt
В скрипте я также использую файл-флаг окончания работы (done.txt), чтобы было сразу понятно - закончилось ли конвертирование. Еще в комментариях (помимо примеров) я оставил для себя параметры начала и окончания, чтобы на пробу можно было сконвертировать короткий фрагмент. duration означает секунды, при этом в --stop-at пишем количество относительно указанного начала, а не абсолютную позицию.
Иногда среди дополнительных материалов попадаются галереи, выполненные в формате видео. Для таких случаев можно задать "тюнинг" видеокодека stillimage, о чем я тоже оставил напоминание. Кстати для фильмов вроде как есть соответствующая настройка - film. Мне это не показалось актуальным - результат примерно как между текущей и следующей ступенью качества (q) без такой настройки. Хотя тут все субъективно, лучше сравните сами.
Остается лишь добавить, что по умолчанию nohup сохраняет вывод в файл nohup.out "рядом" со скриптом, что может быть удобно для последующего анализа. Разве что проценты выполнения этот файл изрядно засоряют.
Примечание от 25.02.2019: конечно, никто не отменял ffmpeg, просто изначально я наткнулся именно на HandBrake. Впрочем параметры последней потенциально более удобные, плюс она умеет работать с папками DVD и Blu-Ray (при отсутствии защиты).
Web-сервер
Использование домашнего сервера в таком качестве напрашивается само собой, поэтому при установке ОС я сразу выбираю LAMP (Linux - Apache - MySQL - PHP).
Apache
Для VDS/VPS "индеец" считается не лучшим вариантом (связку nginx + php-fpm я планирую рассмотреть отдельно), но дома с ним явно проще. В общем файле /etc/apache2/apache2.conf как минимум изменяем настройки для директории /var/www:
<Directory /var/www/> Options FollowSymLinks AllowOverride All Require all granted </Directory>
Из директивы Options убрал Indexes (чтобы не выводился список файлов), а также разрешил использовать файлы .htaccess во вложенных папках. Далее включаем mod_rewrite (для работы так называемых ЧПУ):
# a2enmod rewrite
Перезапускаем сервис (фактически подсказка об этом выводится при включении модуля):
# systemctl restart apache2
Некоторые сайты (CMS, фреймворки) отказываются работать в подпапках. В таких случаях приходится создавать отдельные сайты (виртуальные хосты) с точки зрения веб-сервера и прописывать их в файле hosts в Windows. Минимально это выглядит следующим образом. Создадим файл /etc/apache2/sites-available/example.serv.conf следующего содержания:
<VirtualHost *:80> DocumentRoot /var/www/example.serv/web ServerName example.serv </VirtualHost>
Подразумеваем, что индексный файл сайта (к примеру index.php) находится в /var/www/example.serv/web, а адресом сайта хотим сделать example.serv. Включаем сайт и перезапускаем сервис:
# a2ensite example.serv # systemctl restart apache2
В Windows запускаем Блокнот (или другой текстовый редактор - не важно) от имени администратора (важно) и открываем файл C:\Windows\System32\drivers\etc\hosts (без расширения). Добавляем строку:
192.168.1.2 example.serv
Здесь 192.168.1.2 - IP-адрес сервера.
PHP
В стандартном виде интерпретатор устанавливается без расширений, необходимых большинству фреймворков и CMS. К счастью, в Ubuntu эти расширения устанавливаются через apt. Приблизительный список:
# apt-get install php-curl php-mbstring php-gd php-intl php-sqlite3 php-xml
Также предлагаю скорректировать конфигурацию PHP. Не забывайте, что для каждого режима она своя. В комбинации с Apache используется mod_php, поэтому нам нужен /etc/php/7.2/apache2/php.ini. По большому счету в настройках по умолчанию наиболее существенный недостаток - это "раскрытие" версии PHP в HTTP-заголовках, закроем:
expose_php = Off
И на свой вкус можно скорректировать следующие параметры:
- max_execution_time - максимальное время выполнения скрипта;
- memory_limit - ограничение памяти PHP;
- post_max_size - общее ограничение размера данных POST-запроса;
- upload_max_filesize - ограничение размера загружаемого файла;
- max_file_uploads - максимальное количество загружаемых файлов в одном запросе;
- display_errors- вывод ошибок на "экран";
- display_startup_errors - отдельная настройка вывода неких "загрузочных" ошибок;
- short_open_tag - разрешить использовать "короткий" тег
<?
вместо<?php
; - allow_url_fopen - разрешить открытие файлов по URL.
По идее должно быть так: upload_max_filesize * max_file_uploads < post_max_size (чтобы для других данных формы еще запас оставался). short_open_tag я обычно запрещаю, хотя если в проекте есть любители коротких тэгов, то придется разрешать. allow_url_fopen тоже лучше запретить, а обращение ко внешним ресурсам делать с помощью curl. Вообще говоря, рекомендации по настройке приведены прямо в комментариях: как лучше настроить параметры для разработки и как - для рабочего сайта.
После изменений настроек PHP вновь необходимо перезапустить сервис:
# systemctl restart apache2
FTP
С точки зрения владельцев файлов и прав доступа, ситуация складывается не очень удобная. Есть пользователь serv (в моем случае) с правом входа в систему, и есть пользователь www-data, от имени которого работает Apache2. /var/www принадлежит именно www-data (или даже root), поэтому пользователь serv по умолчанию может лишь читать содержимое этого каталога. Если /var/www принадлежит root, то предлагаю сразу переназначить:
# chown -R www-data:www-data /var/www
Решить противоречие с правами и владельцем может FTP-сервер, работающий с /var/www от имени www-data. Дополнительным плюсом будет возможность указать этот FTP-доступ в IDE для разработки. Я по прежнему пользуюсь NetBeans для PHP - когда-то я делал ее обзор, с тех пор не сказать, чтобы она сильно изменилась.
Webmin поддерживает ProFTPD, его и установим. Правда в репозитории Ubuntu содержится некая базовая версия, но в нашем случае это наверное даже к лучшему.
# apt-get install proftpd-basic
Сначала вносим относительно простые правки в конфигурационный файл /etc/proftp/proftpd.conf, а точнее секцию <Global> в конце:
RequireValidShell off DefaultRoot ~
Тем самым мы разрешили подключения пользователей с запретом входа в систему (к коим относится www-data), а также ограничили иерархию папок домашним каталогом.
Далее я предлагаю быстренько задать пароль для www-data на уровне FTP-сервера. В Webmin это делается в разделе Authentication - User passwords overrides, а чтобы сделать это врукопашную, надо сначала получить хэш командой:
$ ftpasswd --hash
Я с этим моментом сначала подзавис, поскольку ftpasswd выдавал что-то другое по сравнению с Webmin. К счастью, в конце концов разобрался и даже написал отдельную заметку. Итак, добавляем еще одну директиву в секцию Global:
UserPassword www-data $1$OXqJ8nwb$w2PaNtqg1s43yuDJauW/t0
В качестве домашнего задания предлагаю разгадать пароль по указанному хэшу.
После всех сделанных изменений по традиции перезагружаем сервис:
# systemctl restart proftpd
MySQL
Защита установки
Первым делом зачищаем защищаем установку:
# mysql_sequre_installation
Плагин валидации пароля предлагаю не включать (разве что дело происходит на хостинге и создавать пользователей может кто-то еще). Задаем пароль root (для MySQL). На дальнейшие вопросы отвечаем утвердительно: удаляем анонимного пользователя, отключаем удаленный доступ для root, удаляем тестовую БД, перезагружаем таблицу привилегий.
phpMyAdmin
Устанавливаем phpMyAdmin. Поскольку к этому моменту уже есть веб-сервер и FTP, то предлагаю банально скачать архив с сайта, распаковать локально и залить содержимое по этому самому FTP в /html/phpmyadmin (/var/www - домашняя папка www-data, а корень FTP ограничили в настройках, так что полный путь получаем в виде /var/www/html/phpmyadmin). Заходим на http://192.168.1.2/phpmyadmin/ (где 192.168.1.2 - IP-адрес сервера) и понимаем, что под root войти не получается.
Создадим пользователя MySQL. Начинаем (пользователь MySQL root, интерактивный ввод пароля):
# mysql -u root -p
Хотя вообще-то при запуске mysql от суперпользователя мы и так заходим под root (MySQL), так что параметры можно не указывать. Попадаем в командную строку самой MySQL. Выполняем запросы:
mysql> CREATE USER myadmin@localhost IDENTIFIED BY 'password';
Вместо password, конечно, пишем "нормальный" пароль. Точка с запятой в конце обязательна - это окончание запроса. Так создается новый пользователь myadmin с локальным доступом (@localhost). Далее предоставляем все привилегии (права доступа)...
mysql> GRANT ALL PRIVILEGES ON * . * TO myadmin@localhost;
... и очищаем кэш привилегий:
mysql> FLUSH PRIVILEGES;
Выход "из MySQL" - exit (без точки с запятой ). По идее теперь можно заходить в phpMyAdmin под только что созданным пользователем. Админка, впрочем, еще не настроена, о чем выдаются предупреждения. Для создания конфигурационного файла открываем http://192.168.1.2/phpmyadmin/setup/
Как я понял, если сначала зайти в несконфигурированный phpMyAdmin, а потом перейти в /setup, то конфигурационный файл сформируется автоматически. Если этого по каким-то причинам не произошло, нужно нажать "Новый сервер" и при необходимости ввести параметры подключения (вообще-то значения по умолчанию скорее всего подходят). Еще мне в современных версиях не нравится разбиение дерева на страницы. Быстрее всего радикально увеличить параметр $cfg['MaxNavigationItems'] (Панель навигации - Дерево навигации - Максимальное количество пунктов в ветке). После настройки скачиваем получившийся файл и заливаем в корень сайта.
Пример скрипта резервирования
Напишем простой скрипт (понятное дело, можно настроить Webmin, но это не спортивно ) для резервирования базы MySQL под названием example, причем архивы старше 10 дней будем удалять. Поскольку дело будет происходить под root, для утилиты mysqldump передавать логин и пароль mysql не требуется. Вообще сначала бы надо переводить сайт в режим обслуживания, но это уже зависит от сайта.
Сначала создадим каталог для архивов:
# mkdir ~/mysql
Скрипт же может выглядеть следующим образом:
#!/bin/sh # принудительно переходим в домашнюю директорию, чтобы не писать абсолютные пути cd /root # формируем переменную для имени файла на основе текущей даты now=$(date +"%Y%m%d") fname=mysql/example_$now # выводим текущую дату для логирования echo [$now] # Вставить команды перевода сайта в режим обслуживания. # Например для сайта на Drupal: # drush offline # создаем дамп БД mysqldump example > $fname.sql # вставить команды перевода сайта в рабочий режим, например: # drush online # архивируем дамп tar --remove-files -czf $fname.tar.gz $fname.sql # удаляем дампы старше 10 дней for FILE in `find mysql -type f -mtime +10`; do rm $FILE done
В цикле строго обратные апострофы (для выполнения команды find). Надеюсь, что тут происходит, более-менее понятно из комментариев. Любопытны возможности работы с переменными и особенно цикл по найденным файлам. Сохраним скрипт под именем /root/db-backup и присвоим права доступа 700 (чтобы был "виден" только root).
# chmod 700 /root/db-backup
Добавим скрипт в cron. Открываем:
# crontab -e
И в конец открывшегося файла добавляем строку:
0 2 * * * /root/db-backup >> /root/db-backup.log 2>&1
Первые 5 значений определяют расписание задачи - минуты, часы, день месяца, номер месяца, день недели. Звездочки, соответственно, означают все возможные значения. Таким образом, я задал ежедневное выполнение задания в 2 часа ночи. Далее указываем полный путь к нашему скрипту и перенаправляем вывод в файл. Двойной >> означает добавление (тогда как одинарный > каждый раз файл бы перезаписывал), а загадочная конструкция 2>&1 означает перенаправление вывода ошибок туда же, куда и перенаправляется основной вывод, т.е. в тот же файл db-backup.log.
Облачная синхронизация
mega.nz
Преимуществами этого облачного хранилища является 50 "бесплатных" гигабайт, а также заявленное сквозное шифрование. Имеются, впрочем, ограничения на передаваемые объемы. Сравнительно недавно появился официальный инструментарий командной строки. Скачиваем пакет для Ubuntu 18.04 (на данный момент сделано неудобно - сначала нажать на Linux, выбрать дистрибутив, а потом еще раз нажать на Linux для загрузки), сохраняем на сервер. Команда для установки будет немного иной:
# dpkg -i megacmd-xUbuntu_18.04_amd64.deb
Она сначала не сработала, поскольку зависимости в таком варианте автоматически не устанавливаются. Воспользуемся небольшим трюком:
# apt-get -f install
Будут установлены необходимые пакеты, а также сама MEGAcmd.
Настроим синхронизацию. Открываем командную оболочку Mega:
# mega-cmd
Входим в аккаунт:
MEGA CMD> login user@example.com password
Если ранее папку в облаке не создавали, то сделаем это сейчас:
user@example.com:/$ mkdir /mysql
Создаем правило синхронизации наших архивов БД:
user@example.com:/$ sync /root/mysql /mysql
Можно выходить из оболочки (exit). Хотя в таком варианте желательно модифицировать скрипт так, чтобы дамп и архив сначала сохранялись во временной директории и только после этого помещались в синхронизируемую папку. Еще одна проблема - для mega-cmd-server не сделали сервис с точки зрения systemd. В качестве выхода из положения предлагаю "добавить в автозагрузку" команду mega-sync, которая и запустит сервер.
Редактируем cron:
# crontab -e
Добавляем задачу:
@reboot mega-sync
Есть несколько предопределенных расписаний (@daily, @weekly и т.д. - названия говорят сами за себя), среди которых @reboot - это и есть выполняемое при запуске системы.
Среди возможностей MEGAcmd меня заинтересовал автоматический бэкап, который каждый раз создает подпапку. Для примера поставлю резервироваться /var/www/html, хотя в реальности лучше наверное так не делать, а выборочно архивировать и только потом заливать в облако. В первую очередь я имею в виду git и composer, благодаря которым резервировать по сути надо лишь загружаемый контент.
# mega-mkdir /www-data # mega-backup /var/www/html /www-data --period="0 0 3 * * *" --num-backups=10
Откуда - куда и максимальное количество копий не вызывают вопросов. Параметр --period - cron-подобный, только в начало добавили секунды и, насколько я понимаю, не реализовали дробные значения. Вместо них надо использовать собственный формат времени, например для бэкапа каждые 20 минут надо задать --period="20M" (не путать с 20m - каждые 20 месяцев ).
Яндекс.Диск
С Яндексом дела обстоят несколько проще - инструкция на русском, да и в целом по сравнению с Мегой все как-то понятнее. В документации есть одна очень длинная команда, которая быстренько все установит. Фактически происходит следующее: добавляется собственный репозиторий Диска, импортируется ключ электронной подписи, обновляется список пакетов и, наконец, собственно установка. Для удобства разобью на составляющие:
# cd ~ # echo "deb http://repo.yandex.ru/yandex-disk/deb/ stable main" >> /etc/apt/sources.list.d/yandex-disk.list # wget http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG # apt-key add YANDEX-DISK-KEY.GPG # apt-get update # apt-get install yandex-disk
cd ~ вставил на всякий случай, чтобы сохранять и импортировать ключ из /root (вдруг находились в какой-то другой папке). Настроим клиент:
# yandex-disk setup
Прокси-сервер скорее всего не используется. Вводим имя пользователя и пароль. При необходимости указываем путь к локальному каталогу диска. И, скорее всего, мы хотим запускать Яндекс.Диск при загрузке, вот только проку от положительного ответа на самом деле нет - как и в случае с Mega, сервис для systemd не предусмотрен. Проторенной дорогой добавляем Диск в cron:
# crontab -e
@reboot yandex-disk start
davfs2 - универсальный доступ по WebDAV
Выше я рассмотрел примеры двух облачных хранилищ, имеющих специализированные утилиты командной строки для linux. Однако есть универсальный способ доступа по протоколу WebDAV с помощью пакета davfs2. Недостатки способа - хранение пароля от облака в открытом виде и сравнительно низкая скорость. Итак, сначала устанавливаем:
# apt-get install davfs2
При установке появится запрос на доступ непривилегированных пользователей к удаленным ресурсам. Допустим, отвечаем Yes (хотя тут смотря как посмотреть). Создадим точку монтирования, например:
# mkdir /media/yandex
Если мы выбрали разрешение доступа, то логично будет установить на директорию права 777 (по аналогии с точками монтирования "физических" файловых систем). Добавляем точку монтирования в /etc/fstab:
https://webdav.yandex.ru /media/yandex davfs user,rw,_netdev 0 0
В начале указывается URL сервиса для доступа по WebDAV. В "человеческих" сервисах ссылка должна быстро извлекаться из раздела справки или поддержки. Важно указание опции монтирования _netdev
, чтобы система не пыталась примонтировать удаленную файловую систему до включения сети. Можно, конечно, написать noauto вместо _netdev, но каждый раз вручную монтировать слегка неинтересно. Далее пишем явки и пароли в /etc/davfs2/secrets (можно как по URL, так и по точке монтирования, второй способ по идее предпочтительнее):
/media/yandex user.example@yandex.ru password
Прежде чем перезагружаться, предлагаю испытать получившийся результат:
mount /media/yandex
Если все в порядке, то при переходе по указанному пути должно появиться содержимое облака.
Я хотел было привести еще примеры, но для работы с Mega.nz по WebDAV все равно нужно сначала поднять локальный сервер через MEGAcmd. По-моему лучше уж сразу настроить синхронизацию или бэкап. Или https://webdav.cloud.mail.ru/ - потенциально все работает по аналогии, однако функция доступна только для платных тарифов. Так что тоже немного мимо.
Распределенные вычисления
В самой первой статье про домашний сервер я рассказывал про распределенные вычисления во благо человечества , как бы пафосно это ни звучало. BOINC-клиент есть и для linux, в частности для Ubuntu прямо в репозитории:
# apt-get install boinc-client boinc-client-opencl
Второй пакет в моем случае не особо актуален - проприетарные драйвера AMD (которые fglrx) на 18-ю Убунту больше не ставятся, а как завести OpenCL на интегрированном видео с "открытыми" драйверами я, к сожалению, не разобрался. AMDGPU-Pro судя по всему тоже не подходит.
Для некоторых проектов желательна поддержка виртуальных машин VirtualBox (зависимостей очень много, не удивляйтесь):
# apt-get install virtualbox boinc-virtualbox
Менеджером будем пользоваться на Windows (Файл - Сменить компьютер). Для удаленного администрирования клиента в файл /etc/boinc-client/remote_hosts.cfg необходимо добавить IP-адрес компьютера с менеджером, например:
192.168.1.3
Традиционно после внесения изменений перезагружаем сервис:
# systemctl restart boinc-client
Заключение
В противовес статьям об установке, на этот раз я умудрился обойтись вовсе без скриншотов. Как и было обещано - статья более техническая, сплошные команды да текстовые файлы. Надеюсь, я рассмотрел достаточно широкий круг вопросов, чтобы можно было получить представление о том, с чего начинать и в каком направлении двигаться.