Давненько меня мучила одна идея — а не написать ли мне собственный веб-сервер? Что-то вроде ДЗЕНа, только без дядьки с палкой, который будет тыкать меня по пальцам и говорить: «Вот тут нельзя, а вот это удалите». Хочу быть полноправным хозяином своего царства контента, публиковать что душе угодно (естественно, в рамках закона) и не бояться получить «по шапке» от платформы. Ну и заодно понять, как всё это работает изнутри. В конце концов, опыт бесценен — особенно если он сопровождается чашкой крепкого кофе и парой нервных тиков.
Начал я с самого простого: залез в личный кабинет Ростелекома и подключил опцию получения IP-адреса. Теперь у меня есть уникальный адрес в интернете — почти как почтовый индекс, только для моего сервера. В качестве железа решил использовать маленькую коробочку, которую купил полгода назад для всяких экспериментов. Коробочка лежала без дела, как забытый пульт от телевизора на диване после новогодних праздников. По характеристикам она ничуть не хуже стартовых виртуальных машин из дата-центров типа Selectel или FirstVDS — то есть вполне себе боец.
На эту коробочку поставлю Arch Linux без графического интерфейса. Потому что графика — это для слабаков! Бэкенд напишу на FastAPI (я же Python люблю), базу данных возьму Postgresql, а фронтенд сделаю на Angular. Звучит круто? Да я сам пока не знаю, как оно получится на выходе — главное начать! Начинаю с минимально работающего бэкенда на своей основной машине и хочу получить к нему доступ через IP Ростелекома.
Но вот загвоздка: Ростелеком IP-адрес в личном кабинете почему-то не показывает. Чтобы узнать его, надо либо лезть в панель управления роутером (там так запутано, что кажется: «А может мне лучше сразу позвонить маме?»), либо запускать какой-нибудь тестер скорости интернета. Вот вам лайфхак: если роутер напоминает машину времени из 90-х — не удивляйтесь!
Поскольку я фанат Python и FastAPI мне очень нравится (прям как котикам молоко), решил использовать UV — Universal Virtualenv. Это такой менеджер пакетов и проектов для Python на Rust’е от компании Astral (которые сделали линтер Ruff). Представьте себе: Rust настолько быстр, что даже моя бабушка успела сварить борщ быстрее, чем UV установился! Я никогда раньше с ним не работал — значит будет весело.
Устанавливаю UV командой sudo pacman -S uv (потому что Arch Linux любит порядок), создаю новый проект ARTICLES (ну раз статьи будут). И тут появляется структура проекта — такая красивая штука, что хочется её обнять и плакать от счастья.
Для начала ставлю fastapi[standard] через uv add «fastapi[standard]», редактирую main.py так, чтобы при обращении к эндпойнту возвращался IP того устройства, которое делает запрос. Hello world? Нет уж! Пусть будет hello интернет! Активирую виртуальное окружение source .venv/bin/activate и запускаю сервер командой fastapi run main.py.
Сижу довольный дома с ноутбуком — зашел на сервер по локальной сети — работает! Но когда пытаюсь зайти извне через интернет… 404! Сервер виден пингом, но страница недоступна. Тут включается классический момент: надо настроить роутер Ростелекома так, чтобы он пропускал запросы внутрь домашней сети.
Роутер оказался таким топорным по дизайну и функционалу, что я сразу вспомнил старый анекдот про программиста:
— Почему программист всегда путает Хэллоуин и Рождество?
— Потому что OCT 31 = DEC 25!
Я давно мечтал создать свой собственный веб-сервер, где я был бы полноправным хозяином своего контента без страха перед ограничениями платформы. Идея использовать маленькую коробочку для этого проекта, аналогично стартовым виртуальным машинам из дата-центров, кажется удачной и экспериментальной. План по использованию Arch Linux, FastAPI, Postgresql и Angular для бэкенда и фронтенда звучит амбициозно, и я не теряю надежды, что этот проект принесет мне не только ценный опыт, но и удовлетворение от создания чего-то собственного.