Привет, Хабр! Мне 14 лет, и пока мои ровесники ругаются в cs2, а нормальные люди спят по 8 часов, я решил, что мне катастрофически не хватает стресса в жизни. Поэтому за последний месяц я написал собственную платформу для решения алгоритмических задач - с изолированным выполнением кода, микросервисами и котиками.
Встречайте - ЛитКот. Проект уже крутится в проде на leetcot.ru, а в этой статье я расскажу, как организовать архитектуру такого сервиса, не задохнуться в монорепе и защитить сервер от мамкиных хакеров (вроде меня самого).
Зачем нужен ещё один тренажёр?
LeetCode - это классика, но давайте честно: решать сухие задачи про инверсию бинарного дерева бывает невероятно скучно. Особенно когда на реальном собеседовании тебя попросят просто отцентрировать div или переложить JSON из одной апишки в другую. Мне захотелось добавить геймификации, сюжета и немного (а точнее, нездорово много) безумия.
Например, в моём курсе «Щёлкаем алгоритмы как рыбку» нет унылой задачи «Поиск элемента в отсортированном массиве». Зато есть «Прятки с сосиской»! Пользователю нужно написать алгоритм бинарного поиска за O(log n), чтобы помочь коту найти сосиску в контейнерах. Согласитесь, ради виртуальной сосиски писать код как-то приятнее, чем ради мифического оффера в бигтех.

Выполнение кода: даём пользователю гранату (и надеемся на лучшее)
Самое весёлое в разработке аналога LeetCode - это запуск чужого кода. Разрешить случайным людям из интернета выполнять Python-скрипты на твоём сервере - это как добровольно пригласить в дом полтергейста. Один случайно (или специально) запущенный while True: fork() - и твой сервер со слезами отправляется в Вальгалу. Я это узнал не из книжки — во время разработки умудрился положить собственный тестовый сервер именно так. Сидел и смотрел как он перестаёт отвечать, пока до меня дошло что происходит.
Пришлось продумать надёжную изоляцию процессов. Код каждого пользователя выполняется в изолированной песочнице со строгими ограничениями по памяти и жёстким тайм-аутом. Не успел найти сосиску вовремя - лови Time Limit Exceeded и иди оптимизируй. У нас тут суровый кошачий киберспорт.

Инфраструктура, или «Я у мамы DevOps»
Чтобы проект не жил только на моём localhost, я настроил полноценный CI/CD-пайплайн в GitHub Actions. Проект пакуется в Docker-контейнеры с аккуратным Dockerfile и .dockerignore, чтобы случайно не утянуть в прод папку node_modules весом с небольшую чёрную дыру.
Для удобной разработки настроены DevContainers - настраивать локальное окружение руками каждый раз это для слабаков.
А чтобы после моих гениальных релизов не отваливались вёрстка и логика, прикручены E2E-тесты на Playwright. Да, я даже пишу тесты. Сам в шоке.
name: Deploy Production on: release: types: [published] jobs: deploy: runs-on: self-hosted steps: - name: Cleanup host run: | docker system prune -af --volumes sudo journalctl --vacuum-size=10M sudo apt-get clean - uses: actions/checkout@v4 - name: Environment run: | [ -f /home/user1/actions-runner/secrets.env ] && cp /home/user1/actions-runner/secrets.env ./.env || exit 1 - name: Update and Deploy run: | docker compose pull docker compose up -d --remove-orphans - name: Migrations run: | docker compose exec -T app pnpm --filter @repo/db exec prisma migrate deploy
Что дальше?
Месяц плотного кодинга на энтузиазме дал свои плоды. Проект работает, пользователи могут учить алгоритмы, а котики находят свои сосиски.
Но почивать на лаврах скучно. Прямо сейчас я готовлю к релизу следующий проект -и это будет кое-что большее чем просто тренажёр задач. Следите за leetcot.ru и arlist.ru.
Буду рад конструктивной критике (и неконструктивному хейту) в комментариях. Пишите, как вы реализовывали безопасное выполнение кода в своих пет-проектах, ставьте плюсики и буду рад увидеться с вами вновь!
Комментарии (9)

Apokalepsis
22.06.2026 10:35Можно попробовать прикрутить выполнение в serverless, тогда безопасность будет по умолчанию.

Koteukin
22.06.2026 10:35Очень круто! Мне 16, у меня даже есть парочка успешных релизов в прод, но твой проект круче их всех.
Учитывая то что у меня пока особо нету опыта, критиковать твой проект мне кажется как минимум не вежливо, да и для твоего возраста проект такого уровня это невероятно.
Хотел проголосовать за пост, но из-за маленькой кармы хабр не позволил это сделать. Завтра вернусь и обязательно проголосую.

