Есть категория людей, которые особо ценят надёжность, стабильность, безопасность и свободу информации. Наверное, именно такие люди поднимают медиасерверы Plex и Jellyfin, запускают ноды Bitcoin, мосты Tor,
инстансы Mastodon и Matrix,
приложения YunoHost, VPN-узлы
Tailscale и так далее. Это как бы естественный процесс.
Децентрализация, пиринг, автономность, самохостинг — вот основные принципы. Максимальная независимость от условий окружающей среды, государств, банков и прочих внешних факторов. Когда у вас надёжный фундамент под ногами и суверенная автономность с финансовой независимостью, то проблемы сторонних сервисов уходят на второй план. Конечно, сбои в их работе неприятны, но не критичны, если предусмотреть запасные варианты.
У обывателей часто возникает вопрос: наверное, это очень трудно? Поднять свои серверы? На самом деле сложность задачи часто переоценивают. Давайте посмотрим на примере простого веб-сервера.
Самый простой веб-сервер — это вообще
одна строка в консоли вроде такой:
Самый простой домашний NAS —
старый смартфон или одноплатник за пять долларов с подключённым HDD/microSD/SSD/etc. Так что ничего сложного.
Ещё один пример минимализма. Одноплатник ZimaBoard (разработка: апрель 2022 года) — простой домашний сервер на архитектуре x86 (Intel). Хотя можно собрать NAS ещё дешевле на базе RPi
Веб-сервер — это просто скрипт
Интересный пример веб-сервера из скриптов —
Sherver. Это довольно навороченный и многофункциональный веб-сервер на чистом Bash, в каком-то роде улучшенная версия
bashttpd.
Сервер состоит из нескольких скриптов. Первый из них —
./sherver.sh. Чтобы поднять Sherver, клонируем репозиторий и запускаем
./sherver.sh. На старте можно указать рабочий порт:
./sherver.sh 8080 (по умолчанию такой и стоит).
И всё. После этого в браузере открываем
http://localhost:8080/ — и всё работает. Сайт грузится из html, картинок и других ресурсов, которые мы закинули в папку
/files.
То есть вся концепция веб-сервера — это простая, даже примитивная вещь. Суть в том, что если кто-то стучится к нашему компьютеру по порту 8080, то открываем соединение и выдаём файл (или другой контент, например, результат исполнения любой программы в
stdout). Вот что такое сервер в данном контексте.
Если вам говорят, что поднять веб-сервер сложно, просто покажите ему такой скрипт. Для работы Sherver в системе должны присутствовать следующие инструменты:
envsubst, если хотите использовать шаблоны
socat для работы сервера (можно и netcat, но он не очень хорошо справляется с параллельными HTTP-запросами)
Sherver работает по протоколу HTTP 1.0 и лучше всего подходит для выдачи нескольких страничек по внутренней сети. Конечно, он не выдержит очень большую нагрузку и его обязательно нужно прикрыть файрволом, который предотвращает вторжения извне.
Строго говоря, Sherver вообще не следует показывать в интернет, потому что добром это точно не закончится, ведь, по сути, мы передаём консоль системы в браузер клиента.
Его можно использовать или как экстренную «заглушку» в специфических ситуациях (см. ниже про историю создания), или как сервер во внутренней сети, закрытой снаружи. Например, в домашней или корпоративной сети.
Некоторые особенности Sherver:
не нуждается в конфигурировании: просто добавляем файлы в папки scripts и folders;
отдаёт любые HTML-страницы, независимо от сложности, в том числе со сложным JavaScript и множеством скриптов или файлов для загрузки;
отдаёт файлы (текстовые или бинарные, картинки) с корректным MIME-типом;
поддерживает динамические страницы;
поддерживает шаблоны HTML, чтобы не дублировать заголовки и футеры;
парсит URL-запросы;
поддерживает GET и POST;
работает с кэшем клиента;
легко расширяется:
запускает любые скрипты или исполняемые файлы любых языков (через stdout);
для удобства поставляется с библиотекой баш-функций.
Основные ограничения:
поддержка только HTTP GET и POST запросов, хотя остальные тоже можно добавить;
отсутствие параллелизма;
если страница должна загрузить много файлов, файлы отправляются один за другим;
если на сайт заходят два пользователя, второму нужно подождать, пока обслужат первого;
Автор Sherver и сам в каком-то смысле хакер, поэтому неоднократно предупреждает пользователей ни в коем случае не открывать этот сервер в большой интернет, только в локалку. Для интернета лучше запустить тот же
nginx, там гораздо больше скриптов на все случаи жизни (шутка).
История создания
История создания этого веб-сервера
довольно любопытная. Автор работал консультантом в сторонней компании, можно сказать, хакер-фрилансер — и его срочно вызвали к клиенту, у которого взломали веб-сайт и разместили в форме регистрации на деловую конференцию голую модель в шляпе. Во время расследования пришлось действовать в спешке, люди непрерывно звонили в офис, жалуясь на эротику. Поэтому хакер быстро отключил сервер от сети. А затем поставил вместо него маленькую «заглушку», чтобы народ вместо онлайн-регистрации просто звонил по телефону:
HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
Content-Length: 216
Connection: close
Server: brad
<!doctype html><html><head><title>Conference</title></head><body><h1>Conference Registration</h1><p>The registration system is down for maintenance. Please call 1-800-123-4567 to register.</p></body></html>
В принципе, можно сделать ещё проще:
while :; do nc -l 80 < conference.txt; done
И это всё.
Оказалось, полезная штука. Подобная заглушка спасла в экстренной ситуации. А иногда больше ничего и не надо. Так и родился проект
Sherver.
Ещё одна похожая разработка —
Bash-web-server. Это примерно то же самое, что и Sherver, только без зависимостей, то есть без использования дополнительных утилит типа
socat и
netcat.
На своём хостинге можно поднять почтовый сервер типа Gmail. В этой
пошаговой инструкции утверждается, что процедура занимает всего 30 минут (домены у приличного человека есть заранее, то есть регистрировать ничего не надо). Это не так сложно,
как многие думают.
mkdir mail
cd mail
DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/docker-compose.yml"
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh
./setup.sh help
docker run --rm -v "/mnt/volume_lon1_01/config/:/tmp/docker-mailserver/" docker.io/mailserver/docker-mailserver setup email add <user@domain>
Настроить DKIM и DMARC
Говорят, что опенсорсная программка
Rspamd фильтрует спам не хуже, чем «AI-инфраструктура» всяких Gmail'ов.
Есть и другие нюансы по установке. Но в целом в прошлые времена без контейнеров всё это было
намного сложнее.
Необязательно всё держать прямо у себя дома, можно для некоторых модулей использовать и стороннюю инфраструктуру. Но со своим доменом можно легко менять почтовых провайдеров, если что.
Свой DNS-сервер
В принципе, на своём компьютере можно поднять
даже полноценный DNS-сервер. Не так легко придумать, зачем он может понадобиться обычному человеку. Но вот крупные компании и провайдеры часто запускают DNS-серверы в корпоративной сети по многим причинам, в том числе для безопасности.
Интересно, что некоторые платные DNS-провайдеры предлагают услуги по «пробиву китайского файрвола». Дело в том, что из-за фильтрации трафика для пользователей изнутри Китая увеличивается задержка при доступе к ресурсам «снаружи». Поэтому западным компаниям предлагается конкретная услуга
Managed DNS for China.
Ещё одна причина установки DNS-сервера — туннелирование IPv4-трафика (см.
iodine). Например, если файрвол жёстко блокирует трафик, но при этом разрешает доступ к DNS, то можно использовать такой хак.
Полная минификация сайта
Если всерьёз поднимать минимальный веб-сервер на собственном хостинге, то это будет самый простой сайт без всяких изысков. Возможно, даже упакованный в один HTML-файл, см. нашу прошлую статью
«Простые сайты снова в моде. Минимализм возвращается».
Есть хорошие инструкции по
полной минификации сайта, включая картинки, CSS, шрифты, JavaScript и так далее.
Вообще, минификация рекомендуется для сайтов любого типа. С одной стороны, на разные клиентские устройства можно выдавать разный контент, в зависимости от размера экрана и скорости соединения. С другой стороны, можно выдавать
всем минимальную версию сайта. Это лучше, чем потерять хотя бы одного посетителя, который не увидит контент из-за плохого качества связи.
Самые простые, но эффективные оптимизации:
перекодировать картинки в WebP (особенно 24-битные PNG)
убрать неиспользуемые CSS и JavaScript (инструмент Coverage в Chrome DevTools)
Помните
Picasa? Великолепное нативное приложение для работы с фотоархивом. До сих пор ни одна программа даже близко не приблизилась к Picasa по функциональности. Что с ней стало? То же самое, что с тысячами других приложений примерно в то же время. Разработку
прекратили ради облачной альтернативы (в данном случае Google Photos).
То есть программное обеспечение, которое мы использовали на своих компьютерах просто «переехало» в облако. Это имеет смысл с точки зрения корпорации, которая стремится сократить издержки, упростить обновления, а также привязать пользователей, взяв их файлы в «заложники». Программисты высочайшего класса работают над одной задачей — максимизация прибыли корпораций от рекламы. Их цель — привлечь ваше внимание и удержать его с помощью персонализации контента и психологических манипуляций.
Но в итоге может получиться так, что под контролем человека
ничего не остаётся. Файлы, деньги, имущество — всё это может исчезнуть за одну секунду по решению третьих лиц.
По факту это происходит уже сейчас. В вашей коллекции видео на YouTube или песен на Spotify иногда просто исчезают файлы. Потом файлы начнут исчезать в бэкапах и на мобильных устройствах, которые синхронизированы с облаком. Сам аккаунт могут заблокировать, хотя вы ничего плохого не сделали. В интернете
полно таких историй. Не говоря уже о блокировке доступа к сайту со стороны третьих лиц, которые действуют через вашего интернет-провайдера. Это крайне неприятная ситуация.
Вот почему нужен собственный сервер с избыточным бэкапом. Пусть даже в подвале, но свой.
События вокруг показывают, что никакой стабильности нет. А может, никогда и не будет. Сплошной хаос, где никому нельзя доверять. Только себе.
Люди скажут вам спасибо за сервер, файловый архив и бэкапы, когда в очередной раз начнут растерянно метаться после потери связи/аккаунта/файлов/денег, как это неоднократно происходило в последние десятилетия.