Блоги

Собираем домашний сервер. Часть 0, вводная.


100_4017.JPG_smaller.jpg

Этим постом я начинаю серию, в которой расскажу о процессе сборки, настройки и эксплуатации домашнего сервера.

Начать же я хочу с изложения предпосылок, которые обусловили выбор железа, софта и настроек, о которых будет рассказано далее.

Сейчас в квартире любого гика скапливается изрядное количество довольно умных девайсов, умеющих ходить в интернет, играть музыку и делать многие другие полезные вещи. Все это хозяйство в первую очередь увязывается в сеть с помощью Wi-Fi и, в случае стационарников, Ethernet. В центре сети оказывается какой-нибудь недорогой роутер-точка-доступа. У некоторых со временем заводится еще и отдельная машинка, работающая файлопомойкой и торрент-качалкой (свежие релизы своего любимого дистрибутива раздавать на благо сообщества, а не поганый пиратский софт качать, вестимо).

В этом отношении и моя семья не стала исключением. В качестве роутера у нас трудился ASUS WL-520GU с прошивкой от Олега. ну а семейной файлопомойкой работал допотопный ноутбук Toshiba Satellite Pro 4600 с подключеным внешним USB HDD. До поры до времени эта конструкция всех устраивала, хотя скорость работы роутера под нагрузкой былаа не ахти какой, а старенький ноутбук делал файлопомойку не слишком шустрой. Стояло все это дело под столом:

100_4016.JPG_smaller.jpg

Но в один прекрасный момент HomeNet устроил нам эпичный факап с недельным отсутствием интернета, а РосТелеком как раз в это время заменил у нас телефонную линию на оптическую G-Pon, предложив заодно более дешевый и быстрый интернет. Подключение к HomeNet мы решили сохранить на всякий случай, перейдя на младший тариф.

Одновременно с этим меня начала неколько раздражать запутанность нашей домашней сети, в которой теперь болтались роутер, G-Pon модем (это 2 NAT'a на пути во внешку), файлопомойка, все остальные девайсы и два провода от разных провайдеров, которые надо было по мере необходимости перетыкать руками. Безобразие? Безобразие.

Поэтому было принято решение сделать полноценный сервер, который будет выполнять функции роутера, файл-сервера, принт-сервера и заодно балансировать нагрузку между двумя провайдерами. При этом было выдвинуто три требования:

  1. Максимально тихий.
  2. Недорогой, верхняя планка бюджета — 6000 рублей на все.
  3. Возможность постепенного апгрейда железа в перспективе.

На данный момент могу сказать, что с некоторыми оговорками цель была успешно достигнута, но подробнее об этом в следующем посте.

С днем программиста!


Поздравляю, коллеги, с профессиональным праздником!

Не буду долго перечислять пожелания — всё всем и так понятно :-) Ну а кому все же хочется пожеланий — добро пожаловать на Хабр, по такому случаю там целых два топика: первый и второй. А для тех, кому не лень пошевелить мозгами, там же есть набор праздничных головоломок. Сумеете решить?

Возвращаясь к пожеланиям, я пожелаю лишь одно: не пускайте корни в своей берлоге. Она хоть и уютная, но за ее пределами есть много интересного!

MODX Library - в Open Source!


Alek$ ср, 31/08/2021 - 23:45

MODXКак я и планировал, я начинаю по-тихоньку публиковать полезные наработки, использованные мною в phpBB Constructor. Сегодня черед, пожалуй, наиболее важной из них — это MODX Library.

MODX Library — это библиотека, обеспечивающая автоматическую обработку инструкций по установке модов в формате MODX. Идейно этот формат является развитием патчей со значительно расширенным набором операций, удобных при установке модов. В настоящее время подавляющее большинство модов для phpBB3 распространяется именно в этом формате. MODX Library практически полностью реализует поддержку последней версии стандарта MODX 1.2.5, отличия от стандарта описаны в README файле.

Замечу, что именно с этой библиотеки началась работа над phpBB Constructor в начале февраля 2010 года. Впрочем, история разработки конструктора — это отдельная и местами поучительная тема, которой я коснусь как-нибудь в другой раз.

