Оригинал блога, который вы сейчас читаете, имеет идеальный рейтинг PageSpeed 100 / 100. (По крайней мере, на момент написания статьи.) Это не хвастовство, а совсем наоборот. Оказывается, достичь этого вообще не трудно. Просто хостите статическую страницу с простыми стилями, и этого достаточно. Статическую страницу создать довольно просто. Ты выпускаешь
index.html
и отправляешь её по проводам. Можно изощриться и генерировать её при помощи фреймворка, как я делаю в случае Astro. Но смысл моего поста не в этом.Смысл фразы хостить статическую страницу в слове хостить. Эта страница хостится на Raspberry Pi 4b, находящемся у меня дома. Устройство обеспечивает превосходную скорость, почти ничего не стоит и имеет бесконечные возможности бесплатного расширения. В этом посте я расскажу, насколько просто было всё настроить. И о том, насколько потрясающий, по моему мнению, опыт разработки это даёт.
Зачем?
Я долгое время пользовался NextJS и хостил созданные с его помощью приложения на AWS с серверами Express. Однажды я заметил, что мои серверы «раскаляются докрасна», хотя почти ничего не делают, а время отклика становилось огромным. В результате анализа выяснилось, что библиотека привела к огромному снижению производительности, не отловленному тестами. Почему? Потому что бенчмарки использовали только собственную инфраструктуру Edge компании Vercel (разработчика NextJS). А баг возникал везде, кроме этой инфраструктуры. Тогда это сильно меня поразило. Мне нужен был альтернативный независимый хостинг, чтобы сообщество не зависело от одного поставщика услуг. И так я решил, что буду хостить своё приложение на собственном сервере.
Так что же нужно для хостинга собственной страницы? Сервер, способ развёртывания страницы и домен.
Сервер
Меня вполне уже устраивала моя домашняя система:
- электричество
- оптоволоконный Интернет (300 Мбит) с резервным LTE-подключением.
- дешёвый блок бесперебойного питания для продолжения работы в случае отключения питания (которое за прошлый год случалось всего один раз, так что, возможно, это уже перебор).
Подведём итог: моя система разработки была спроектирована таким образом, чтобы позволить мне работать без помех. Для системы с домашним сервером мне не хватало только… сервера.
Вдохновлённый @JeffGeerling и его видео о создании Pi Cluster, я примерно за $60 купил с рук Raspberry Pi 4b 4GB. Разумеется, существуют альтернативы этому устройству, но у меня уже было одно такое и оно работало почти год буквально с нулевым даунтаймом. Я ни разу не отключал его и не перезапускал. Я использовал его в качестве Pi Hole. Оказывается, в 21-м веке его даже можно обновлять без даунтайма. Моя оценка: 10 / 10. Если вам нужен домашний сервер, просто купите это устройство.
Моя текущая система с Raspberry Server
Развёртывание
Теперь у меня был сервер, но как настроить его для работы с моим приложением? Я посмотрел, как обычно поступают люди, и быстро заметил, что для запуска приложения на устройстве потребуется примерно десять сложных и долгих этапов. Настройка Nginx, Capistrano или похожий инструмент для автоматизации развёртывания (запуска новых версий и завершения старых), SSL Certs (потому что уже никто не пользуется http), а если вы хотите докеризировать проект, то требуется всё, что связано с Docker, например, Kubernetes, который сам по себе крайне сложен. То есть у меня возникли большие проблемы. Я попробовал способ с Kubernetes, который был слишком сложным для блога, и сдался. Аналогично, решение bare metal, состоящее из nginx с ручной настройкой сертификатов Let’s Encrypt, показалось мне слишком замороченным. Поэтому я отказался от этой идеи. Несколько месяцев спустя в процессе чтения Reddit я обнаружил Coolify.
Он позиционировался как более простая и ориентированная на веб версия CapRover, который сам по себе является опенсорсной альтернативой Heroku. Я давно находился в экосистеме Ruby on Rails, поэтому Heroku был для меня лучшим выбором (пока не становился чрезмерно затратным). Как только я увидел Coolify, то понял, что именно с его помощью создам свою домашнюю систему! Тем же вечером я протестировал его. На всю настройку с нуля понадобился примерно час:
- запись свежего образа системы RPi OS на SD-карту при помощи
rpi-imager
с конфигурацией ssh и Wi-Fi - установка системных обновлений
- выполнение скрипта установки Coolify
- перезапуск
- готово
Потом я запустил дэшборд Coolify и был потрясён. Это действительно похоже на более быструю и простую версию Heroku.
В качестве тестового проекта я решил попробовать настроить свой блог, который в то время работал на Cloudflare Workers. Я выбрал образ Static Page и спустя ещё несколько кликов плюс
git push
моё приложение было развёрнуто и заработало на моей Berry. Это заняло около пяти минут, и, наверно, было проще, чем развёртывать блог на Heroku. После эксперимента я решил развить идею и поделиться своим блогом с миром.Дэшборд Coolify
Домен
Находясь в восторге, я купил домен (
grifel.app
) на Google Domains. Я пользуюсь им, потому что там есть все расширения наподобие app и dev, нет особой маркетинговой чуши и предоставляется простая, но полнофункциональная панель администратора.Итак, настало время подключить мой локальный сервер, но увы, возникла проблема. При присвоении домену IP-адреса я вспомнил, что у меня нет статического IP-адреса. Как и большинстве квартир, у меня был динамический адрес. (Для незнакомых с концепцией динамических внешних IP скажу, что модем назначает мне новый IP-адрес при перезапуске или отключении от сети.)
К счастью, я уже решал такую проблему. В детстве, когда я хостил собственный сервер MU Online, мне не хватало статического IP. И чтобы открыть сервер публике, я использовал Hamachi! Это работает следующим образом: каждые X секунд, когда сервер подключен к Интернету, он отправляет информацию о вашем текущем IP сервису DDNS (Dynamic DNS). В худшем случае при изменении вашего IP-адреса после истечения X секунд ваш сервер информирует DDNS, и тот перенаправляет трафик на новый IP. Оказалось, что в Google Domains эта функция даже встроена! Я установил инструмент DDClient, который Google рекомендует использовать в своей документации, и настроил его со своими учётными данными. Весь процесс занял около десяти минут. Я получил информацию о том, что всё заработало, посмотрев на запись DDNS в панели администратора Google Domains. Она обновлялась с моим текущим IP.
Затем я вернулся на панель Coolify и настроил домен https://blog.grifel.app в качестве FQDN своего приложения. Подождал тридцать секунд, и вуаля — мой блог доступен по этому адресу. С работающим https. Это было какое-то волшебство. Десять лет назад именно благодаря подобному был так удобен Heroku. Сегодня всё это можно сделать в собственной системе всего за несколько кликов.
Заключение
Рейтинг Page Speed по-прежнему равен 100 / 100, поэтому похоже, что моя система достаточно быстра и я не испортил UX. За последний месяц аптайм составил 100%, но это, конечно, не навсегда, и в худшие моменты вам придётся жить без моего великолепного блога около часа, но, надеюсь, вы это переживёте. Блог хостится на Raspberry Pi 4b 4GB, поэтому если кто-то захочет провести DDOS, то, вероятно, я этого не переживу. Сервер расположен в Варшаве, так что я не на edge рядом с вашим домом, но, думаю, это не будет проблемой. Чтобы добраться до некоторых пользователей, пакетам придётся путешествовать через весь мир, но свет достаточно быстр. Впрочем, для устранения всех этих проблем я в любой момент времени смогу использовать CDN.
Ценой всех этих проблем я имею собственную платформу в духе Heroku, конвейер автоматического развёртывания, даже с ветками разработки новой функциональности. Над этим приложением может работать команда из ста человек, и мне не придётся ежемесячно платить им даже $5, чтобы получить доступ к логам. Я могу напрямую вносить вклад в него и расширять любым нужным мне способом. Буду ли я хостить на нём свой будущий бизнес? Наверно, нет. Я по-прежнему выберу AWS или подобное решение, чтобы просто избежать проблем, которые могут испортить мне жизнь совершенно неожиданным образом. Но, честно говоря, мой эксперимент заставил меня серьёзно задуматься над этим.
Для тех, кому интересны эксплуатационные затраты на эту систему: около $60 на Raspberry Pi (единовременная покупка) + электричество (меньше $1 в месяц) + $10 в год за домен (который мне всё равно был нужен). То есть не больше чем $2 в месяц, если у вас дома уже есть Интернет.
Комментарии (25)
RealBeria
12.05.2023 12:38+3$60 за Raspberry Pi 4b 4Gb это даже не удачная покупка, а прямо подарок..
isden
12.05.2023 12:38+1На фото rpi без радиатора на проце. Оно же греется как незнаю что О_о
mxr
12.05.2023 12:38+1Как не знаете, что?
isden
12.05.2023 12:38+1Это риторический вопрос?
У меня на такой же rpi как у автора, с "дефолтным" радиатором (где-то 1см высотой) температура в покое быстро поднимается до 80-90С, если не обдувать вентилятором.
Aquahawk
12.05.2023 12:38+1вот вертикально закреплённая raspberry 3b+ с радиатором которая ничерта не делает при окружающей температуре 25 градусов. На проце с радиатором около 45, на usb контроллере даже с радиатором 48. Если загрузить, да поставить как у автора стопкой, можно и в троттлинг уйти
dreesh
12.05.2023 12:38+4эти платы делали как игружки, а вы хотите гонять их как полноценые компуктеры) у них (на сколько я знаю) даже загрузчик через
задний проходgpu работает.Aquahawk
12.05.2023 12:38+4эти игрушки отлично работают у меня в домашней автоматизации годами.
dreesh
12.05.2023 12:38имхо: вопрос о внезапной смерти платы в таких режимах работы не стоит игнорировать. У вас должна быть запасная плата для оперативной замены вышедшей из строя. Если конечно она не рулит чем то, что не столь важно и можно пожить без автоматизации, но тогда "игрушечность" только подтверждается. Для критических вещей стоит глобально переработать наспех сделаную прошивку (изначальная прошивка это тяп ляп) и найти в ней косяки (если жесткий режим работы по ее вине, иначе искать замену платы полностью)
Aquahawk
12.05.2023 12:38да, запас лежит, пока убил только две причем сам знаю как убил при разработке, более того флешки в ридонли, разворот скриптами. Буквально недавно земенял один щит, так тупо собрал новый, флешку переставил из старого и запустил с первого раза.
DeepHill
12.05.2023 12:38А не подскажите какое это устройство вы использовали как тепловизор?
Aquahawk
12.05.2023 12:38Infiray t2l. Доволен как слон. Советую брать сразу с ручкой. Брал тут. https://m.aliexpress.ru/item/1005002666504540.html
Из минусов t2l - максимальная температура 120 градусов, но мне хватает.
Куча народу почему-то смотрят на t2s, но мне t2l понравился гораздо больше, особенно тем что у него есть полноценная фокусировка, причем прекрасно факусируется в макро, разглядывать платы одно удовольствие. Сразу рекомендую смотреть разные приложения типа xtherm infrared, hti image, inficam, и на 4pda сравнивать разные версии, там разные плюшки есть. Чувствительность великолепная, но абсолютные температуры модет врать достаточно сильно, как измерительный прибор не особо пригоден. Использую в паре с пирометром.
hippoage
12.05.2023 12:38Спасибо за найденную статью)
Как железо можно присмотреться к Orange Pi R1 Plus LTS: новый (легко купить без поисков б/у) безвентиляторный с корпусом стоит 2.9тр с Али. Нужно только блок питания добавить (можно взять от старого телефона, если там разъем usb, т.к. мало требуется). Он слабее, но и ест меньше. Мощности на статику должно хватить.
Бесперебойник вряд ли нужен, но это у кого как.
Но на практике VPS 200р/мес именно для хостинга сайта выглядит лучше (туда и кулифай можно поставить).
Дома лучше хостить что-то вместо SaaS-решений. Например, Nextcloud или Gitea. При это уже что-то на x86 лучше: мощнее и точно ПО запустится. У меня, например, не запустился офисный редактор под ARM в Nextcloud.
diakin
12.05.2023 12:38+2Эхх...
csharpreader
12.05.2023 12:38Вы куда-то не туда стучитесь: Grifel
P.S. Оригинальная статья написана в феврале (Self hosting in 2023 - Grifel ),
возможно, с тех пор автор просто изменил адреса своих страничек, убрав blog.
johnfound
12.05.2023 12:38Самая большая проблема в самостоятельном хостинге не сам сервер. Его как раз просто сделать и настроить. Даже если и не просто, вся работа так или иначе зависит от вашего умения и знаний.
Но все равно в конце все упирается до домейна и до DNS сервера, которого вы сами не можете хостить. И надо кому-то платить и соответственно от него зависеть.
Все DDNS серсисы которые я знаю бывают или платными и цены практически как если покупаем минимальный хостинг или хостят только их субдомейны. А иногда и то и другое вместе.
Этот GoogleDomain который цитируется доступен только в ограниченное количество стран. И не из за каких-то санкции. Я живу в ЕС, но нет, недоступен и все.
Единственный бесплатный DDNS хостинг, который у меня как-то более-менее работает, это https://duckdns.org но они тоже предоставляют только субдомейны.
dreesh
12.05.2023 12:38+2У любого регистратора есть dns в котором можно прописать CNAME запись со ссылкой на субдомен (еще вроде можно ссылки на конкретные страницы прописывать у клоудфары). Дальше вопрос в том позволяет ли оператор пробрасывать порты 80 и 443 на домашнем роутере.
johnfound
12.05.2023 12:38Только если есть статический IP адрес. У моего регистратора менять IP можно только вручную и минимальное время обновления 2 часа. Для DDNS не подходит вообще.
dreesh
12.05.2023 12:38У вас есть 2 "dns-имени" один это ddns 2-го уровня (A запись на пример на no-ip с серым ip и временем обновления записи 5 мин), а другое имя в dns вашего регистратора и там нужно указать CNAME запись.
еще раз:
1) no-ip ddns запись A с серым ip например johnfound.ddns.net=225.225.225.14
2) у регистратора доменна 1 уровня в dns запись типа CNAME например johnfound.com=johnfound.ddns.net
у меня все нормально работало, но мой оператор блочит все порты ниже ~5600.
kmeaw
12.05.2023 12:38Cloudflare и dns.he.net всё ещё бесплатные. В первом случае можно даже ничего не делать с DDNS - достаточно либо IPv6 адреса на upstream-сервере, либо запущенного cloudflared для реверс-проксирования.
dreesh
12.05.2023 12:38he и cloudflare уже давно не дружат, для получения реверса нужно будет еще с админами договориться
На форуме he есть несколько тем по этому поводу, если кратко то he блочит всю подсеть ipv6 у cloudflare
Зы: они оба не бесплатные, это оба транзитные брокеры и им платят операторы за трафик.
kmeaw
12.05.2023 12:38+1Я именно про dns.he.net, а не про tunnelbroker.com - с последним, действительно, будут проблемы со связностью, приходится использовать других брокеров. Но cloudflared позволяет эти проблемы обойти по IPv4, даже если машина находится за NAT.
AVX
12.05.2023 12:38Интересно. Когда-то давно, примерно в 2008 году, делал сайт и игровой сервис на своëм домашнем ПК (включен был круглосуточно). Да, это работает быстро, и рейтинг у гугла быстро рос. Но надо платить за статический адрес, надо за электричество, и что самое проблемное - приходилось самому следить за софтом, уязвимостями и разбираться со всякой гадостью типа сканирования, ддосами, и попытками взломов. Стоит выпустить комп напрямую в интернет - логи пухнут моментально, там постоянно кто-то что-то сканит. В таком режиме меня хватило на пару лет, и я сайт отдал на хостинг - стало проще, уже следил только за используемыми движками и самописными страницами своими, и боролся со всякими спамерами. Ну и лет 10 он на хостинге и прожил. Да, это интересно, но требует времени и постоянного внимания, а лучше ещë и мониторинг какой-то.
MountainGoat
Есть такая штука, Docker-Compose называется...