habrahabr

Необычные способы хостинга

  • четверг, 6 марта 2025 г. в 00:00:16
https://habr.com/ru/companies/ruvds/articles/887446/


Где разместить сайт? Оказывается, для хостинга необязательно покупать VPS или домашний сервер. Можно поступить более креативно: например, захостить сайт на смартфоне. Причём желательно извлечь из него аккумулятор, чтобы смартфон работал напрямую от сети. А есть ещё более оригинальный вариант: бесплатный хостинг в социальных сетях.

Сайт на хостинге Bluesky


Bluesky — это децентрализованная социальная сеть с 30 млн пользователей, альтернатива твиттеру (Х), с мостом в телеграм и другими интересными фишками. Внешне выглядит примерно как твиттер, только без рекомендаций:



Приложение спроектировано без единого центра управления, его не может контролировать ни одна компания. Очевидно, идея появилась после того, как Илон Маск купил твиттер.

Bluesky изначально стремился использовать существующую P2P-экосистему в интернете:



В децентрализованной сети у каждого пользователя своё приложение в своём «персональном дата-сервере» PDS (Personal Data Server). У этих хостов/контейнеров есть уникальные URL типа morel.us-east.host.bsky.network. Хосты общаются по протоколу AT Protocol. Подписка на других пользователей аналогична RSS-подписке. И главное, что домены (аккаунты) пользователей обладают портативностью, то есть владелец может «уйти» в другую соцсеть, сохранив подписчиков. Портативность аккаунтов в децентрализованной сети — главная особенность AT Protocol.

Bluesky — это юридическое лицо типа Public Benefit LLC (PBLLC), то есть некоммерческая корпорация, которая декларирует основной целью принесение пользы обществу. Сотрудники компании являются её совладельцами.

Недавно один из пользователей Bluesky нашёл способ эксплуатировать AT Protocol не по назначению, а именно — для хостинга сайтов. Вот пример сайта, который размещается на хостинге Bluesky. Правда, он представляет собой всего лишь одну страничку с парой сотен байт текста. Но интерес представляет сам факт, что такое возможно:



В своём блоге автор подробно разъясняет, как он «хакнул» Bluesky, а точнее AT Protocol (хак был этичный, с предварительного уведомления администрации Bluesky).

▍ Хостинг произвольных блобов


Личный PDS (Personal Data Server) пользователя размещается на хостинге Bluesky и работает по протоколу AT Protocol. Прямой доступ к PDS возможен через точку входа PDS Entryway по уникальному адресу типа morel.us-east.host.bsky.network.

Каждый пост, который создаёт пользователь в Bluesky — это на самом деле комбинация записей и блобов, которые он загружает в свой контейнер PDS. Блобы — это любые медиафайлы, которые туда можно загружать, они хранятся отдельно от записей. Согласно спецификации, это могут быть файлы любого формата, которым присваиваются уникальные адреса в виде контент-хеша (CID).

Типы постов определены в лексиконе Bluesky (app.bsky.*), а типы записей — в лексиконе AT Protocol (com.atproto.*). Спецификация разрешает создание записей любого типа, определённого в лексиконе или подсхеме. В свою очередь, блобы закачиваются на сервер заранее, помещаются во временное хранилище, но становятся доступными только после появления ссылки на блоб в записи.

Для публикации контента в PDS сначала нужно получить токен аутентификации:

curl -X POST 'https://bsky.social/xrpc/com.atproto.server.createSession' \
-H 'Content-Type: application/json' \
-d '{"identifier": "'"$BSKY_HANDLE"'", "password": "'"$BSKY_PWD"'"}'

Поле accessJWT field из ответа в дальнейшем будет использоваться как $ACCESS_JWT.

Для закачки блоба в репозиторий используется метод com-atproto-repo-upload-blob. Контент сайта — это простой файл index.html.

<h1>This Website is Hosted on Bluesky</h1>