Идеологическим предшественником этой библиотеки была другая моя, гораздо более ранняя разработка под названием Lite MOD Parser, занимавшегося теми же задачами, но только для более раннего формата MOD, популярного в эпоху phpBB2. Сейчас эта штука может быть полезна разве что в исторических целях, а тогда планировалось ее использование в претензиозном проекте Web Update, призванном накорню автоматизировать обновление сайтовых движков. И, вероятно, будь у меня тогда больше настырности и опыта, из этого чего-нибудь бы и вышло :-)

phpBB Constructor


Alek$ пт, 12/08/2021 - 19:57

Пришло время представить широкой публике проект, над которым я работал все последнее время. Знакомьтесь,

phpBB Constructor

Вводная

phpBB — один из самых лучших open source движков для создания форумов. На нем работают сотни тысяч конференций, многие из которых обладают впечатляющей функциональностью. И несмотря на то, что в базовой комплектации phpBB3 предоставляет практически все, что может понадобиться для создания форума, его истинная сила в модах, написанных сообществом. В настоящий момент только в его официальном каталоге модификаций зарегистрирован 431 мод разной сложности. И еще больше можно найти на форуме, в разделе бета-версий.

Однако, несмотря на усилия phpBB Group, установка модов по-прежнему является непростой задачей для людей, далеких от IT (снобы от phpBB в этом месте замечают, что это как естественный отбор: не справились с установкой мода — нечего вам вообще администрированием форума заниматься, а фрилансеры начинают тонко намекать на свои услуги). Установка модов вручную требует усидчивости и внимательности, а AutoMOD справляется не со всеми модами (и хорошо, если он сам где-нибудь свалится, хуже, если он мод установит, а проблемы обнаружатся недели через три, когда уже и непонятно, откуда у них корни). Кроме того, поиск нужных модов, при условии, что сам толком не знаешь, что ищешь, остается хитрым и увлекательным квестом.

Эпоха сборок

Проблемы, описанные мною, стары как мир phpBB2. На пике популярности phpBB стали появляться команды энтузиастов, которые вручную делали сборки дистрибутивов phpBB2, включающие в себя более или менее широкий набор модов, совершенно необходимых по мнению авторов сборки. Самым известным проектом из этой серии был, наверное phpBB Plus, впечатлявший новичков симпатичной модификацией subsilver и полусотней модов на борту.

Однако, и здесь были свои проблемы. Это и задержки с выходом обновлений (пока команда сборки накатит все новые моды на новую и протестирует, долгая песня...), это и разногласия по набору модов в сборке (на всех не угаодишь), это и "левые" сборки с незаметными бекдорчиками на борту и масса других сложностей.

С выходом phpBB3 количество активно поддерживаемых сборок существенно сократилось благодаря богатому функционалу базового дистрибутива и скорому релизу официального AutoMOD'a, но несколько проектов все же осталось на плаву.

Сделай сам!

И вот тут-то на сцену выходит phpBB Constructor. Он позволяет самому выбрать состав сборки, которая вам нужна из предлагаемого набора модов, а так же указать нужные вам локализации. После чего эта сборка будет автоматически создана на основе свежайшего дистрибутива phpBB3 и отдана вам :-)

Таким образом, Конструктор выигрывает и у готовых сборок "от умельцев", поскольку вы можете сами выбирать состав сборки, и у упомянутого AutoMOD'a: в него включены моды, решающие наиболее распространенные проблемы, и они заранее протестированы на работоспособность и совместимость. В результате, вы в несколько кликов получаете хороший базовый набор модов, и при желании можете так же расширить его самостоятельно после установки форума.

Я записал небольшой скринкаст, демонстрирующий работу с phpBB Constructor:

 Участие - приветствуется

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

