[Перевод] Превращаем старый телефон на Android в веб-сервер
Есть ли у вас старый телефон на Android? Наверняка есть! В мире накопилось безумное количество всевозможного электронного мусора, и в среднем гражданин развитой страны меняет телефон каждую пару лет, поэтому старые телефоны, вероятно, один из самых распространённых видов электронных отходов.
У меня залежался собиравший пыль старый Motorola G5 Cedric, поэтому я решил сделать с ним что-нибудь, и теперь на нём работает веб-сервер Puma с простым веб-приложением на Sinatra.
Возможно, вы зададитесь вопросом: в чём реальная, практическая польза всего этого? Производительность старого телефона на Android, наверно, не будет особо высокой, впрочем, как и у всех этих t2.nano
. Я пока не разворачивал на Android никакого «реального» кода, но даже у дешёвых и старых телефонов сегодня есть четырёхъядерные или даже восьмиядерные ЦП, не менее 2 ГБ ОЗУ, поэтому, теоретически, телефон должен быть близок (хотя бы примерно) к самым скромным облачным решениям IaaS (например, у t2.nano
всего 512 МБ). Разумеется, в телефоне стоит процессор ARM, а в IaaS обычно установлены x86; управление памятью тоже совершенно различается, но тем не менее, мы ведь говорим о приблизительном сравнении.
Как бы то ни было, в этой статье я приведу краткий туториал по превращению устройства на Android в веб-сервер, или даже в любое количество других устройств.
1. Установка Termux
Первым делом нужно настроить в телефоне окружение Linux. Termux — это эмулятор терминала и окружение Linux для Android. Его можно установить из Google Play Store. После установки не требуется никакая дополнительная настройка.
2. Настройка SSH
На крошечном сенсорном экране вводить кучу команд неудобно, поэтому давайте настроим ssh, чтобы можно было входить в Termux удалённо.
Существует множество способов сделать это, но мне кажется, проще всего использовать ПО Dropbear:
Выполните на Android следующие команды:
pkg upgrade
pkg install dropbear
Можно использовать парольную аутентификацию или аутентификацию публичным ключом. Вам следует использовать аутентификацию ключом, но для тестирования больше подходит пароль.
Выполните на Android следующие команды:
passwd
New password:
Retype new password:
New password was successfully set.
Бонусные очки: установите мультиплексор терминалов, например, tmux
или screen
. Это сильно упростит вашу жизнь при выполнении команд через ssh:
pkg install tmux
Теперь протестируем подключение на настольном компьютере:
ssh android-ip-address -p 8022
3. Настраиваем статический IP-адрес на Android
Зайдите в настройки WiFi, отключите DHCP и назначьте телефону IP-адрес.
Это необходимо, чтобы ваш роутер каждые несколько часов/дней не назначал телефону новый IP-адрес, что сильно бы усложнило бы конфигурирование.
4. Установка Ruby, Bundler, Sinatra и Puma
Sinatra — это легковесный фреймворк веб-приложений, а Puma — веб-сервер.
Ruby — это… Ruby!
Разумеется, Sinatra и Puma — это лишь моё предложение, вы вполне можете использовать на телефоне полнофункциональные Rails, как написано в этом качественном туториале. Только не используйте WEBRick — находящийся в разработке веб-сервер Rails по умолчанию; он однопроцессный, однопоточный, а потому не подходит для продакшена (но вполне хорош для небольших экспериментов).
Выполните на Android следующие команды:
pkg install ruby
gem install sinatra puma
Установка nginx
nginx — это веб-сервер, обратный прокси-сервер и балансировщик нагрузки. Хотя он наиболее полезен в многосерверных системах, где используется для распределения запросов по разным инстансам, в нашей системе его тоже будет полезно использовать из-за встроенной защиты от DDoS и статического обслуживания файлов.
Выполните на Android следующую команду:
pkg install nginx
Теперь немного сложная часть, мы будем настраивать nginx для работы с Puma. Неплохим началом может быть этот gist — скопипастите nginx.conf
и смените appdir
на корневой каталог вашего веб-приложения. Например, в моём случае это будет /data/data/com.termux/files/home/android-sinatra
.
Настройка переадресации портов
Вероятно, вы захотите, чтобы ваш веб-сервер был доступен через Интернет, поэтому необходимо настроить в роутере переадресацию портов, чтобы перенаправлять входящие запросы к вашему публичному IP-адресу на новый веб-сервер на Android.
Этот процесс зависит от конкретной модели роутера. Здесь представлен неплохой вводный туториал.
Настройка динамического DNS
У большинства людей публичные IP-адреса являются динамическими. В таких случаях полезно настроить сервис динамического DNS (DDNS), предоставляющий статическое доменное имя, автоматически выполняющее перенаправление на текущий публичный IP-адрес.
Сегодня есть несколько бесплатных сервисов, предоставляющих DDNS; я пользуюсь no-ip и пока меня он вполне устраивает. Однако каждый месяц нужно «обновлять» свой домен.
После настройки DDNS необходимо настроить и свой роутер, чтобы он периодически уведомлял сервис DDNS о текущем IP-адресе. Этот процесс тоже зависит от модели роутера.
Hello world!
Puma и nginx, запущенные на Motorola G5.
Под осадой
Вы можете имитировать реальное использование сервера при помощи ПО для тестирования http-нагрузки siege
. Ниже показан скриншот siege
, запущенного для моей системы с тремя одновременными пользователями (при реальных тестах используются более серьёзные значения):
На переднем плане работает siege; на фоновых терминалах логи nginx.
Числа на скриншоте не особо важны, поскольку наше веб-приложение передаёт простой стосимвольный ответ с меткой времени, но этого достаточно, чтобы понять, что сервер может справляться хотя бы с несколькими одновременными пользователями.
Эпилог: безопасность
Если вы смотрели сериал «Мистер Робот», то знаете, что Интернет может быть опасным местом. И это ещё более справедливо, если у вас есть открытый в Интернет веб-сервер.
Всего за несколько часов после открытия сервера на него уже залезли всевозможные штуки. Большинство было безобидными индексирующими роботами, но некоторые точно не такие хорошие, например, эти два запроса:
Большинство из этих запросов кажется нормальным, но два красных — это, скорее всего, какая-то атака.
То есть вывод здесь такой: обновляйте всё ПО, следите за логами доступа и, возможно, изучите руководства по безопасности nginx, например, это и это.