<p>
This website is just a blob uploaded to Bluesky via the API. Curious about how
this works? Check out the write-up on <a
href="https://danielmangum.com/posts/this-website-is-hosted-on-bluesky/">danielmangum.com</a>.
</p>

Для его закачки используется следующая команда:

curl -X POST 'https://bsky.social/xrpc/com.atproto.repo.uploadBlob' \
-H 'Authorization: Bearer '"$ACCESS_JWT"'' \
-H 'Content-Type: text/html' \
--data-binary '@index.html'

Ответ:

{
  "blob": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq"
    },
    "mimeType": "text/html",
    "size": 268
  }
}

Возвращаемый $link можно использовать в качестве идентификатора (cid) для вызова блоба с помощью метода getBlob.

curl -L 'https://bsky.social/xrpc/com.atproto.sync.getBlob?did='"$DID"'&cid='"$LINK"''

Чтобы этот блоб стал доступен, на него нужно сослаться в какой-нибудь записи. Например, можно добавить в пост встроенное изображение, для валидации указав mimeType как image/jpeg.

В коде AT Protocol можно посмотреть, как конкретно протокол определяет ссылки на блобы в записи.

Важно отметить, что он поддерживает подключение новых лексиконов. Например, мы можем создать запись нового типа com.danielmangum.hack.website, включив в неё ссылку на закачанный блоб HTML:

curl -X POST 'https://bsky.social/xrpc/com.atproto.repo.createRecord' \
-H 'Authorization: Bearer '"$ACCESS_JWT"'' \
-H 'Content-Type: application/json' \
-d '{
  "repo": "danielmangum.com",
  "collection": "com.danielmangum.hack.website",
  "record": {
    "$type": "com.danielmangum.hack.website",
    "website": {
      "$type": "blob",
      "ref": {
        "$link": "bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq"
      },
      "mimeType": "text/html",
      "size": 268
    }
  }
}'

{
  "uri": "at://did:plc:j22nebhg6aek3kt2mex5ng7e/com.danielmangum.hack.website/3lbnguuzckm2u",
  "cid": "bafyreicjcptshc7lmgb7abxlvcb5fmqqjdj6neie23szyum7rcaowmm5qm",
  "commit": {
    "cid": "bafyreid6apjjy56xoyenxmg5xv356twh22n3hayecoxlf6mflpltlzpuwu",
    "rev": "3lbnguuzmd42u"
  },
  "validationStatus": "unknown"
}

И всё, после этого блоб доступен для просмотра даже неаутентифицированными пользователями, то есть кем угодно:

curl -L 'https://bsky.social/xrpc/com.atproto.sync.getBlob?did='"$DID"'&cid=bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq'

<h1>This Website is Hosted on Bluesky</h1>

<p>
This website is just a blob uploaded to Bluesky via the API. Curious about how
this works? Check out the write-up on <a
href="https://danielmangum.com/posts/this-website-is-hosted-on-bluesky/">danielmangum.com</a>.
</p>

Сайт открывается в браузере как положено. С одной стороны, AT Protocol здесь используется не по назначению. С другой стороны, в будущем его вполне могут приспособить для этой цели. Свободная и открытая платформа хостинга PDS, которая включает не только личные контейнеры для социальных сетей, но и личные сайты пользователей, почему нет. То есть личные сайты и вообще произвольные бинарные файлы могут стать частью личных контейнеров PDS. Это до сих пор не разрешено исключительно из соображений безопасности.

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

Повторим, что хакер перед публикацией эксперимента уведомил администрацию Bluesky, и они были не против. Это даёт основания полагать, что данная функциональность рассматривается не столько как баг, а скорее как фича.

Домашний сервер на телефоне Android


