Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Оригинал блога, который вы сейчас читаете, имеет идеальный рейтинг 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 в месяц, если у вас дома уже есть Интернет.