Перейти к основному содержимому
cutty.dev
All posts

Технологический стек cutty.dev — осознанный выбор

Что лежит в основе cutty.dev и почему. Без евангелизма — философия: скучный, стабильный стек, хостинг в ЕС и приватность, заложенная в архитектуру, которую один человек способен поддерживать.

Большинство записей «мой tech stack» — это гордый список новинок. Смотри, у меня есть это, у меня есть то, а вот еще совсем свежая библиотека с прошлой недели. Этот будет другим.

Потому что правда в том, что когда ты ведешь проект в одиночку, ты не ищешь самое модное. Ты ищешь то, что не разбудит тебя в три часа ночи. И именно в этом заключается весь этот технологический стек cutty.dev: скучное вместо модного, европейское вместо американского, приватное с самого фундамента, и достаточно простое, чтобы с этим справилась одна пара рук.

Я иду по порядку, как если бы я объяснял тебе это за чашкой кофе.

Astro рендерится на сервере (и почему не что-то «покруче»)

cutty.dev — это Astro с рендерингом на стороне сервера. Каждый запрос проходит через сервер, формирует страницу и возвращает готовый HTML. Скучно? В этом-то и суть.

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

Один файл вместо базы с фейерверками

SQLite. Одна база, один файл на диске. К этому слой запросов, взаимодействующий с TypeScript, так что если я изменю структуру данных, ошибка появится у меня в редакторе, а не на продакшене в полночь.

Почему именно это? cutty является "read-heavy". Кто-то кликает по сокращенной ссылке, мы выполняем чтение и увеличиваем счетчик. И всё. SQLite спокойно справляется с таким трафиком, вплоть до действительно больших чисел в день. А бэкап? Просто копируете файл. Конец. Без церемоний репликации, без скриптов, никто не помнит, как они работают.

Здесь будь осторожен с одним моментом, потому что это частая ловушка: люди слышат «SQLite» и думают «игрушка для учебного проекта». Это не так. Меньше движущихся частей — меньше вещей, которые могут сломаться. Это не экономия на качестве, это осознанное решение.

Сервер находится в Европе, и это не случайно

Выделенный сервер в ЕС. Собственный TLS, обратный прокси с автоматическим HTTPS, приложение в контейнерах.

Это основа того, как cutty работает с данными. Я точно знаю, где они физически находятся (для клиентов из ЕС и в рамках GDPR это не просто любопытство, а условие), я не привязан к одному поставщику, ничего не утекает автоматически за океан, а расходы предсказуемы, а не скачут вместе с трафиком.

Да, удобные платформы с Запада дали бы более быстрый старт. Кликаешь, deploy, работает. Только вот ты платишь за это тем, где приземляются данные твоих пользователей. Для меня это была плохая сделка.

Переводы делает своя собственная модель, у себя

cutty говорит на 25 языках. Это переводит локальная открытая модель ИИ, которая работает на моей инфраструктуре. Я не отправляю текст из интерфейса никакому внешнему поставщику.

Преимущества практичны. Одиночный перевод стоит ноль. У меня есть полный контроль над качеством, и я могу обновлять его когда захочу. И, конечно, машине всегда нужен человеческий глаз, поэтому каждый из этих 25 языков прошел проверку. Но тот факт, что я делаю это у себя, означает, что конфиденциальность не является пунктом в прайс-листе. Это свойство того, как все устроено.

Tailwind, контейнеры и несколько небольших решений

Стиль? Utility-first, то есть Tailwind. Без CSS-in-JS, без отдельных файлов со стилями, всё прямо в шаблонах. Я не трачу время на придумывание названий классов, неиспользуемые стили всё равно не попадают на финальную страницу, а дизайн выглядит целостным, потому что сама система это навязывает. Для одного человека важна каждая минута, не потраченная на мелочи.

Внедрение — это Docker. Та же самая среда локально и на продакшене, конец фразе «у меня работало». И если когда-нибудь возникнет необходимость, я переношу всё на другой сервер где-то за полчаса. Переносимость — это тихая форма независимости.

Какие выводы я сделал

Скучный стек побеждает. Astro, SQLite, Tailwind, контейнеры. Всё зрелое, проверенное, описанное. Ничего не ломается в тот момент, когда это меньше всего нужно.

Хостинг в ЕС готов к продакшену, правда. Сказка о том, что «ты должен перейти на большое американское облако, чтобы всё было серьезно» — это просто сказка. Локальный AI тоже реален, не нужно отдавать данные внешнему API, чтобы получать приличные переводы. И последнее: один человек может выпустить то, что выглядит как работа целой команды. Нужно только помнить, что время дороже денег, и под этим углом подбирать каждый кирпичик.

Когда вы создаете что-то свое, задавайте себе один вопрос при использовании каждой технологии: смогу ли я через год поддерживать это самостоятельно? Если нет, то, пожалуй, у вас есть ответ.

Все это работает здесь: cutty.dev. А если вы хотите обсудить какое-либо из этих решений, пишите на [email protected], я отвечаю в тот же день.