Современные телефоны с гигабайтами оперативки и сотнями гигабайт флеш-памяти отлично подходят для хостинга сайтов, тем более что многие смартфоны работают в режиме постоянного соединения с интернетом. Однако стоковая версия Android почему-то не разрешает такую функциональность. Но это можно исправить, если установить на телефон Linux и контейнеры Docker, с которыми распространяется практически любое ПО. Отличная альтернатива Raspberri Pi и хороший способ утилизировать старые телефоны.

В этом руководстве разъясняется, как установить postmarketOS (дистрибутив Linux на базе Alpine) на смартфон. Руководство актуально для совместимых моделей. На персональном компьютере должны присутствовать Fastboot (скачать в составе SDK) и файлы boot и img для PostmarketOS. На смартфоне требуется предварительно включить режим разработчика (Developer Mode) и USB-отладку (USB Debugging).



Файлы boot и img от PostmarketOS скачиваем для конкретной модели смартфона.

Потом действуем согласно пошаговой инструкции:

  1. Войти в режим Fastboot
  2. Записать PostmarketOS на телефон в соответствии с инструкциями для конкретной модели телефона
  3. После перезагрузки ввести дефолтный пинкод 147147
  4. Открыть консоль на смартфоне и ввести следующие команды:

    sudo apk update

    sudo service sshd start

    sudo rc-update add sshd



  5. Подключиться к телефону с компьютера по SSH:

    ssh user@IP_Address_of_the_phone

  6. Установить Docker на телефон:

    sudo apk add docker

    sudo service docker start

    sudo rc-update add docker default

  7. Можно установить Portainer для управления контейнерами:

    sudo docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

  8. Запустить докер-контейнеры с необходимым софтом, в том числе для сервера

Затем можно подключиться к сервису Portainer на телефоне с компьютерного браузера по адресу и порту IP_телефона:9443. С компьютера удобно управлять контейнерами на смартфоне:



Вторая часть руководства посвящена тому, как извлечь аккумулятор, чтобы смартфон работал напрямую от электрической сети. Дело в том, что встроенный аккумулятор не даёт телефону работать от сети, а вместо этого непрерывно заряжается и разряжается сам. Это представляет опасность, потому что аккумулятор нагревается и может вздуться, тем более у него ограниченный ресурс на количество циклов заряда/разряда. В общем, его лучше извлечь.



Смартфон без аккумулятора питается от сети через модифицированный кабель USB-C, который обманывает встроенную систему управления питанием. Если аккумулятор удалён, то в таком режиме смартфон может работать практически вечно.

Несколько шагов по удалению аккумулятора и переделке контура энергопитания:

  1. Аккуратно извлечь аккумулятор, не повредив микросхему Battery Management System (BMS), к которой он подключён



  2. Спаять простую цепь с диодом MUR460 и кабелем USB-C




  3. Подключить цепь к телефону, вставить кабель USB-C в разъём. Если всё работает нормально, можно залить конструкцию клеем для надёжности



  4. Установить серверный софт. В докер-контейнерах можно поставить что угодно: веб-сервер, торрент-клиент для скачивания файлов, медиасервер для раздачи файлов на домашние устройства, персональное облако для резервного копирования и прочих нужд (вроде Nextcloud)


Некоторые меры предосторожности и правила безопасности:

  1. Перед операцией полностью разрядить аккумулятор для минимизации рисков
  2. Аккуратно обращаться с ним, избегая проколов или других повреждений
  3. Начинать операцию только при полной уверенности в своих силах, а также при наличии профессиональных инструментов

Хостинг сайтов на смартфоне удобен, но не лишён недостатков. К сожалению, у большинства смартфонов отсутствует порт Ethernet, так что приходится работать по WiFi, что снижает надёжность и привносит лишнюю задержку в передачу пакетов. Отсутствует нативная поддержка внешних накопителей SSD, HDD и NAS, так что их приходится подключать через ненадёжные USB-переходники.

Но это всё равно отличный способ использовать старые телефоны вместо того, чтобы их выбрасывать.

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