🏠: linux

Переезд в Docker

Устройство этого сайта на сегодняшний день

Наконец-то ковыряние Докера привело к чему-то практическому. Конечно, и раньше я ставил его на работе и поднимал там всякие сервисы, но это были одиночные контейнеры и небольшая настройка. Сейчас реализована задача посложнее — переезд с моего одноплатника Orange Pi PC 2, работавшего веб-сервером без малого 4 года (сколько воды утекло с тех пор!), на неттоп, который я купил в 2016 году, завершивший свою карьеру настольного компьютера, со вставленным туда SSD Samsung 850 EVO 250 ГБ, также освободившийся от настольных задач, и смена парадигмы хостинга с монолита на микросервисы.

Технических подробностей здесь особо не будет (хотя это смешно звучит: ничего, кроме них, тут, в общем-то, и нет), потом добавлю что-то в справочник, а пока просто фиксирую по горячим следам.

На старом сервере стоял Armbian, веб-сервер Apache и база данных MySQL. Был единый каталог /var/www/html, где в корне лежал Wordpress, а в дополнительно созданных подкаталогах — другие сервисы: в /cloud — Nextcloud, в /wiki — Dokuwiki, в /mon — phpSysInfo, позже был добавлен Webtrees в одноимённую подпапку.

Не то чтобы мне нужно было позарез переезжать на новую платформу, но меня немного беспокоило, что хранилищем выступают флешки, и система стоит на карточке microSD. Хоть логи в Armbian и пишутся в память, тем не менее, ресурс флеш-носителей довольно мал — несколько месяцев назад, например, померла флешка для записи резервных копий. Ну и, конечно, хочется освоить что-то новое и быть в курсе современных прикладных направлений в ИТ. Наконец, желательно иметь более переносимую систему, которая не так привязывается к железу и в перспективе будет работать в кластере.

На неттоп, в котором памяти стало 4 ГБ после обмена с ноутбуком, была установлена Ubuntu Server 20.04 LTS с ядром HWE и Docker в качестве платформы. Затем я перенёс туда наработки, которые я делал на тестовых виртуальных машинах, и занялся миграцией данных.

Задача, главным образом, осложнялась тем, что у меня есть только одно доменное имя, и все сервисы должны работать не на поддоменах, что очень просто настраивается, а на путях после доменного имени (префиксах). Многие современные сервисы, упакованные в контейнеры, уже имеют поддержку разных режимов работы через реверс-прокси, но некоторые либо не имеют этой поддержки вовсе, либо она есть, но не работает, как в случае с Nextcloud, где можно указать параметр overwritewebroot, но работать он не будет. Из-за этого пришлось собирать Nextcloud по кускам самому. Но это даже и к лучшему, потому что официальный контейнер Nextcloud, по-хорошему, противоречит самой идее микросервисов, так как там в одном контейнере находится сразу несколько работающих процессов, что больше похоже на виртуальную машину; к тому же, при самостоятельной сборке начинаешь лучше понимать устройство системы.

Я всегда стремлюсь к экономии ресурсов, и по возможности использую либо чистый контейнер Alpine Linux (например, для php-fpm — так уж вышло), либо вариант нужного мне сервиса на базе Alpine. Иногда стремление сэкономить выходит боком — я долго возился с «лёгким» веб-сервером Lighttpd, но в случае с Webtrees не смог решить задачу «красивых ссылок» (pretty URLs) даже с помощью специального форума, и в результате решил остановиться на Nginx как самом модном и распространённом варианте на сегодняшний день, для которого везде есть куча конфигураций.

Порой я упирался в непонимание каких-то вещей, например, как раздавать права на томах, если туда смотрят 2 контейнера — nginx и php-fpm, которые работают от разных пользователей? И как раздать эти разрешения с хоста, где таких пользователей вообще нет? Заводить их там не вариант же.

Заставить работать nginx от учётки www-data у меня не вышло, но потом оказалось, что достаточно раздавать права на том с данными только для php-fpm и nginx можно вообще не трогать, а с хоста можно задавать разрешения даже для несуществующих пользователей, если просто указывать совпадающий ID:

sudo chown -R 82:82 /var/lib/docker/volumes/home_cloud/_data/cloud
# Впрочем, правильнее, наверное, так:
docker exec cloud-php chown -R www-data:www-data /var/www/html/cloud

