Что ж, хочу наконец показать масштабное обновление своего сайта — l4zzur.top. Открывать лучше с пк, поскольку мобильная версия не имеет двух приколюшек.

Переделывать я его начал в 20-х числах декабря и финальный вариант дизайна был реализован хоть и не сразу, но в целом концептуально идея закрепилась довольно быстро, а уже потом пошли всякие хотелки, навороты и финтифлюшки. В дизайне я, естественно, не сильно понимаю с точки зрения проектирования, а посему пользовался благами больших языковых моделей.

Изначально этот проект был моим вторым исключительно на Svelte 5, но затем захотелось создать что-то типо небольшой админской панели и была задействована моя любимая связка FastAPI (как веб фреймворк), Pydantic (валидация и сериализация), SQLAlchemy + SQLite (БД). В общем, теперь это полноценный фуллстек. Заодно пока всё это реализовывалось, я ещё разобрался и с поднятием Telegram бота через вебхук (и для локальной отладки нашёл Pinggy — аналог ngrok), и с auth code flow и обновлением токенов у spotify (для виджета плеера).

По сути, это уже третья версия сайта, первая была вообще скопированным и немного адаптированным одностраничником, вторую я решил быстренько переделать чисто визуально в прошлом году, ну а сейчас решил заморочиться посильнее и уже закрыть этот вопрос надолго.


Помимо обновления самой страницы, я решил ещё перенести всё на совсем отдельный сервер, чтобы заодно поиграться с инфраструктурой и другими селфхост сервисами. Собственно, что я себе заприметил:

  • Vaultwarden. Опенсорсная неофициальная реализация Bitwarden, совместимая с официальными, но для мобилки я использую Keyguard. Представляет собой хранилище паролей и пасскеев. Раньше я пользовался KeePassXC, но меня очень сильно утомила вечная локальная синхронизация через Syncthing.
  • Memos. Максимально простой и лёгкий сервис заметок, не требующий никакой настройки из коробки. Для андроид так же нашёлся удобный и красивый клиент — Moe Memos.
  • Linkding. Минималистичный и лёгкий сервис для создания и ведения закладок. Имеет браузерное расширение, возможность настройки архивирования как через archiveorg или серверный дамп с помощью singlefile-cli и chromium, так и клиентский автоматический с помощью расширения SingleFile.
  • RustDesk. Лёгкая и опенсорсная замена AnyDesk/TeamViewer.

Кроме каких-то бытовых и полезных в жизни сервисов, я для себя ещё открыл и несколько более прикладных с точки зрения девопса:

  • Caddy. Более удобная и минималистичная альтернатива nginx (от синтаксиса которого лично у меня иногда возникает паническая атака). Умеет автоматически генерировать сертификаты LetsEncrypt, в том числе и через Cloudflare, возможность добавлять плагины через сборку своего Dockerfile.
  • Dozzle. Простой, но в то же полезный мониторинг контейнеров и их логов. Позволяет проверять статусы контейнеров, метрики, имеет распределения по Docker Compose, возможность создания простых уведомлений по логам или метрикам/
  • VoidAuth. Простой (сколько я раз уже это слово написал?) и дружелюбный к новичкам SSO провайдер. Позволяет очень легко интегрировать в свои приложения (если они, конечно, поддерживают SSO или хотя бы oauth) вход через один аккаунт. Не нужно запоминать кучу паролей и вечно за ними лезть.

Заодно я ещё немного переработал свой цифровой сад как в плане внешнего вида, так и причесал свои кастомные компоненты для изображений, навёл порядок в организации файлов, прикрутил внезапно обнаруженную ленту последних записей и RSS. Но а самое важное и чем я горжусь — получилось наконец-то прикрутить Instant View для него!

Поскольку официально шаблоны для сайтов, видимо, вообще никто даже не проверяет и не одобряет (я отправил его ещё в мае 2025), то я решил поискать, а не пытался ли кто-то обойти эту проблему. И как оказалось пытались! Как минимум существует плагин для Wordpress, а процесс его создания и работы был описан на хабре. По сути, весь смысл бубна заключается в том, что нужно чтобы контент был завёрнут в вёрстку определённой структуры. То есть, просто подсунуть телеграму (а он ходит на сайт с юзерагентом TelegramBot (like TwitterBot)) другой шаблон. В случае с Wordperss автор просто отдаёт буквально контент завёрнутый в другой шаблон, но к моему случаю это неприменимо — весь мой контент генерируется через Quartz в обычную статику. Следовательно, надо каким-то образом на лету подменять статику.

Недолго помучавшись с поиском и с нейронками, я наткнулся на OpenRestry — nginx со встроенным LuaJIT. Это позволяет создавать свои плагины на луа, которые могут прямо влиять на отдаваемый контент. Собственно, немного помучавшись с теми же нейросетками (луа для меня страшный лес и разбираться я не сильно горел желанием), но в итоге всё получилось и оно работает именно так, как я и хотел. Я доволен. Никаких кастомных ссылок, работает всегда и везде и не зависит от меня. Можете сами проверить это по посту ниже!