А пока лишь приведу список наиболее интересный фитч, которые я планирую сделать:

  • Собственные профили сборок, с возможностью генерации пакетов автообновлений.
  • Форма предложения модов и сообщения о выходе новой версии мода, чтобы мне было проще поддерживать моды в актуальном состоянии.
  • Разбивка модов по категориям.
  • Рекомендуемые моды.
  • Генерация инструкций по модификации нестандартных стилей.
  • Авотматический скрипт для установки на нестандартные стили.

Есть в планах еще и много менее заметных улучшений, которые перечислять не имеет особого смысла.

Кроме того, я и сообщество phpBB в целом будем благодарны, если вы примете участие в локализации модов из Конструктора для разных языков.

Open Source

Я давно являюсь сторонником open source, и потому планирую как можно больше наработок, вошедших в phpBB Constructor, передать phpBB-сообществу. Сюда относятся и сердце конструктора — MOD Library, и все правки, которые мне приходится вносить в моды для обеспечения совместимости, и другие вспомогательные инструменты. Кроме того, есть публично доступная Зона 51 зона разработки, в которой каждый может наблюдать за ходом разработки и репортить баги.

PS. Europe — The Final Countdown

Обработка множества исключений: решение


Немного позже, чем думал (что простительно, ибо дни выдались хлопотные) привожу свои варианты решения упражнения, которое я озвучил в предыдущем посте. Условие повторять не буду, по приведенной ссылке все описано.

Решение 1, читерское.

В условии было сказано, что надо обрабатывать исключения в методах init(), run() и shutdown(). И хотя это явно не оговаривалось, по логике функционирования эти методы вызываются подряд. Следовательно, можно сделать так:

Ну или, чтобы не нарушать инкапсуляцию, этот код можно завернуть в статический метод в ApiDispatcher.

Достоинства решения:

  • простота;
  • минимум дублирования кода;
  • локальность модификации кода.

Недостатки:

  • жестко привязываемся к сценарию последовательного вызова методов init(), run(), shutdown(), в реальной жизни может потребоваться вызывать их из разных частей приложения в разные моменты времени;
  • метод-обработчик исключений должен очень многое знать обо всех возможных исключениях, при появлении нового исключения придется править метод-обработчик.

Решение 2, логичное.

Следующее решение приходит в голову практически сразу после прочтения условия, и оно действительно хорошо подходит для решения задачи.

Именно его в комментариях предложил Vladimir Rusinov, за что ему спасибо:

Достоинства решения:

  • простота,
  • независимость от мест вызова методов (то есть, их не обязательно вызывать подряд),
  • минимум дублирования кода,
  • локальность правок.

Недостатки решения:

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

Решение 3, хитрое.

Это решение в конечном итоге я и использовал в своем проекте. Сначала я приведу код, а потом дам дополнительные комментарии:

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

В PHP все исключения имеют по умолчанию два поля (есть и другие, но они нас не интересуют): $message = null и $code = 0, сообщение и код ошибки соответственно. Во всех наших исключениях мы переопределяем значение по умолчанию для кода ошибки, чтобы оно соответствовало типу исключения.

Теперь, когда мы создаем исключение, мы можем задать ему сообщение, которое описывает причину его возникновения, и, если надо, можем уточнить и код ошибки. Если же мы сообщение вручную не зададим - оно будет получено через класс Errors. В случае, если мы поймаем "не наше" исключение (типа простого Exception), у него код ошибки будет 0, и класс Errors успешно опишет его как "Unknown exception".

Достоинства решения:

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

Недостатки решения

  • требуется дополнительная логика для прерывания обработки, если упадет init(), либо проброс исключения дальше,
  • нелокальность правок при внедрении решения (надо проставить коды ошибок всем существующим исключениям),
  • менее тривиальное решение,
  • возможны сложности в случае, если есть исключения, которым нельзя переопределить код ошибки.

Итоги

Я привел целых три решения задачи и видно, что ни одно из них не является безоговорочно правильным. А это значит, что даже такая простая задача, как описано в этом упражнении, требует внимательного анализа требований к системе и ваших возможностей, как ее разработчика. В моем случае решение 3 оказалось наименьшим злом, и я использовал его. Но запросто может оказаться, что в другой ситуации оптимально "наивное" решение 1.