Koteukin
22.06.2026 10:35Полазил по сайту. Есть несколько моментов которые я заметил:
1. На основной странице появляется горизонтальный скролл, можно пофиксить добавлением overflow-hidden на первый section или div внутри, возможно это костыль.
2. При решении задачи при изменении текстового поля теряется выделение (вероятно проблема с неправильным использованием MonacoEditor), проблема повторилась и на Chrome и на Firefox.Так-же, если проект опенсорс могу стать контрибьютером и фиксить разные баги)
Ещё парочка советов для развития проекта, возможно они не прям простые, но реально могут полезными для многих:
1. Добавь локализацию сайта (а позже задачь) на английский и возможно другие языки
2. Добавь разные языки программированияСам пользуюсь neovim как основным редактором, так что мне очень понравилось что ты добавил vim motions :)

Koteukin
22.06.2026 10:35Ещё ошибка, при попытке регистрации через Arlist ID появляется ошибка
redirect_uri did not match any of the client's registered redirect_urisС регистрацией по паролю проблем нет

Koteukin
22.06.2026 10:35Ещё есть не критичная ошибка в решениях, при сохранении решения по умолчанию в кодовых блоках стоит ts
Так-же смена темы не работает почти для всего сайта. Для меня лично это не критично (так как сам пользуюсь тёмной темой), но всё равно забавный баг
(Если что всё это не критично, сайт реально классный, просто пишу баги которые сам заметил)
janvarev
Лайк за идею и реализацию в 14 лет (серьезно, это очень круто). Квазиминус за нейросгенеренный текст (квази - потому что самостоятельно писать прилично в 14 лет дофига редкий навык).
Про поиск сосиски - имхо идея хороша для возраста разработчика, а, как ни странно, взрослым людям уже удобнее видеть типовые "найдите в массиве А число бинарным поиском" - меньше когнитивная нагрузка. Втыкать в сосиски в 40+ уже не очень хочется - и так общаешься с ЛПР, и у каждого уникальная сосиска (нет).
Вангую: к 23 будете прям хорошим разработчиком (тем более AI-paired programmers нужны), но денег вам платить много не будут, и вы будете спрашивать "почему". К 35 годам разберетесь, и денег станет больше :)
Koteukin
Я искренне не понимаю как вы понимаете используется ли ИИ в написании постов или нет. Учитывая то что я вижу обвинения в использовании ИИ почти под каждым постом, мне больше кажется это парраноей чем объективной критикой. Лично тут я вижу больше проработанный пост чем ИИ-слоп (второе я сам замечал), возможно ему помогали писать пост родители или администраторы хабра.
Так-же года 2 назад (как раз примерно лет в 14 лет) в своих постах (я вёл канал по разработке в телеграмме) я часто ставил эмодзи перед каждым абзацем, только сейчас понимаю как это выглядело по ИИ-шному, но я это делал сам и даже не задумывался об ИИ (хоть они тогда и начинали хайповать, но я их честно не использовал).
Ну и в целом мне лично переодически говорили что стиль моего общения похож на ИИ-шный.
janvarev
Насмотренность. В данном случае характерные обороты самокритики и описания проектов (типа "X это вам не хухры-мухры"). Могу ошибаться, конечно. Но заодно прогнал через Яндекс детектор (по одним очень хорошим обсуждениям у него реально хороший детектор) - получил то же самое.
Ваш коммент очевидно не нейросетевой - тоже по куче оборотов.
И да, на всякий случай - конкретно в данном случае я не считаю это чем-то криминальным; повторюсь, в 14 лет не уметь писать крутые статьи это более чем норма (я даже себя немного помню), а описать проект хочется. Вот когда такое же начиная с 20-25 лет - это уже не хорошо, там уже оценивается и умение написать текст тоже.
Автору в любом случае успехов, да и вам (по комментарию ниже вам 16) - тоже; писать проекты и быть на Хабре в таком возрасте - круто, без сарказма.
PS: Вот правда, не обижайтесь, что вас немного оценивают согласно возрасту - считайте, что это как битвы в разных весовых категорях. Ну не бьются люди 60 кг vs 120 кг обычно. Для тимлида 35-40 лет сделать такой сервис, ну... не очень круто, правда, по ряду причин. Для 14-16 лет - правда достижение.