Отдельная песня с реверс-прокси. Например, рабочий конфиг ярлыков для Nextcloud, чтобы внутри него при проверке получить зелёную галочку, оказался такой:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.nc.rule=PathPrefix(`/cloud`,`/.well-known`)"
  - "traefik.http.routers.nc.middlewares=nc-dav,nc-wellknown,nc-sts"
  - "traefik.http.middlewares.nc-dav.redirectregex.regex=(.*)/.well-known/ca(rd|l)dav"
  - "traefik.http.middlewares.nc-dav.redirectregex.replacement=$$1/cloud/remote.php/dav/"
  - "traefik.http.middlewares.nc-wellknown.replacepathregex.regex=^(/.well-known.*)"
  - "traefik.http.middlewares.nc-wellknown.replacepathregex.replacement=/cloud/index.php$$1"
  - "traefik.http.middlewares.nc-sts.headers.stspreload=true"
  - "traefik.http.middlewares.nc-sts.headers.stsseconds=31536000"

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

Помимо тех сервисов, которые у меня были, я добавил новые:

  • Photoprism — фото- и видеогалерея с распознаванием лиц, геолокацией, распознаванием дубликатов, доступом по ссылкам и т. п.
  • Bepasty — аналог Pastebin, но не только для текста. Можно выкладывать всё, что угодно.
  • Alltube — веб-морда для старого доброго youtube-dl.

Конечно, сервисы эти не то чтобы мне позарез нужны, но так как они место в квартире не занимают, пусть будут, тем более, что пригодиться они вполне могут.

Есть и убытки — не переехала страничка мониторинга, так как в контейнере она хоста не увидит, а на самом хосте поднимать ради этого веб-сервис глупо. Тандем Prometheus + Grafana — это довольно громоздко, трудоёмко и не очень-то осмысленно ради такого мелкого результата. Посмотрим позже, пока нужно хотя бы наладить какое-то резервное копирование.

Продолжение следует.

Ubuntu 19.10

Периодически я ставлю разные дистрибутивы линукса, чаще всего это Ubuntu. На этот раз, начав установку очередной свежей версии, обнаружил, что теперь можно выбрать крайне полезный её вариант:

Также, меня интересовал вопрос, есть ли какой-нибудь хороший редактор кода для Powershell в линуксе. Оказалось, что родной микрософтовский редактор VSCode доступен и прекрасно работает. Теперь можно везде писать скрипты на одном языке и в одном редакторе.

Переехал на новый сервер

Полторы недели назад наконец-то перенёс свой сайт на новый сервер. «Сервер» — это звучит гордо: это такой же, что и раньше, размером с сигаретную пачку пластиковый корпус, в котором заключена маленькая печатная плата. Тем не менее, это полноценный сервер, чему я не перестаю удивляться.

Модель — Orange Pi PC 2, от предыдущей модели с почти таким же названием (Orange Pi PC Plus) он отличается более мощным процессором, гигабитным сетевым интерфейсом и отсутствием wi-fi, который мне и не нужен в данном случае.

Orange Pi PC 2

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

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

Нужно сказать, что на этом компьютере и сейчас всё небезоблачно — например, выключить его командой shutdown из консоли вообще невозможно, только выдёргиванием из розетки, а из-за лицензионных ограничений драйверы под Linux для видеоускорителя Mali-450 могут вообще никогда не увидеть свет, но для моих целей это не нужно, так что я доволен результатом. Из дополнительных плюсов — процессор меньше греется. Безо всякого охлаждения, температура процессора в покое 33-40°, на старом сервере было 44-50°.

Также, я поменял страничку мониторинга — eZ Server Monitor заменил на phpSysInfo, описанный в предыдущей публикации, потому что он умеет определять имя процессора, в отличие от предшественника, пишущего «нет данных». А ещё у него есть мобильное приложение для телефона, непонятно зачем сделанное, но сам по себе факт забавный. Вот как это выглядит:

phpSysInfo

HTTP/2

Включил на этом сайте поддержку модной технологии HTTP/2, где «по сравнению с обычным порошком» всё стало быстрее, выше и сильнее.

На моём маломощном Orange Pi PC Plus это не даёт заметного прироста производительности и пришлось повозиться с установкой, потому что имеется баг в версии Apache 2.4.18, когда просто так модуль http2 включить нельзя, пришлось собирать Апач из исходников, чтобы выудить из него собранный модуль mod_http2.so, добавить в каталог модулей уже установленного Апача и только потом запустить.

Тем не менее, мне просто приятно поддерживать сайт в более-менее актуальном состоянии, а также мне нравятся красивые зелёные галочки онлайн-проверок. 🙂

Изображение без описания

Наконец-то

Хорошие новости — появились более-менее стабильные сборки Armbian на свежем ядре для моего нового сервера Orange Pi PC 2. Красноглазие продолжается!

First stable test images (CLI or desktop) with a modern #64bit kernel 4.13.5 for H5 based #OrangepiPC2
https://t.co/5LTv523zaS #docker #iot pic.twitter.com/y6KZJkD7ZU
— armbian (@armbian) October 9, 2017

https://twitter.com/armbian/status/917440345880834053